1. 重载OnMouseMove()消息,在消息的实现中添加代码:
void CMainWindow::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme); //结构体缓冲区大小
tme.dwFlags = TME_HOVER; //注册WM_MOUSEHOVER消息
tme.dwHoverTime = 1; //WM_MOUSEHOVER消息触发间隔时间
tme.hwndTrack = m_hWnd; //当前窗口句柄
::TrackMouseEvent(&tme); //注册发送消息
}
2.在.h文件中添加OnMouseLeave和OnMouseHover的定义
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
然后在
BEGIN_MESSAGE_MAP
END_MESSAGE_MAP()
之间添加对两个消息的声明:
BEGIN_MESSAGE_MAP(CControlButton, CButton)
//{{AFX_MSG_MAP(CControlButton)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
最后在cpp文件后面添加对两个消息的实现:
LRESULT CControlButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT CControlButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
return 0;
}
这样就可以使用
OnMouseHover
和OnMouseLeave消息了。
原理:
当鼠标停留在程序窗口一定时间后,会产生一个WM_MOUSEHOVER消息;当鼠标离开程序窗口后,会产生一个WM_MOUSELEAVE消息。
要使用这两个消息,首先需要用API函数::TrackMouseEvent来注册消息。(有说法表示要使用::TrackMouseEvent函数需要在源码中加入一个#define语句:
#define _WIN32_WINNT 0x0400
但是不加往往也能用)
由于鼠标悬停消息是在WM_MOUSEMOVE消息中进行发送的,所以首先需要在WM_MOUSEMOVE消息中注册WM_MOUSEHOVER消息:
void CMainWindow::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme); //结构体缓冲区大小
tme.dwFlags = TME_HOVER; //注册WM_MOUSEHOVER消息
tme.dwHoverTime = 1; //WM_MOUSEHOVER消息触发间隔时间
tme.hwndTrack = m_hWnd; //当前窗口句柄
::TrackMouseEvent(&tme); //注册发送消息
}
动添加WM_MOUSEHOVER和WM_MOUSELEAVE消息就可以使用了。