VC编程时关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息

关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息

这两个消息比较古怪,虽然你能找到他们的定义,看起来也似乎挺有用,但是却接收不到。
如果要处理这两个消息需要手动在WM_MOUSEMOVE消息处理函数中添加:

添加变量:
BOOL m_bTracking;
m_bTracking = FALSE;

添加消息处理函数:
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);

用ON_MESSAGE宏进行消息映射:
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)

在WM_MOUSEMOVE消息处理函数中进行处理:
void CDemo::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);
}

}

LRESULT CDemo::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
return 0;
}

LRESULT CDemo::OnMouseHover(WPARAM wParam, LPARAM lParam)
{

return 0;
}

WM_MOUSELEAVE ,WM_MOUSEENTER 应该算是个自定义的消息,因为Windows通常都不会发送这个消息。只有你调用TrackMouseEvent 才会收到这个消息。

实际上这个消息 是 TrackMouseEvent 而不是windows 发出的。很奇怪微软会定义出这样子的API。而且TrackMouseEvent 个人感觉也不大好用(主要是感觉别扭,不是说功能不行)。其实TrackMouseEvent 的原理也蛮简单的,自己三两句语句就搞定了,不必理会微软搞的这个古里古怪的API,还得去查找消息定义。

原理如下:
鼠标在窗口区域时会收到MouseMove消息,第一次收到这个消息时 就是 WM_MOUSEENTER。
On_MouseMove(...)
{
BOOL bFirst = TRUE;
if (bFirst)
{
// PostMessage(WM_MOUSEENTER...) or call some function.
bFirst = FALSE;
SetTimer(...);
}
}

在 Mouse Enter 自后启动了一个计时器, 通常100ms 就足够了。计时器里检测鼠标是否离开。
On_Timer(...)
{
...
GetCursorPos(pt);
GetWindowRect(rect);
if (PtInRect(&rect,pt))
{
KillTimer(...); // kill self.
PostMessage(WM_MOUSELEAVE...); // or call some function.
}
}

时间: 2024-09-20 04:21:10

VC编程时关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息的相关文章

VC编程中的WM_MOUSEENTER 和 WM_MOUSELEAVE消息

这两个消息比较古怪,虽然你能找到他们的定义,看起来也似乎挺有用,但是却接收不到. 如果要处理这两个消息需要手动在WM_MOUSEMOVE消息处理函数中添加: 添加变量: BOOL m_bTracking; m_bTracking = FALSE; 添加消息处理函数: afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lPara

C++/VC++编程的疑难问题及解答

本人在用C++/VC++编程时,遇到的一些比较难以解决的问题,在经过百思得其解之后,总结了一些解决方法,希望这些经验之谈能对大家有所帮助. 1.[VC问题] 编辑框内的换行? 答:假设要在编辑框内输出"12345\n6789".首先要设置编辑框的Multiline属性为TRUE,在输出时,除了要加\n,还要有\r.也就是说,如果要12345和6789在两行显示,需要输出12345\r\n6789.代码如下: m_strData = "12345\r\n67890";

vs2012-用VC编程时,鼠标放在菜单上时,怎样直接显示内容

问题描述 用VC编程时,鼠标放在菜单上时,怎样直接显示内容 怎样设置让它直接显示内容呢?每次把鼠标放在菜单上,都是先显示两个向下的括号,等一会才显示菜单内容,真烦. 解决方案 是直接显示菜单 内容呀,不要这样子显示 解决方案二: 是直接显示菜单 内容呀,不要这样子显示 解决方案三: 你可以点一下试试.........

c语言 编程-DirectX 9.0 Summer 2004 SDK和VC++6.0编程时总是出现问题,怎么办???

问题描述 DirectX 9.0 Summer 2004 SDK和VC++6.0编程时总是出现问题,怎么办??? #define DIRECTINPUT_VERSION 0x0800 //声明DirectX Input的版本是8.0 #ifndef _WIN32_DCOM #define _WIN32_DCOM #endif #define pr printf #pragma once #define INITGUID //确保INITGUID已被定义 #define INTERFACE IDi

vc++-VC右上角的关闭程序按钮关闭时自动发送的是什么消息

问题描述 VC右上角的关闭程序按钮关闭时自动发送的是什么消息 VC右上角的关闭程序按钮关闭时自动发送的是什么消息?我需要在关闭程序中补加程序确认关闭对话框,以及确认关闭后关闭摄像头等操作,该如何做呢? 我发现鼠标移到此关闭按钮时msg.message=160,若以此方法关闭时,只要鼠标移到关闭程序按钮就自动关闭了(但是没点击关闭按钮),该如何改程序呢? 解决方案 可以在OnCancle()函数中添加处理函数,重载OnCancel函数即可. 解决方案二: 处理一下 WM_CLOSE 消息 或者,直

vc++编程问题-VC加载SkinPlusPlus后CFileDialog的打开对话框重新选取时自动消失

问题描述 VC加载SkinPlusPlus后CFileDialog的打开对话框重新选取时自动消失 在VC编程中,加载了SkinPlusPlus库后,调用InitializeSkin("SoftCrystal.ssk");初始化窗体皮肤,显示一切正常,但是在用CFileDialog Dlg(TRUE)进行DoModal()后,打开对话框出来了,在对路径进行重新选择(比如点击后退按钮!,比如下拉选择C盘或桌面)时,打开对话框就自动消失了,对此本菜鸟很是头疼,搞了好几天都没有弄出来,希望哪位

vc mfc-VC6.0使用ON_REGISTERED_MESSAGE添加新消息时出错

问题描述 VC6.0使用ON_REGISTERED_MESSAGE添加新消息时出错 添加一个新消息: const UINT wm_Find = RegisterWindowMessage(FINDMSGSTRING); 然后添加函数定义和宏映射 afx_msg long OnFind(WPARAM wParam,LPARAM lParam); ON_REGISTERED_MESSAGE(wm_Find, OnFind) 编译时出现下面的错误: error C2440: 'type cast' :

vc++窗口的创建过程(MFC消息机制的经典文章)

一.什么是窗口类  在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC在调用Windows的API(CreateWindow或者CreateWindowEx)创建窗口之前,要求程序员必须定义一个窗口类(不是传统C++意义上的类)来规定所创建该窗口所需要的各种信息,主要包括:窗口的消息处理函数.窗口的风格.图标. 鼠标.菜单等.其定义如下:  typedef struc

vc++-VC++编程中HICON,这个是图标句柄,想这种带H的都是引用对象的地址的,是吗??

问题描述 VC++编程中HICON,这个是图标句柄,想这种带H的都是引用对象的地址的,是吗?? VC++编程中HICON,这个是图标句柄,想这种带H的**都**是引用对象的地址的,是吗??不会引用其他的吧,句柄只是引用对象的地址吧? 解决方案 局柄的数据结构并没有公开. Windows程序一书中的理解:句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引.因为windows的内存管理经常会将当前空闲对象的内存释放掉,当需要时访问再重新提交到物理