博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP
阅读量:5274 次
发布时间:2019-06-14

本文共 993 字,大约阅读时间需要 3 分钟。

今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE(移动),没了 WM_LBUTTONUP(松开)

百度了一下,找到解决方案:https://bbs.csdn.net/topics/390386415  

网友@信阳毛尖:

一般在 WM_LBUTTONDOWN 消息的处理函数中设置焦点为当前窗口 SetCapture(m_hWnd)

然后再 WM_LBUTTONUP 消息的处理函数中释放焦点 ReleaseCapture()

按照提示,在 case WM_LBUTTONDOWN: { SetCapture() ...},  在 case WM_LBUTTONUP: { ReleaseCapture() ... }, 就可以解决当鼠标移动到窗口外也能捕获到 WM_LBUTTONUP。

 

但是测试的时候发现一个问题, 在 case WM_MOUSEMOVE 中,如果鼠标移到窗口的外的左上角,获取到的坐标 x, y 不对了, 返回值 6xxxx+

接着继续百度吧,又找到这一篇: https://blog.csdn.net/lanbing598235681/article/details/8136337

注意 x y 都是一个LONG 所以它们认为左数第1位是符号位 其他都表示数值而 LOWORD HIWORD 得到的32位数 前16位都是0所以 x y 一直会是正数 不会出现负数 (已经和鼠标在窗口上方和右方矛盾) 而且当lParam 是表示负坐标时 x y会是很大的整数 6xxxx (所以会画到很下面很右面去)

原来读取鼠标坐标 x,y 的写法是:

int x = (int)LOWORD(lParam);//取低位

int y = (int)HIWORD(lParam);//取高位

解决办法:需要将 (int) 改成 (short)

int x = (short)LOWORD(lParam);//取低位

int y = (short)HIWORD(lParam);//取高位

这样就可以获取到正确的 x,y 坐标了。

 

转载于:https://www.cnblogs.com/personnel/p/9314173.html

你可能感兴趣的文章
Python中try...except...else的用法
查看>>
2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)
查看>>
Codeforces 1110 简要题解
查看>>
Python之路【第七篇】:初识Socket
查看>>
hdu 5222
查看>>
tree命令
查看>>
GCD -- 倒计时
查看>>
java集合---迭代器iterator
查看>>
T-SQL and XML
查看>>
linux下安装新硬盘并挂载mount
查看>>
工作中随感
查看>>
【freemarker】渲染列表一系列操作
查看>>
BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】...
查看>>
PHP 数据库访问
查看>>
PHP起点 - PHP常量
查看>>
TopHat
查看>>
P1351 联合权值
查看>>
Oracle EBS PO 接受入库
查看>>
vue-manage-system 后台管理系统开发总结
查看>>
eclipse乱码解决方法
查看>>