VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1824|回复: 1

[交流] 让窗口捕获并响应WM_MOUSEHOVER和WM_MOUSELEAVE消息

[复制链接]
51_avatar_middle
最佳答案
79 
online_admins 发表于 2014-11-17 14:56:39 | 显示全部楼层 |阅读模式
当鼠标停留在程序窗口一定时间后,会产生一个WM_MOUSEHOVER消息;当鼠标离开程序窗口后,会产生一个WM_MOUSELEAVE消息。那如何才能使窗口响应这两个消息呢?按下面的步骤,即可让指定的窗口能捕获并响应WM_MOUSEHOVER和WM_MOUSELEAVE消息了:
1、在窗口类的头文件中添加:
  1. afx_msg   void   OnMouseHover();
  2. afx_msg   void   OnMouseLeave();
  3. BOOL   m_bTrackLeave;   // 捕获设置标记
复制代码


2、在窗口类的cpp文件中添加:
  1. void   CXXXWnd::OnMouseHover()
  2. {
  3.           MessageBox( "鼠标已进入 ");
  4.           m_bTrackLeave = FALSE;
  5. }

  6. void   CXXXWnd::OnMouseLeave()
  7. {
  8.           MessageBox( "鼠标已离开 ");
  9.           m_bTrackLeave = FALSE;
  10. }
复制代码


3、用ON_MESSAGE添加消息映射:
  1. ON_MESSAGE( WM_MOUSEHOVER, OnMouseHover )
  2. ON_MESSAGE( WM_MOUSELEAVE, OnMouseLeave )
复制代码


4、在OnMouseMove响应函数中,调用_TrackMouseEvent(),设置捕获WM_MOUSEHOVER和WM_MOUSELEAVE消息请求:
  1. void  CXXXWnd::OnMouseMove(UINT   nFlags,   CPoint   point)  
  2. {
  3.         if (!m_bTracking)
  4.         {
  5. //   鼠标移入窗时,请求WM_MOUSEHOVER和WM_MOUSELEAVE 消息
  6.                 TRACKMOUSEEVENT tme;
  7.                 tme.cbSize = sizeof(tme);
  8.                 tme.hwndTrack = m_hWnd;
  9.                 tme.dwFlags = TME_LEAVE|TME_HOVER;
  10.                 tme.dwHoverTime = 1;
  11.                 m_bTracking = _TrackMouseEvent(&tme);
  12.         }

  13.       CWnd::OnMouseMove(nFlags,   point);
  14. }
复制代码


5、相关说明
(1) 调用一次_TrackMouseEvent只能请求一次WM_MOUSEHOVER和WM_MOUSELEAVE消息,所以要放到OnMouseMove中多次请求,msdn中的相关解释:
The _TrackMouseEvent function posts messages when the mouse pointer leaves a window or hovers over a window for a specified amount of time. This function calls TrackMouseEvent if it exists, otherwise it emulates it.
All tracking requested by TrackMouseEvent is canceled when this message is generated. The application must call TrackMouseEvent when the mouse reenters its window if it requires further tracking of mouse hover behavior.

(2) 让一个相对独立的窗口捕获WM_MOUSEHOVER和WM_MOUSELEAVE消息,直接按上述方法就可以了。如果让子窗口CButton、CStatic等来捕获,则需要在基类的基础上派生出一个子类,在子类中按上述办法来实现就行了。




上一篇:Win7-x64 VC6 无法调试程序的Bug解决方法
下一篇:根据实际工作内容所写的小软件
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-7-8 09:35

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表