如何更改背景颜色 OnMouseover c++ MFC
How to change BackgroundColor OnMouseHover c++ MFC
我从 CWnd 派生了一个 Window,我在其中创建了一些 OwnerDrawn 按钮。
按钮派生自 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);
}
在 Debugger 和 Spy 中,我可以看到正在调用代码,但没有任何反应。由于我是 MFC/c++ 的新手,我假设我没有正确使用 DC。有人能解释一下为什么它不起作用以及我该如何修复它吗?
对于正在为我的解决方案苦苦挣扎的其他人:
- 在你的 Button 中创建一个成员 bool m_bHover = false class
- 按照跟踪悬停和离开的问题中提供的方法实施 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
我从 CWnd 派生了一个 Window,我在其中创建了一些 OwnerDrawn 按钮。 按钮派生自 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);
}
在 Debugger 和 Spy 中,我可以看到正在调用代码,但没有任何反应。由于我是 MFC/c++ 的新手,我假设我没有正确使用 DC。有人能解释一下为什么它不起作用以及我该如何修复它吗?
对于正在为我的解决方案苦苦挣扎的其他人:
- 在你的 Button 中创建一个成员 bool m_bHover = false class
- 按照跟踪悬停和离开的问题中提供的方法实施 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