对话框工程中如何检测鼠标离开窗体的事件? 如题。我在WM_MOUSEMOVE消息中判断point的位置,当point坐标值不在窗体客户区中时,就是鼠标离开了,可这种方法在用户鼠标快速移出时就不灵了,用setcapture好象也不行。请大家帮忙指点一下啊! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TrackMouseEvent http://dev.csdn.net/article/36/36994.shtm TrackMouseEvent函数在MSDN中可以找到它的说明,在VC6中提示如下错误:error C2065: 'TrackMouseEvent' : undeclared identifier改成_TrackMouseEvent函数后,我的代码如下: LPTRACKMOUSEEVENT lpEventTrack; lpEventTrack->cbSize=sizeof(TRACKMOUSEEVENT); //这行该怎么写 lpEventTrack->dwFlags=TME_HOVER|TME_LEAVE; lpEventTrack->dwHoverTime=HOVER_DEFAULT; lpEventTrack->hwndTrack=this->m_hWnd; _TrackMouseEvent(lpEventTrack);可程序执行到cbSize的赋值语句就崩溃了,不知道我这样写错在哪了?请横秋朋友和各位看一下,谢谢了! if(!m_bTrack) { TRACKMOUSEEVENT tme; tme.cbSize=sizeof(TRACKMOUSEEVENT); tme.dwFlags=TME_HOVER | TME_LEAVE; tme.dwHoverTime=HOVER_DEFAULT; tme.hwndTrack=m_hWnd; m_bTrack=_TrackMouseEvent(&tme); }LPTRACKMOUSEEVENT lpEventTrack是个指针,没有初始化。所以lpEventTrack->cbSize出错 晕死,犯了这样的错误,感谢楼上zjh824(coder)的提醒,现在我可以用这个函数成功捕捉鼠标的特定事件了,可我如何接收WM_MOUSELEASE和WM_MOUSEHOVER消息呢,我用下面代码在PreTranslateMessage函数中接收不到,方法不对么?if(pMsg->message==WM_MOUSELEAVE) AfxMessageBox("WM_MOUSELEAVE");return CDialog::PreTranslateMessage(pMsg); 手动添加消息响应WM_MOUSELEASE。.h afx_msg LRESULT OnMouseLeave(WPARAM wParam,LPARAM lParam); afx_msg LRESULT OnMouseHover(WPARAM wParam,LPARAM lParam);.cpp ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)LRESULT CMyButton::OnMouseLeave(WPARAM wParam,LPARAM lParam){ m_bMouseOver=FALSE; m_bTrack=FALSE; InvalidateRect(NULL); return 0;}LRESULT CMyButton::OnMouseHover(WPARAM wParam,LPARAM lParam){ m_bMouseOver=TRUE; InvalidateRect(NULL); return 0;} To zjh824(coder)朋友:已经按上面说的方法添加了消息响应WM_MOUSELEASE,还是不能收到消息WM_MOUSELEASE.我是在对话框的OnInitDialog中添加_TrackMouseEvent函数的: TRACKMOUSEEVENT tme; tme.cbSize=sizeof(TRACKMOUSEEVENT); tme.dwFlags=TME_HOVER | TME_LEAVE; tme.dwHoverTime=HOVER_DEFAULT; tme.hwndTrack=m_hWnd; m_bTrack=_TrackMouseEvent(&tme);错了吗?再加30分,还请多多赐教!!如果你有范例的话,请发到:[email protected]不甚感激!!! 这个函数段应该加到mousemove的消息响应中。在对话框的OnInitDialog中添加_TrackMouseEvent是无效的。函数会返回,然后就收不到MOUSE的消息了。 解决了。下面把问题的解决方法重新整理一遍:1 把下面代码加进对话框的WM_MOUSEMOVE的消息响应中TRACKMOUSEEVENT tme;tme.cbSize=sizeof(TRACKMOUSEEVENT);tme.dwFlags=TME_HOVER | TME_LEAVE;tme.dwHoverTime=HOVER_DEFAULT;tme.hwndTrack=m_hWnd;if(!_TrackMouseEvent(&tme)) AfxMessageBox("鼠标事件捕捉失败!");2 然后你直接可以用下面代码在PreTranslateMessage函数中接收,不需要自己写WM_MOUSELEASE和WM_MOUSEHOVER消息的响应函数(当然你要自己写也行):if(pMsg->message==WM_MOUSELEAVE) AfxMessageBox("mouse leave");return CDialog::PreTranslateMessage(pMsg);这样就可以了,不过这种方法的不足之处是:当用上面代码时,鼠标移进窗体中子窗口范围内时也算离开了m_hWnd窗口,这也是一个Bug。当你只想检测鼠标是否离开一个子窗口内时_TrackMouseEvent是很好用的函数(在VC中别把前面的下划线给忘了^_^)。结贴了,特别鸣谢横秋朋友给出的方法和zjh824(coder)朋友耐心的解释和详细的代码!! 为是一个什么原理呀,一直没弄明白 谁能帮帮兄弟??给一个经典的winsockapi编写的网络通讯代码!!~~~~~ 急问,如何在任务管理器的Application列表中将我的窗口项隐藏 关于Dialog类的问题~~~~ 在主程序里调用DLL作的对话框退出时主窗口也退出在问题! 如何改變Window的BackColor? 一个完成端口问题!有劳高手指点 加载msdbg2.dll失败 OCX控件调用动态库接口问题 请问在上海做VC++编程每月能拿多少工资?? 我想把bmp图像放在dll中,然后再用程序如何调用 可以将多个LIB库文件合并吗
error C2065: 'TrackMouseEvent' : undeclared identifier
改成_TrackMouseEvent函数后,我的代码如下:
LPTRACKMOUSEEVENT lpEventTrack;
lpEventTrack->cbSize=sizeof(TRACKMOUSEEVENT); //这行该怎么写
lpEventTrack->dwFlags=TME_HOVER|TME_LEAVE;
lpEventTrack->dwHoverTime=HOVER_DEFAULT;
lpEventTrack->hwndTrack=this->m_hWnd;
_TrackMouseEvent(lpEventTrack);
可程序执行到cbSize的赋值语句就崩溃了,不知道我这样写错在哪了?请横秋朋友和各位看一下,谢谢了!
{
TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_HOVER | TME_LEAVE;
tme.dwHoverTime=HOVER_DEFAULT;
tme.hwndTrack=m_hWnd; m_bTrack=_TrackMouseEvent(&tme);
}LPTRACKMOUSEEVENT lpEventTrack是个指针,没有初始化。
所以lpEventTrack->cbSize出错
if(pMsg->message==WM_MOUSELEAVE)
AfxMessageBox("WM_MOUSELEAVE");
return CDialog::PreTranslateMessage(pMsg);
.h
afx_msg LRESULT OnMouseLeave(WPARAM wParam,LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam,LPARAM lParam);
.cpp
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)LRESULT CMyButton::OnMouseLeave(WPARAM wParam,LPARAM lParam)
{
m_bMouseOver=FALSE;
m_bTrack=FALSE; InvalidateRect(NULL);
return 0;
}LRESULT CMyButton::OnMouseHover(WPARAM wParam,LPARAM lParam)
{
m_bMouseOver=TRUE; InvalidateRect(NULL);
return 0;
}
已经按上面说的方法添加了消息响应WM_MOUSELEASE,还是不能收到消息WM_MOUSELEASE.我是在对话框的OnInitDialog中添加_TrackMouseEvent函数的:
TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_HOVER | TME_LEAVE;
tme.dwHoverTime=HOVER_DEFAULT;
tme.hwndTrack=m_hWnd; m_bTrack=_TrackMouseEvent(&tme);
错了吗?
再加30分,还请多多赐教!!如果你有范例的话,请发到:
[email protected]
不甚感激!!!
在对话框的OnInitDialog中添加_TrackMouseEvent是无效的。函数会返回,然后就收不到MOUSE的消息了。
1 把下面代码加进对话框的WM_MOUSEMOVE的消息响应中
TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_HOVER | TME_LEAVE;
tme.dwHoverTime=HOVER_DEFAULT;
tme.hwndTrack=m_hWnd;
if(!_TrackMouseEvent(&tme))
AfxMessageBox("鼠标事件捕捉失败!");
2 然后你直接可以用下面代码在PreTranslateMessage函数中接收,不需要自己写WM_MOUSELEASE和WM_MOUSEHOVER消息的响应函数(当然你要自己写也行):
if(pMsg->message==WM_MOUSELEAVE)
AfxMessageBox("mouse leave");
return CDialog::PreTranslateMessage(pMsg);这样就可以了,不过这种方法的不足之处是:当用上面代码时,鼠标移进窗体中子窗口范围内时也算离开了m_hWnd窗口,这也是一个Bug。当你只想检测鼠标是否离开一个子窗口内时_TrackMouseEvent是很好用的函数(在VC中别把前面的下划线给忘了^_^)。结贴了,特别鸣谢横秋朋友给出的方法和zjh824(coder)朋友耐心的解释和详细的代码!!