http://blog.csdn.net/lanyzh0909/article/details/5543399

查MSND,对SetCapture()函数的说明为:“该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。”一开始我看这个解释误认为了只要在属于窗口里的一个线程调用了SetCapture(hWnd)把hWnd设为当前的窗口句柄,那么以后的所有窗口消息都会发到我们指定的那个窗口消息队列中。这样的理解是错误的!!!在你调用SetCapture(hWnd)函数后,只是能够捕获onmousedown、onmouseup、onmousemove、onclick、ondblclick、onmouseover和onmouseout鼠标消息,但是一般我们是捕获onmousemove和onmouseup两个消息。需要只注意最后一句“如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口”的解释,就是即使你在一个窗口线程里对了了SetCapture(),但你在别的窗口的上点击了同样会把鼠标消息发个这个窗口而是我们通过调用SetCapture()设定那个窗口。因为当鼠标在窗口外面点击的时候,被点击的窗口获得焦点,原来的SetCapture()也就失效了。

当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉,否则别的线程想调用就会失败。记住:SetCapture()和ReleaseCapture()必须成对呈现。

另一处资料:

一般,只有鼠标在CWnd的客户区内,你才能接受到鼠标消息。调用SetCapture后,即使鼠标移动出客户区,你也可以接受到鼠标消息。不过系统中只能有一个程序调用SetCapture,所以你需要在不使用时调用ReleaseCapture释放。而GetCapture可以知道当前哪个窗口调用了SetCapture。  用来捕获鼠标消息,只有鼠标在CWnd的客户区内,你才能接受到鼠标消息. 比如说你做一个画图的程序当鼠标移出客户就不能再画了当你鼠标移回客户 区时它会从你移动进来的地方再开始画, 用了这个函数可以避免移进来时从你移出的地方开始接着画. 我觉得鼠标的Capture主要是让你能够捕获鼠标在别的地方的 松开的消息  setcapture()是将所有的鼠标输入消息全部发送给当前窗口,而不论鼠标是否在当前窗口内。以滚动条为例,当你在滚动条中间的滑块上按下鼠标左键并拖动时,即使你的鼠标已经在滑块之外,但滑块依然能滑动。着就是setcapture()起到的作用。

ReleaseCapture,是一种计算机用语,函数功能是该函数从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。
函数功能:该函数从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。捕获鼠标的窗口接收所有的鼠标输入(无论光标的位置在哪里),除非点击鼠标键时,光标热点在另一个线程的窗口中。

函数原型:BOOL ReleaseCapture(VOlD)
参数:无。
返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetlastError函数。
备注:应用程序在调用函数SetCaPture之后调用此函数。
Windows 95:调用ReleaseCapture会引起失去鼠标捕获的窗口接收一个WM_CAPTURECHANGED消息。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本:Windows CE:1.0及以上版本;头文件:winuser.h;输入库:User32.lib。

HWND SetCapture(HWND hwnd)
函数功能:
    该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。
函数功能 当前线程的指定窗口里设置鼠标捕获 参    数hWnd:当前线程里要捕获鼠标的窗口句柄

作用及参数
函数原型:HWND SetCapture(HWND hwnd);
参数:
hWnd:当前线程里要捕获鼠标的窗口句柄。
返回值:返回值是上次捕获鼠标的窗口句柄。如果不存在那样的句柄,返回值是NULL。
备注:只有前台窗口才能捕获鼠标。如果一个后台窗口想捕获鼠标,则该窗口仅为其光标热点在该窗口可见部份的鼠标事件接收消息。另外,即使前台窗口已捕获了鼠标,用户也可点击另一个窗口,将其调入前台。当一个窗口不再需要所有的鼠标输入时,创建该窗口的线程应当调用函数ReleaseCapture来释放鼠标。此函数不能被用来捕获另一进程的鼠标输入。
Windows 95:调用SetCapture会引起失去鼠标捕获的窗口接收一个WM_CAPTURECHANGED消息。
头文件:Winuser.h:输入库:user32.lib。

鼠标事件
setCapture捕获以下鼠标事件:onmousedown、onmouseup、onclick、ondblclick、onmouseover和onmouseout。
程序中主要是要捕获onmousemove和onmouseup事件。
msdn的介绍中还说到setCapture有一个bool参数,用来设置在容器内的鼠标事件是否都被容器捕获。
容器就是指调用setCapture的对象,大概意思就是:
参数为true时      (默认)容器会捕获容器内所有对象的鼠标事件,即容器内的对象不会触发鼠标事件(跟容器外的对象一样);
参数为false时      容器不会捕获容器内对象的鼠标事件,即容器内的对象可以正常地触发事件和取消冒泡。

关于SetCapture() 和 ReleaseCapture()的用法相关推荐

  1. 关于SetCapture() 和 ReleaseCapture()的用法的个人理解

    1. 函数功能:在当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内还是边界外.同一时刻只能有一个窗口捕获鼠标. 2. 失效条件: A. 当鼠标 ...

  2. 关于SetCapture() 和 ReleaseCapture()的用法的个人理解[通俗易懂]

    1. 函数功能:在当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内还是边界外.同一时刻只能有一个窗口捕获鼠标. 2. 失效条件: A. 当鼠标 ...

  3. 理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,是理解消息的关键)

    理解SetCapture.ReleaseCapture.GetCapture 正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口.如果调用了SetCapture,之后无论鼠标的位置在哪 ...

  4. win32中SetCapture 和 ReleaseCapture的使用

    最近在用win32写<visual C++经典游戏程序设计>中的扫雷游戏,在写到鼠标点击雷区的时候用到了SetCapture,和ReleaseCapture这对系统函数. 那么为什么需要用 ...

  5. setCapture和releaseCapture的小应用

    web开发和windows开发最大的区别就是windows开发是有状态的,而web开发是无状态的,在windows中,一切操作都可以由程序来控制 ,除非强制执行ctrl+alt+del;但web操作就 ...

  6. SetCapture()和ReleaseCapture()

    查MSND,对SetCapture()函数的说明为:"该函数在属于当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内.同一时刻只能有一 ...

  7. setCapture和releaseCapture

    setCapture函数的作用就是将后续的mouse事件都发送给这个对象,releaseCapture就是将鼠标事件还回去,由 document.window.object之类的自行来处理.这样就保证 ...

  8. setCapture和releaseCapture的小应用(转)

    web开发和windows开发最大的区别就是windows开发是有状态的,而web开发是无状态的,在windows中,一切操作都可以由程序来控制 ,除非强制执行ctrl+alt+del;但web操作就 ...

  9. 关于SetCapture() 和 ReleaseCapture()的使用方法

    查MSND,对SetCapture()函数的说明为:"该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有 ...

最新文章

  1. 不同的source control下配置DiffMerge
  2. Spring Cloud第十二篇:断路器监控(Hystrix Dashboard)
  3. android WebView中js的alert()失效
  4. mysql 多配置文件实例安装_mysql安装之多实例多配置文件安装
  5. 用ftp、http搭建网络yum源
  6. 图像分类:常用分类网络结构(附论文下载)
  7. 【MATLAB统计分析与应用100例】案例005:matlab调用medfilt1函数对加噪正弦波信号进行平滑处理
  8. 【Java从入门到头秃专栏 6】语法篇(五) :多线程 线程池 可见、原子性 并发包 Lambda表达式
  9. 屏幕为什么要正负压供电_焦炉煤气脱硫为什么要选择负压脱硫工艺?
  10. matlab normxcorr2函数,matlab – 以类似于’conv2’的方式获得`normxcorr2`输出的优雅方法 – (删除不需要的边)...
  11. centos 安装 fortran
  12. typecho插件编写教程6 - 调用接口
  13. 汉信码(Hanxin Code)与QR码(QR Code)的终极对决
  14. 公司邮箱、公共邮箱、工作邮箱,常用什么邮箱?
  15. 『译』计算机体系结构发展史(四)
  16. (Note)Python 统计列表中各元素出现的次数
  17. Mac用Visual Studio Code编写C/C++安装配置教程
  18. 51nod P3121 小陶与杠铃片【树状数组】
  19. android广告平台哪个好用,安卓手机里谁家系统广告最少?看完后想说:真怕小米MIUI垫底!...
  20. 《乔布斯传》读书笔记

热门文章

  1. libmali-xlnx_git.bb:do_fetch) failed with exit code '1'
  2. 自动驾驶基础-AEB
  3. 东软mysql期末题库_东软大三上学期实训笔记-mysql篇Day5完结篇
  4. 【Autosar 存储栈Memery Stack 1.NVM Block的了解】
  5. 陕西师范大学计算机学院课表,陕西师范大学数学和信息科学学院课程表
  6. linux下的有趣命令
  7. linux离线ftp安装部署,ftp离线搭建
  8. 浅谈一种Android客户端架构设计
  9. Ra-01SC/Ra-01SCH模组驱动
  10. 马化腾深夜发出世纪灵魂拷问,程序员却把它玩坏了,这届网友我服了!