MFC重载鼠标停留WM_MOUSEHOVER和离开WM_MOUSELEAVE消息

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消息就可以使用了。

你可能感兴趣的:(MFC,MFC,WM_MOUSEHOVER,WM_MOUSELEAVE)