如何在鼠标上更改背景颜色悬停 c++ MFC
How to change BackgroundColor OnMouseHover c++ MFC
>我从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
相关文章:
- 在特定时间内更改 QLabel 的背景颜色
- 更改包含 QButton 的 Qlayout 的背景颜色
- 如何为使用创建窗口创建的窗口创建自定义背景颜色
- 我正在尝试更改背景的颜色,但它不起作用
- MFC 更改 CListCtrl 背景颜色
- 如何仅设置 QTabWidget 背景颜色样式表
- 为什么不能使用 setData() 在 QTreeView 中设置单元格的背景颜色?
- 在另一个小部件中更改QWidget的背景颜色
- 同一图像中的反转文本和背景颜色
- 使用winapi使用按钮更改窗口的背景颜色
- 当在QTableView上丢失焦点时,失去背景颜色
- 当鼠标越过按钮时,我可以更改按钮背景颜色吗?
- 在加载页面时,如何为iwebbrowser2设置背景颜色
- 更改子分类Cstatic控制的背景颜色
- 使用 DirectX 11 插值背景颜色?
- 如何将控制台输出的文本颜色更改为红色,但如果从Powershell或CMD运行,背景将保持相同的颜色
- 10'000 行后控制台中的 C++ 背景颜色错误
- 如何设置按钮的背景颜色,包括复选框按钮
- 更改控制台应用的背景颜色C++
- 方法,允许我更改QwtPlot颜色背景