MFC使用TRACKMOUSEEVENT触发mouseHover和mouseLeave
2015-06-29 13:49
483 查看
为对话框添加WM_MOUSEHOVER或WM_MOUSELEAVE消息并不会响应。MFC需要特殊处理,其中一法就是使用TRACKMOUSEEVENT。
默认情况下,窗口是不响应 WM_MOUSELEAVE 和 WM_MOUSEHOVER
消息的,所以要使用 _TrackMouseEvent 函数来激活这两个消息。调用这个函数后,当鼠标在指定窗口上停留超过一定时间或离开窗口后,该函数会 Post 这两个消息到指定窗口。
使用方法
附一个例子
void CmfcDlgDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //GetDlgItem(IDC_BUTTON)->SetWindowText("Move"); if (!m_bTracking) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_LEAVE | TME_HOVER;//要触发的消息 tme.hwndTrack = this->m_hWnd; tme.dwHoverTime = 10;// 若不设此参数,则无法触发mouseHover if (::_TrackMouseEvent(&tme)) //MOUSELEAVE|MOUSEHOVER消息由此函数触发 { m_bTracking = true; } } CDialogEx::OnMouseMove(nFlags, point); } void CmfcDlgDlg::OnMouseHover(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 GetDlgItem(IDC_BUTTON)->SetWindowText("Hover"); m_bTracking = false; CDialogEx::OnMouseHover(nFlags, point); } void CmfcDlgDlg::OnMouseLeave() { // TODO: 在此添加消息处理程序代码和/或调用默认值 GetDlgItem(IDC_BUTTON)->SetWindowText("Leave"); m_bTracking = false; CDialogEx::OnMouseLeave(); }
默认情况下,窗口是不响应 WM_MOUSELEAVE 和 WM_MOUSEHOVER
消息的,所以要使用 _TrackMouseEvent 函数来激活这两个消息。调用这个函数后,当鼠标在指定窗口上停留超过一定时间或离开窗口后,该函数会 Post 这两个消息到指定窗口。
使用方法
1. 在对话框类中定义一个变量来标识是否追踪当前鼠标状态,之所以要这样定义是要避免鼠标已经在窗体之上时,一移动鼠标就不断重复产生 WM_MOUSEHOVER 。 BOOL _bMouseTrack=TRUE ;
2. 在 OnMouseMove 中调用 _TrackMouseEvent 函数 if (_bMouseTrack) // 若允许 追踪,则。 { TRACKMOUSEEVENT csTME; csTME.cbSize = sizeof (csTME); csTME.dwFlags = TME_LEAVE|TME_HOVER; csTME.hwndTrack = m_hWnd ;// 指定要 追踪 的窗口 csTME.dwHoverTime = 10; // 鼠标在按钮上停留超过 10ms ,才认为状态为 HOVER ::_TrackMouseEvent (&csTME); // 开启 Windows 的 WM_MOUSELEAVE , WM_MOUSEHOVER 事件支持 _bMouseTrack=FALSE ; // 若已经 追踪 ,则停止 追踪 } 3. 在 OnMouseLeave 中再次允许追踪鼠标状态 _bMouseTrack=TRUE ; 4. 备注:这两个消息的映射要自己写 ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) 注意:也可以用下面代码在PreTranslateMessage函数中接收,不需要自己写WM_MOUSELEASE和WM_MOUSEHOVER消息的响应函数(当然你要自己写也行): if(pMsg-> message==WM_MOUSELEAVE) AfxMessageBox( "mouse leave "); else if(pMsg->message == WM_MOUSEHOVER) AfxMessageBos("mouse leave"); return CDialog::PreTranslateMessage(pMsg);
附一个例子
.h文件加入: afx_msg LRESULT OnMouseLeave(WPARAM ,LPARAM ); afx_msg LRESULT OnMouseHover(WPARAM ,LPARAM ); .cpp文件加入: ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) LRESULT CIconButton::OnMouseLeave(WPARAM wParam,LPARAM lParam) { InvalidateRect(NULL); return 0; } LRESULT CIconButton::OnMouseHover(WPARAM wParam,LPARAM lParam) { //获取鼠标坐标 POINT point; ::GetCursorPos(&point); ScreenToClient(&point) ; //亦用如下方法,推荐.OnMouseMove 也可用. CPoint pt; pt.x = LOWORD(lParam); // horizontal position of cursor pt.y = HIWORD(lParam); // vertical position of cursor //还有如下,和上边其实是一样 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; return 0; } void CIconButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CButton::OnMouseMove(nFlags, point); TRACKMOUSEEVENT tme; tme.cbSize=sizeof(TRACKMOUSEEVENT); tme.dwFlags=TME_HOVER | TME_LEAVE; tme.dwHoverTime=HOVER_DEFAULT; tme.hwndTrack=m_hWnd; _TrackMouseEvent(&tme); }
相关文章推荐
- Visual C++中MFC消息的分类
- MFC中Radio Button的用法详解
- MFC创建右键弹出菜单的方法
- MFC中动态创建控件以及事件响应实现方法
- MFC程序对文件的处理方法
- MFC自定义消息的实现方法
- MFC之ComboBox控件用法实例教程
- MFC绘制不规则窗体的方法
- IE8引发 VS2005/2008 MFC向导出错的解决方案
- MFC实现全屏功能代码实例
- 跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
- 为非IE浏览器添加mouseenter,mouseleave事件的实现代码
- C++中MFC Tab Control控件的使用详解
- MFC程序设计常用技巧汇总
- MFC扩展DLL中导出类和对话框的实现方法
- VC中SDK与MFC的区别浅析
- VC MFC非模态对话框的实现方法
- MFC程序执行过程深入剖析
- C和MFC巧妙获取外网IP的两种实现方法
- MFC创建模态对话框和非模态对话框的方法