如何在鼠标上更改背景颜色悬停 c++ MFC

How to change BackgroundColor OnMouseHover c++ MFC

本文关键字:颜色 背景 悬停 c++ MFC 鼠标      更新时间:2023-10-16

>我从CWnd派生了一个窗口,在其中我创建了一些OwnerDraw按钮。按钮派生自 CButton。

现在,我想在用户将鼠标悬停在按钮上时更改为按钮的背景颜色。

因此,我已经实现了 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。有人可以解释我为什么它不起作用以及如何解决它吗?

对于其他正在为我的解决方案而苦苦挣扎的人:

  • 在 Button 类中创建成员布尔值 m_bHover = false
  • 按照问题中提供的方式实施 OnMouseMove 以跟踪悬停和离开
  • 实现鼠标悬停

    void CFooterButton::OnMouseHover(UINT nFlags, CPoint point)
    {
       m_bHover = true;
       Invalidate();
       CButton::OnMouseHover(nFlags, point);
    }
    
  • 实现鼠标离开

    void CFooterButton::OnMouseLeave()
    {
       m_bHover = false;
       Invalidate();
       CButton::OnMouseHover(nFlags, point);
    }
    
  • 在 yourButtonClass::D rawItem 中处理悬停效果(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