OnMouseHover()和OnMouseLeave()(让窗口捕获并响应WM_MOUSEHOVER和WM_MOUSELEAVE消息)

当鼠标停留在程序窗口一定时间后,会产生一个WM_MOUSEHOVER消息;当鼠标离开程序窗口后,会产生一个WM_MOUSELEAVE消息。那如何才能使窗口响应这两个消息呢?按下面的步骤,即可让指定的窗口能捕获并响应WM_MOUSEHOVER和WM_MOUSELEAVE消息了:

1、在窗口类的头文件中添加:

[cpp]  view plain copy
  1. afx_msg   void   OnMouseHover();  
  2. afx_msg   void   OnMouseLeave();  
  3. BOOL   m_bTrackLeave;   // 捕获设置标记  
2、在窗口类的cpp文件中添加:
[cpp]  view plain copy
  1. void   CXXXWnd::OnMouseHover()  
  2. {  
  3.           MessageBox( "鼠标已进入 ");  
  4.           m_bTrackLeave = FALSE;  
  5. }  
  6.   
  7. void   CXXXWnd::OnMouseLeave()  
  8. {  
  9.           MessageBox( "鼠标已离开 ");  
  10.           m_bTrackLeave = FALSE;  
  11. }  
3、用 ON_MESSAGE 添加消息映射:

[cpp]  view plain copy
  1. ON_MESSAGE( WM_MOUSEHOVER, OnMouseHover )  
  2. ON_MESSAGE( WM_MOUSELEAVE, OnMouseLeave )  
4、在OnMouseMove响应函数中,调用_TrackMouseEvent(),设置捕获WM_MOUSEHOVER和WM_MOUSELEAVE消息请求:

[cpp]  view plain copy
  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.   
  14.       CWnd::OnMouseMove(nFlags,   point);  
  15. }  

5、相关说明

        (1) 调用一次_TrackMouseEvent只能请求一次WM_MOUSEHOVER和WM_MOUSELEAVE消息,所以要放到OnMouseMove中多次请求,msdn中的相关解释:

[cpp]  view plain copy
  1. 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.  
  2. 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等来捕获,则需要在基类的基础上派生出一个子类,在子类中按上述办法来实现就行了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值