_TrackMouseEvent函数中几个参数的疑问

cadinfo 2004-02-08 07:29:33
1着手处理一个GUI界面的开发,所有的Btn都是采用自己绘制的方式,发现鼠标掠过按钮,同时迅速离开窗口,这时候WM_MOUSE会收不到(也许是微软的BUG),因此我必须捕获此状态来解决界面绘制问题,在这里我采用了MS提供的TrackMouseEvent方法,得到额外的WM_MOUSELEAVE消息,然后处理,不过似乎TME_NONCLIENT标志对离开标题栏事件没有作用,也就是说它没有正常post出WM_NCMOUSELEAVE,请问有开发经验的朋友这是怎么回事情,有没有朋友用此法正确捕捉到鼠标离开标题栏?

2我自己后来使用定时器捕捉然后post消息,发现两次(client&nonclient)都是在Release版本报错,而Debug没有问题,有没有高人感兴趣,我可以共享界面源码,帮我捧场。
...全文
136 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
firstfruits 2010-05-27
  • 打赏
  • 举报
回复
CSDN原文连接http://topic.csdn.net/t/20020423/17/670254.html

详细说明见下面的原文,这里做一点补充:按原文的做法会遇到在上一篇文章中http://hi.baidu.com/liuqizealot/blog/item/60bfabd3d14c8934970a1691.html提到的错误,那就是Debug模式下正常运行而在Release模式下却非法操作。原因仍然是消息处理函数中没有加上形参,解决方法自然是在申明和实现消息处理函数的时候加上形参,不过要注意的是OnMouseLeave的形参是WPARAM wp和LPARAM lp而不是和OnMouseMove一样的UINT nFlags与 CPoint point,也就是说OnMouseLeave申明的时候应该是afx_msg void OnMouseLeave(WPARAM wp,LPARAM lp); 实现的时候应该是
void CMyWin::OnMouseLeave(WPARAM wp,LPARAM lp) ,CMyWin是所在的类名。

原文如下

文章引自 http://vcworm.51.net
=============================================
用mousemove判断鼠标离开窗口会捕捉不完全,加SetCapture会产生很多副作用。那么究竟该怎样判断呢?这篇文章给出了一个办法。

如何判断鼠标已经离开窗口(http://vcworm.51.net)

使用_TrackMouseEvent函数可以使系统在鼠标离开窗口的时候发送一个WM_MOUSELEAVE的消息。

使用方法:

1、在头文件声明消息响应函数

afx_msg void OnMouseLeave();

2、在cpp文件定义消息响应函数

void CMyWin::OnMouseLeave()
{

MessageBox("鼠标已离开");
}

3、添加消息映射

ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)

4、调用_TrackMouseEvent();捕获鼠标离开的事件

void CMyWin::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTrackLeave)
{// 鼠标第一次移入窗口时, 请求一个WM_MOUSELEAVE 消息
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
_TrackMouseEvent(&tme);
m_bTrackLeave = TRUE;
}

CWnd::OnMouseMove(nFlags, point);
}
firstfruits 2010-05-27
  • 打赏
  • 举报
回复
我也发现了这个问题,和你的做法、现象一样。 正在研究中

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧