怎么判断鼠标已经移到窗体外面去了?

keansun 2005-04-09 05:48:35
如上
...全文
388 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainfall19831109 2005-04-10
  • 打赏
  • 举报
回复
先GetCusorPos()获取当前鼠标的X和Y位置

再来是CRect rc;GetWinowsRect(&rc);ClientToWindow(&rc);

最后判断X和Y是否在rc范围内
everandforever 2005-04-09
  • 打赏
  • 举报
回复
TrackMouseEvent()+WM_MOUSELEAVE才是正道。
nainaixiong 2005-04-09
  • 打赏
  • 举报
回复
MARK
星辰游侠 2005-04-09
  • 打赏
  • 举报
回复
以下给出两种跟踪鼠标是否在窗口内的方法

一、使用SetCapture(),OnMouseMove()等判断鼠标位置

//设置一个状态量用于记录和标识鼠标是否在窗口内
//BOOL m_bOverControl;
void CXXX::OnMouseMove(UINT nFlags, CPoint point)
{
CStatic::OnMouseMove(nFlags, point);
//如果鼠标还在窗口内
if (m_bOverControl)
{
CRect rect;
GetClientRect(rect); //鼠标位置离开了客户区,解除鼠标捕获,并改写状态量m_bOverControl
if (!rect.PtInRect(point))
{
m_bOverControl = FALSE;
ReleaseCapture();
//其他鼠标离开时的操作 eg: ReDrawWindow();

return;
}
}//如果鼠标进入窗口,置鼠标捕获,状态参量
else
{
m_bOverControl = TRUE;//其他鼠标进入时的操作 eg: ReDrawWindow();
SetCapture();
}
}

二、使用TrackMouseEvent()在鼠标离开窗口时发送WM_MOUSELEAVE消息
使用TrackMouseEvent()还可以判断鼠标的停留,并发送WM_MOUSEHOVER消息

//设置一个状态量用于记录和标识鼠标是否在窗口内
BOOL m_bMouseTracking = FALSE;
//处理鼠标移动消息
void CSomeWnd::OnMouseMove(UINT nFlags, CPoint point)
{
//接收到WM_MOUSEMOVE,而m_bMouseTracking为假时,鼠标进入窗口。
//设置_TrackMouseEvent
if (!m_bMouseTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE; //监控鼠标离开
tme.hwndTrack = this->m_hWnd;
if (::_TrackMouseEvent(&tme))
{
m_bMouseTracking = TRUE;
//其他鼠标进入时的操作
}
}
CView::OnMouseMove(nFlags, point);
}

处理WM_MOUSELEAVE消息
消息处理函数声明afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
消息映射ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
处理函数定义

LRESULT CSomeWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
//其他鼠标离开时的操作

//重置状态量
m_bMouseTracking = FALSE;
return TRUE;
}


=============================================================================================================
处理鼠标离开窗口的消息 (WM_MOUSELEAVE)
WM_MOUSELEAVE 是鼠标离开窗口时发出的消息,但是这个消息与普通的鼠标消息不同,要收到WM_MOUSELEAVE消息必须先调用TrackMouseEvent,并且每调用一次TrackMouseEvent 窗口只能收到一次WM_MOUSELEAVE,也就说如果要获得WM_MOUSELEAVE消息的话,当鼠标重新进入窗口时必须调用一次TrackMouseEvent。

static BOOL bTrackLeave=FALSE;
void CMyWnd::OnMouseMove(UINT nFlags, CPoint point)
{
if (!bTrackLeave)
{
// 鼠标第一次移入窗口时, 请求一个WM_MOUSELEAVE 消息
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
_TrackMouseEvent(&tme);
bTrackLeave = TRUE;
// 在这里添加处理鼠标进入的代码 :
………………………………
}
}

手工添加消息映射和消息处理函数
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CMyWnd)
………………………
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()

LPARAM CMyWnd::OnMouseLeave(WPARAM wp, LPARAM lp)
{
bTrackLeave = FALSE;
// 在这里添加处理鼠标离开的代码 :
…………………………………..
return 0;
}
fanqing 2005-04-09
  • 打赏
  • 举报
回复
GetCursorPos(&point);//当前光标位置
GetWindowRect(&rect);//窗口
rect.PtInRect(point);//光标位置在窗口中吗?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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