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

当鼠标停留在程序窗口一定时间后,会产生一个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.   
  7. void   CXXXWnd::OnMouseLeave()  
  8. {  
  9.           MessageBox( "鼠标已离开 ");  
  10.           m_bTrackLeave = FALSE;  
  11. }  
3、用 ON_MESSAGE添加消息映射:

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

void  CXXXWnd::OnMouseMove(UINT   nFlags,   CPoint   point)  
{
	if (!m_bTracking)
	{
//   鼠标移入窗时,请求WM_MOUSEHOVER和WM_MOUSELEAVE 消息
		TRACKMOUSEEVENT tme;
		tme.cbSize = sizeof(tme);
		tme.hwndTrack = m_hWnd;
		tme.dwFlags = TME_LEAVE|TME_HOVER;
		tme.dwHoverTime = 1;
		m_bTracking = _TrackMouseEvent(&tme);
	}

      CWnd::OnMouseMove(nFlags,   point);
}

5、相关说明

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

  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等来捕获,则需要在基类的基础上派生出一个子类,在子类中按上述办法来实现就行了。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
class CNewsWindow { public: CNewsWindow(void); ~CNewsWindow(void); public: HWND m_hWnd; public: // 设置皮肤(位图资源名称,标题栏文本颜色) BOOL SetSkin(LPCTSTR lpSkinBitmapName,COLORREF CaptionColor=0x000000); // 创建窗口 BOOL Create(LPCTSTR lpWindowName,int nWidth=250,int nHeight=180); BOOL Create(LPCTSTR lpClassName,LPCTSTR lpWindowName,int nWidth,int nHeight); // 设置新闻标题、内容、链接 BOOL SetNews(LPCTSTR lpNewsTitle,LPCTSTR lpNewsContent,LPCTSTR lpNewsURL); // 显示窗口 void Show(); // 设置为主窗口,主窗口销毁后会退出消息循环 void SetMainWindow(BOOL bMainWindow=TRUE); // 设置自动关闭,如果为真,点击链接后窗口自动关闭 void SetAutoClose(BOOL bAutoClose=TRUE); public: BOOL IsWindow(); BOOL DestroyWindow(); private: #define NCT_CLOSE 0 #define NCT_VIEW 1 #define NCT_TITLE 2 #define NCT_CONTENT 3 typedef struct tagNEWSCONTROL { CString strText; int nType; int x; int y; int nWidth; int nHeight; RECT Rect; }NEWSCONTROL, *LPNEWSCONTROL; private: LPNEWSCONTROL m_pControls; int m_nControlCount; private: HCURSOR m_hArrowCursor; HCURSOR m_hHandCursor; HCURSOR m_hCurCursor; HICON m_hAppSmallIcon; HDC m_hSkinDC; HDC m_hCacheDC; HBITMAP m_hSkinBitmap; HBITMAP m_hSkinOldBitmap; HBITMAP m_hCacheBitmap; HBITMAP m_hCacheOldBitmap; HFONT m_hFont; HFONT m_hBoldFont; COLORREF m_CaptionColor; int m_nHoverIndex; int m_nDownIndex; BOOL m_bMainWindow; BOOL m_bAutoClose; BOOL m_bTracking; CString m_strURL; private: BOOL DrawWindow(); BOOL DrawWindowEx(); void DrawButton(HDC hDC,LPNEWSCONTROL pControl); void DrawStatic(HDC hDC,LPNEWSCONTROL pControl); void DrawNineRect(HDC hdcDest,RECT DestRect,RECT SrcRect,RECT NineRect,UINT crTransparent=0xFF00FF); RECT CreateRect(LONG left,LONG top,LONG right,LONG bottom); void CreateControl(LPNEWSCONTROL pControl,int nType,int x,int y,int nWidth,int nHeight,CString strText=_T("")); int ControlFromPoint(POINT pt); int ControlFromPoint(LPARAM lParam); void SetCursor(HCURSOR hCursor); public: LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam); LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnEraseBkgnd(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnPaint(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnMouseMove(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnMouseHover(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnMouseLeave(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnLButtonDown(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnLButtonUp(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnControlClick(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnDestroy(UINT message, WPARAM wParam, LPARAM lParam); LRESULT OnSetCursor(UINT message, WPARAM wParam, LPARAM lParam); };
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值