如何理解GetCapture()

dianhui 2008-10-15 10:05:00
现在问题是这样的:
我程序里主界面上有一子窗口A,现在我在A的OnLButtonDown里面做如下测试:
CClientDC myDC(this);
if (::GetCapture() == NULL)
{
myDC.TextOut( 10, 50, "GetCapture为空");
}
else
{
myDC.TextOut( 10,50, "GetCapture不为空");
}
GetCapture功能为:如果所调用线程中没有捕获鼠标的窗口,GetCapture将返回NULL。
现在不管我鼠标如何点击子窗口A,程序总是弹出"GetCapture为空";
也就是说,子窗口A总是没有捕获到鼠标,可是我鼠标不停的在点击子窗口A,为什么子窗口A还是没有捕获到鼠标呢?
不是鼠标点击某个窗口后,该窗口就捕获到鼠标了吗?难道我的理解是错误的?希望高手指点。
...全文
1460 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jcyl_baihu 2009-08-11
  • 打赏
  • 举报
回复
楼上根本没有回答到问题上啊
我知道GetCapture是怎么工作的,但问题是,鼠标在窗口A,它的事件就应该被窗口A捕获,对不对?那么在窗口A中点击时,应该返回的是窗口A对不对?那为什么返回是NULL?
我今天刚好遇到了这个问题,非常郁闷。先SetCapture一次,没有问题,在任何地方都能正常返回窗口A;但如果不SetCapture,在任何地方都返回NULL!这应该返回的是窗口A对吧?
Joephia 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口。如果调用了SetCapture,之后无论鼠标的位置在哪,鼠标消息都发给指定的这个窗口,直到调用ReleaseCapture或者调用SetCapture设置另一个窗口为止。
很多时候,窗口或控件在鼠标按下后,需要知道鼠标移动和放开的情况,例如按钮在鼠标按下后会变为“按下”状态,鼠标移出按钮区域时“弹起”,所以按钮控件需要在鼠标按下时SetCapture,鼠标放开后ReleaseCa…
[/Quote]

如上.


SetCapture/ReleaseCapture

作用:改变 MOUSEMOVE 消息默认发送方式.

一般移动 鼠标时,鼠标在哪个窗口 MOUSEMOVE 消息就发给哪个窗口(会触发OnIdle),

不管这个窗口是不是当前窗口,也不管是不是拥有焦点,或者有没有激活

而SetCapture 则会改变这种行为.当某个窗口被设置了SetCapture 后

鼠标在全屏范围内移动时MouseMove 消息都会发送给该窗口.

直到 ReleaseCapture,或者在其他窗口点击 才结束
dianhui 2008-10-15
  • 打赏
  • 举报
回复
非常感谢cnzdgs
你这么一解释我似乎有点明白了,不过还要再消化消化一下。感谢。
cnzdgs 2008-10-15
  • 打赏
  • 举报
回复
正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口。如果调用了SetCapture,之后无论鼠标的位置在哪,鼠标消息都发给指定的这个窗口,直到调用ReleaseCapture或者调用SetCapture设置另一个窗口为止。
很多时候,窗口或控件在鼠标按下后,需要知道鼠标移动和放开的情况,例如按钮在鼠标按下后会变为“按下”状态,鼠标移出按钮区域时“弹起”,所以按钮控件需要在鼠标按下时SetCapture,鼠标放开后ReleaseCapture。
GetCapture只是检查一下当前是哪个窗口捕获了鼠标,通常不需要调用。
dianhui 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cnzdgs 的回复:]
你没有调用SetCapture,在响应WM_LBUTTONDOWN消息时,GetCapture当然返回NULL了。
[/Quote]

窗口捕获鼠标到里是怎么回事?
必需要动态调用函数SetCapture才能使该窗口捕获到鼠标还是其它操作也同样可以使用窗口捕获到鼠标呢?比如鼠标点击该窗口,该窗口也能捕获到鼠标,我想其它方法也应该是可以的,我们平常让一个窗口接收鼠标的输入不都是通过鼠标点击来完成的吗?

GetCapture功能为:如果所调用线程中没有捕获鼠标的窗口,GetCapture将返回NULL。

SetCapture与GetCapture一一对应吗?GetCapture是检测窗口是否捕获到鼠标,如果窗口是通过其它方法捕获到鼠标,(比如鼠标点击窗口)而不SetCapture函数设置才窗口捕获到鼠标的,用GetCapture函数同样返回NULL么?问题是,如果窗口捕获到鼠标的话,GetCapture就应该返回true的啊!
dianhui 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cnzdgs 的回复:]
你没有调用SetCapture,在响应WM_LBUTTONDOWN消息时,GetCapture当然返回NULL了。
[/Quote]

窗口捕获鼠标到里是怎么回事?
必需要动态调用函数SetCapture才能使该窗口捕获到鼠标还是其它操作也同样可以使用窗口捕获到鼠标呢?比如鼠标点击该窗口,该窗口也能捕获到鼠标,我想其它方法也应该是可以的,我们平常让一个窗口接收鼠标的输入不都是通过鼠标点击来完成的吗?

GetCapture功能为:如果所调用线程中没有捕获鼠标的窗口,GetCapture将返回NULL。

SetCapture与GetCapture一一对应吗?GetCapture是检测窗口是否捕获到鼠标,如果窗口是通过其它方法捕获到鼠标,(比如鼠标点击窗口)而不SetCapture函数设置才窗口捕获到鼠标的,用GetCapture函数同样返回NULL么?问题是,如果窗口捕获到鼠标的话,GetCapture就应该返回true的啊!
cnzdgs 2008-10-15
  • 打赏
  • 举报
回复
你没有调用SetCapture,在响应WM_LBUTTONDOWN消息时,GetCapture当然返回NULL了。
dianhui 2008-10-15
  • 打赏
  • 举报
回复
窗口捕获鼠标到里是怎么回事?
必需要动态调用函数SetCapture才能使该窗口捕获到鼠标还是其它操作也同样可以使用窗口捕获到鼠标呢?比如鼠标点击该窗口,该窗口也能捕获到鼠标,我想其它方法也应该是可以的,我们平常让一个窗口接收鼠标的输入不都是通过鼠标点击来完成的吗?
dianhui 2008-10-15
  • 打赏
  • 举报
回复
问题是我点击的是子窗口A,子窗口在父窗口的上面,难道父窗口会抢了不成,如果这样的话,父窗口会抢子窗口的鼠标捕获,那不子窗口总是接收不到鼠标输入了!都被父窗口抢去了!
study_live 2008-10-15
  • 打赏
  • 举报
回复
不需要先用SetCapture吗?
sys0002 2008-10-15
  • 打赏
  • 举报
回复
可能被它的父窗口捕获了

16,472

社区成员

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

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

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