鼠标从窗口上移到窗口外会产生什么消息?谢谢

hustzxq524 2003-08-06 01:50:59
我从CStatic派生了一个类CEditPicCtrl用来显示图片,当按住鼠标在上面移动的时候,会拖动图片,我分别响应了WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_LBUTTONUP三个消息然后进行处理,现在的问题是如果把鼠标按住然后移动到我的图片框外面,然后松开鼠标,这个时候不会触发WM_LBUTTONUP消息,所以当鼠标再移回来的时候,图片还是会移动,不知道我说清楚了没有,我想知道这个时候有什么别的消息产生吗?谢谢拉!
...全文
263 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kinogre 2003-08-09
  • 打赏
  • 举报
回复
在WM_MOUSEMOVE中调用 _TrackMouseEvent 来跟踪WM_MOUSE HOVER和WM_MOUSELEAVE消息.
这两个消息中的任何一个产生之后,相应的跟踪便失效了,如果想继续跟踪这两个消息,需要要重新调用跟踪函数.
lyt_hf 2003-08-06
  • 打赏
  • 举报
回复
使用_TrackMouseEvent函数可以使系统在鼠标离开窗口的时候发送一个WM_MOUSELEAVE的消息。
使用方法:
1、在头文件声明消息响应函数
afx_msg void OnMouseLeave();
2、在cpp文件定义消息响应函数
void CIMyWin::OnMouseLeave()
{
MessageBox("鼠标已离开");
m_bTrackLeave=FALSE;
}
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);
}
idau7 2003-08-06
  • 打赏
  • 举报
回复
如果你希望鼠标左击后只能在当前窗口移动,就捕获鼠标
在WM_LBUTTONTDOWN中加入如下代码,即使得当鼠标点击下后鼠标只能在窗口的范围内移动
RECT Rect;
GetClientRect (&Rect);
ClientToScreen (&Rect);

::ClipCursor (&Rect);

在WM_LBUTTONUP中加入
::ClipCursor (NULL);

使得鼠标可以移出窗口范围。

lizexpert 2003-08-06
  • 打赏
  • 举报
回复
windows 不产生这种消息
用SetCapture ReleaseCapture

macadamia 2003-08-06
  • 打赏
  • 举报
回复
前段时间就遇到过这个问题,按下鼠标左键拖动控件时Up事件响应不正常。
和你稍微不同的前提是:除了上述三个事件外,还响应了WM_MOUSELEAVE的消息,然后在OnMouseMove的时候做了一下鼠标离开的事件跟踪(TrackMouseEvent());

处理的方法:增加一个关于鼠标左键按下的标志m_bLBtnDownFlag;

void OnLButtonDown(UINT flags,CPoint point)
{
if(bLBtnDownFlag==FALSE)
{
bLBtnDownFlag=TRUE;
SetCapture();
}
//
。。。
}
void OnMouseMove(UINT flags,CPoint point)
{
//
。。。
if(!m_bTrack)
{
m_bTrack = true;
FireViewChange();
TRACKMOUSEEVENT tm;
tm.cbSize = sizeof(tm);
tm.dwFlags = TME_LEAVE;
tm.hwndTrack = this->m_hWnd;
::TrackMouseEvent(&tm);
}
。。。
//在这里也可以对鼠标按下/弹起状态进行判断,做不同的处理
}

void OnLButtonUp(UINT flags,CPoint point)
{
if(bLBtnDownFlag)
{
bLBtnDownFlag=FALSE;
ReleaseCapture();
}
//
。。。
}
tigerfox 2003-08-06
  • 打赏
  • 举报
回复
就是
hdqqq 2003-08-06
  • 打赏
  • 举报
回复
SetCapture

然后再Release
清泉ys 2003-08-06
  • 打赏
  • 举报
回复
可以在WM_LBUTTONDOWN里SetCapture( );
这样就可以收到WM_LBUTTONUP
要记得WM_LBUTTONUP里ReleaseCapture();
无敌魔仙 2003-08-06
  • 打赏
  • 举报
回复
WM_MOUSELEAVE
无敌魔仙 2003-08-06
  • 打赏
  • 举报
回复
WM_MOUSELEAVE

15,978

社区成员

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

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