大家好,又见面了,我是你们的朋友全栈君。
ReleaseCapture 以及 SetCapture 函数
SetCapture函数是俘获鼠标消息,而ReleaseCapture则是释放对鼠标的俘获。
详细解释:该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。
其中一个应用:如果鼠标在窗口上,那么窗口就显示,如果鼠标移出窗口,那么窗口则消失,这种应用场景很适合tip。
我们可以在窗口的OnMouseMove函数内,调用SetCapture,而在当鼠标不在当前窗口的显示范围内时(因为窗口已经SetCapture了,所以不在窗口内的鼠标消息窗口也可以收到),调用ReleaseCapture.
代码如下:
void OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(m_bOverControl) //如果鼠标还在窗口内
{
CRect rect;
GetClientRect(rect);
//鼠标位置离开了客户区,解除鼠标捕获,并改写状态量m_bOverControl
//if(!rect.PtInRect(point))
if ( !(( point.x>=rect.left) && ( point.x<= rect.right) && (point.y>= rect.top) && (point.y<= rect.bottom)) )
{
g_bOverControl = FALSE;
ReleaseCapture();
//隐藏自己的窗口
ShowWindowEx(SW_HIDE);
return;
}
}
else //如果鼠标进入窗口,置鼠标捕获,状态参量
{
g_bOverControl = TRUE;
SetCapture();
}
CWnd::OnMouseMove(nFlags, point);
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134827.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...