2016-05-24 57 views
1

私はCWndからいくつかのOwnerDrawnボタンを作成するウィンドウを派生しました。 ボタンはCButtonから派生しています。BackgroundColorを変更する方法OnMouseHover C++ MFC

今、私は自分の上にマウスカーソルを置いているときに自分のボタンのBackgroundColorに変更したいと思います。

そこで私はすでにOnMouseHover(という実装)とOnMouseLeave()メッセージが送信され得ている:デバッガとスパイで

BEGIN_MESSAGE_MAP(CFooterButton, CButton) 
    ON_WM_MOUSEHOVER() 
    ON_WM_MOUSEMOVE() 
    ON_WM_MOUSELEAVE() 
END_MESSAGE_MAP() 

void CFooterButton::OnMouseMove(UINT nFlags, CPoint point) 
{ 

    //start tracking of Hover and Leave Event 
    TRACKMOUSEEVENT tme; 
    tme.cbSize = sizeof(TRACKMOUSEEVENT); 
    tme.dwFlags = TME_HOVER | TME_LEAVE; 
    tme.hwndTrack = m_hWnd; 
    tme.dwHoverTime = HOVER_DEFAULT; 
    TrackMouseEvent(&tme); 

    CButton::OnMouseMove(nFlags, point); 
} 


void CFooterButton::OnMouseHover(UINT nFlags, CPoint point) 
{ 


    HDC hdc = *GetWindowDC(); 

    SetBkColor(hdc,RGB(54, 125, 184)); 
    CButton::OnMouseHover(nFlags, point); 
} 

を私は、コードが呼び出さなっていることを見ることができますが、何も起こりません。私は比較的MFC/C++に新しいので、私はDCを正しく使用していないと仮定します。なぜ誰かが私にそれが動作していないと私はそれを修正する方法を説明することができますか?私のソリューションを苦労している他の誰のために

+1

背景やウィンドウをペイントするときに背景色がリセットされるので、 'OnMouseHover'で背景を変更することはあまりありません。 'OnEraseBkgn'を上書きして色を設定することができます。 –

+1

@ KarstenKoopので、OnMouseHoverが呼び出されてからOnEraseBkgnを処理するときにInvalidate()を呼び出すだけで済みます。 –

+0

私は、DCを使ってボタンをオーナーのドローとして定義し、背景色をペイントする方がよいと考えています。 – rrirower

答えて

1

  • 質問で提供されるホバーを追跡し、実装
  • を残すためにONMOUSEMOVE実装メンバーブール

  • あなたのButtonクラスでm_bHover =偽の作成

    void CFooterButton::OnMouseHover(UINT nFlags, CPoint point) 
    { 
        m_bHover = true; 
        Invalidate(); 
        CButton::OnMouseHover(nFlags, point); 
    } 
    
  • OnMouseHover OnMouseLeave

    を実装> ODA_SELECT - LP-構造は、別のitemActionがありますyourButtonClass :: DrawItemで
    void CFooterButton::OnMouseLeave() 
    { 
        m_bHover = false; 
        Invalidate(); 
        CButton::OnMouseHover(nFlags, point); 
    } 
    
  • ハンドルホバー効果

    void CFooterButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    { 
        //default colors 
        COLORREF textColor = RGB(202, 228, 251), backgroundColor = RGB(84, 150, 205); 
    
        switch (lpDrawItemStruct->itemAction) 
        { 
        case ODA_DRAWENTIRE: 
         //check if the user is just hovering over the button 
         if (m_isHovered){ 
          backgroundColor = RGB(54, 125, 184); 
          textColor = RGB(255, 255, 255); 
         } 
         else{ 
    
          backgroundColor = RGB(84, 150, 205); 
          textColor = RGB(202, 228, 251); 
         } 
         break; 
    
        case ODA_FOCUS: 
         //Button was clicked incase you want to change sth OnClick 
         break; 
        } 
    
        CDC dc; 
        dc.Attach(lpDrawItemStruct->hDC); 
        dc.FillSolidRect(rect, backgroundColor); 
        dc.SetTextColor(textColor); 
    
        //your drawing code... 
        //DrawFrameControl()etc.. 
        dc.Detach(); 
    } 
    

注(無効化は、()が呼び出されますことを保証します)参照してくださいMSDN https://msdn.microsoft.com/de-de/library/windows/desktop/bb775802(v=vs.85).aspx

+1

'itemAction'は異なるフラグの組み合わせです。 'if(lpDrawItemStruct-> itemAction&ODA_DRAWENTIRE)'をチェックする必要があります(ボタンの場合は常にtrueです)。また、より良い応答のために 'tme.dwHoverTime = 10;'に変更してみてください。 'OnMouseHover'では、連続したInvalidate呼び出しを減らすために' if(!hover){hover = true; Invalidate();} 'に変更します... –

関連する問題