1

OwnerDrawn ボタンをいくつか作成する CWnd からウィンドウを派生させました。ボタンは CButton から派生しています。

ユーザーがボタンにカーソルを合わせているときに、ボタンの 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);
}

Debugger と Spy では、コードが呼び出されていることがわかりますが、何も起こりません。私はMFC/c++に比較的慣れていないので、DCを正しく使用していないと思います..なぜそれが機能しないのか、どうすれば修正できるのか説明してもらえますか?

4

1 に答える 1

1

私のソリューションに苦労している他の人のために:

  • Button クラスにメンバー bool m_bHover = false を作成します
  • ホバー アンド リーブを追跡するための質問で提供されている OnMouseMove を実装します。
  • OnMouseHover を実装する

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

    void CFooterButton::OnMouseLeave()
    {
       m_bHover = false;
       Invalidate();
       CButton::OnMouseHover(nFlags, point);
    }
    
  • yourButtonClass::DrawItem でホバー効果を処理します (Invalidate() は、それが呼び出されることを保証します)

    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();
    }
    

注: lp-Structure には別の itemAction があります -> ODA_SELECT MSDN を参照してください https://msdn.microsoft.com/de-de/library/windows/desktop/bb775802(v=vs.85).aspx

于 2016-05-24T15:36:50.953 に答える