win32中SetCapture 和 ReleaseCapture的使用

win32中SetCapture 和 ReleaseCapture的使用     最近在用win32写《visualC++经典游戏程序设计》中的扫雷游戏,在写到鼠标点击雷区的时候用到了SetCapture,和ReleaseCapture这对系统函数。那么为什么需要用到鼠标捕获的函数呢?我错误地认为鼠标的跟踪可以由Point进行传值处理,就能实现我想要的功能,但是我却疏忽了如果我的鼠标按下的时候把鼠标移除窗口外面的情况,这种情况的时候鼠标是在外面的,那么当我把鼠标弹起的时候鼠标的位置就不在扫雷窗口里面了,因此我需要在按下鼠标的时候捕获鼠标的位置,这样就解决了鼠标不在窗口里面的

大家好,又见面了,我是你们的朋友全栈君。

      最近在用win32写《visual C++经典游戏程序设计》中的扫雷游戏,在写到鼠标点击雷区的时候用到了SetCapture,和ReleaseCapture这对系统函数。

那么为什么需要用到鼠标捕获的函数呢?

我错误地认为鼠标的跟踪可以由Point进行传值处理,就能实现我想要的功能,但是我却疏忽了如果我的鼠标按下的时候把鼠标移除窗口外面的情况,这种情况的时候鼠标是在外面的,那么当我把鼠标弹起的时候鼠标的位置就不在扫雷窗口里面了,因此我需要在按下鼠标的时候捕获鼠标的位置,这样就解决了鼠标不在窗口里面的问题。

 

下面我引用百度百科里的关于SetCapture的介绍:


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

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

 

下面我举一个例子,能简单地理解SetCapture和ReleaseCapture的作用:

当你在浏览本日志的时候,你会拉动右手边的滑动条来调整内容上下位置,那么当你按下左键的时候,移动鼠标到非滚动条处,你会发现上下移动鼠标滚动条仍然后控制,对,这就是俘获鼠标函数SetCapture的作用。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134887.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Boltzmann Machine 玻尔兹曼机入门

    Boltzmann Machine 玻尔兹曼机入门GenerativeModels生成模型帮助我们生成新的item,而不只是存储和提取之前的item。BoltzmannMachine就是GenerativeModels的一种。Boltzma

  • awk的内置函数_awk引用变量

    awk的内置函数_awk引用变量awk 系列Part10:如何使用 awk 内置变量

  • voliate 关键字「建议收藏」

    voliate 关键字「建议收藏」voliatecpu术语定义术语英文单词术语描述内存屏障cachebarriers处理器的指令,用于实现对内存操作的顺序限制原子操作atomicopers不可中断的一个操作缓存行填充cachelinefill当处理器识别到内存的读操作是可缓存的,处理器读取整个缓存行到适合的缓存(L1,L2,L3)缓存命中cachehit当进行高速缓存行填充的内存位置不变时,处理器从缓存中读取,而非内存写命中writehitpp写

  • java BigDecimal 加减乘除运算

    java BigDecimal 加减乘除运算注意除法运算,分母为0的问题,还有就是除法后保留几位小数点的问题//两个flot相加publicfloattwoFloatAdd(floata,floatb){BigDecimala1=newBigDecimal(Float.toString(a));BigDecimalb1=newBigDecimal(Float.toString(b));Floatadd=a1.add(b1).floatValue()

  • mysql和oracle的区别有什么

    mysql和oracle的区别有什么1、mysql与oracle都是关系型数据库,应用于各种平台。mysql开源免费的,而oracle则是收费的,并且价格非常高。2、管理工具上mysql的管理工具较少,在Linux下的管理工具的安装有时需要安装额外的包(phpmyadmin,etc),有一定复杂性。oracle有多重成熟命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。oracle支持大并发,大访问量,是OLTP最好的工具。3、数据库的层次结构上mysql:默认用户是root,用户下可以创建好多数据库,

  • Arduino TaskScheduler入门

    Arduino TaskScheduler入门#include<TaskScheduler.h>//回调函数声明,具体要执行的函数内容voidtask_1();//…voidtask_n();//计划任务声明,Task中要执行的函数名Taskt_end();//空任务,按需添加Taskt1(1000,10,&task_1);//任务名(间隔ms,执行次数,&执行函数)//…Tasktn(1000,TASK_FOREVER,&task_n);//TASK_ONCE,执.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号