今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 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 坐标了。

SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP的更多相关文章

  1. html 获取鼠标左键事件,滚轮点击事件,右键点击事件

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. 使用鼠标左键事件实现VR中的Eye Gaze Input

    1.光标以及光标动画的显示 using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...

  3. WPF移动Window窗体(鼠标点击左键移动窗体自定义行为)

    XAML代码部分:1.引用System.Windows.Interactivity 2.为指定的控件添加一个拖动的行为 3.很简单的了解行为的作用和用法 <Window xmlns=" ...

  4. SetCapture ReleaseCapture

    函数功能:该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕获鼠标.假设鼠标光标在还有一个线程创建的窗体 ...

  5. SQL 各种连接:内连接,外连接(左外,右外,完全外)

    在讲述之前,假设有如下两个表EMP, DEPT, 并且他们数据如下:

  6. iOS 捕获系统外异常

    iOS 捕获系统外异常 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太 ...

  7. mysql的内连接,外连接(左外连接,右外连接)巩固

    1:mysql的内连接: 内连接(inner join):显示左表以及右表符合连接条件的记录: select a.goods_id,a.goods_name,b.cate_name from tdb_ ...

  8. 内连接,外链接(左连接、右连接、全连接),交叉连接大总结+附SQL JOINS图解[转]

    1.什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 2.分类: 首先划分一下,连接分为三种:内连接.外连接.交叉连接 内连接(INNER ...

  9. mysql 数据操作 多表查询 多表连接查询 外链接之左连接 右连接

    1.外链接之左连接:优先显示左表全部记录   left join 在内连接的基础上保留左表的记录 即便左表有一条记录和右表没有关系,也把他留下 mysql> select * from empl ...

随机推荐

  1. idea的pom.xml中提示dependency‘’not found

    今天下午在更新svn上的项目到本地,发现pom文件中的如下依赖的version一直标红,鼠标放上去显示“dependency not found.” 同时检查了Maven Projects中该项目引入 ...

  2. jenkins中通过execute shell启动的进程会被杀死的问题

    在jenkins中配置自动更新部署项目时,如果采取用execute shell启动/关闭tomcat,会发现可以进行关闭tomcat, 但是无法启动tomcat,虽然构建会显示执行成功,但是查看进程, ...

  3. web浏览器兼容问题

    1.居中问题 div中,ie默认居中,而ff(firefox)默认是向左对齐.解决办法:margin 0 auto 2.高度问题 如果有两个div排列或者嵌套,如果第一个div设置了高度,而内容超出d ...

  4. Javascript 实现复制(Copy)动作方法大全

    一.实现点击按钮,复制文本框中的的内容 <script type="text/javascript"> function copyUrl2() { var Url2=d ...

  5. Windows 7 quick launch

    %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar %AppData%\Microsoft\Internet ...

  6. Modeling Filters and Whitening Filters

    Colored and White Process White Process White Process,又称为White Noise(白噪声),其中white来源于白光,寓意着PSD的平坦分布,w ...

  7. Promise.all和Promise.race区别,和使用场景

    一.Pomise.all的使用 常见使用场景 : 多个异步结果合并到一起 Promise.all可以将多个Promise实例包装成一个新的Promise实例.用于将多个Promise实例,包装成一个新 ...

  8. jdk6使用WebSocket

    pom.xml <dependency> <groupId>org.java-websocket</groupId> <artifactId>Java- ...

  9. Vmware 控制脚本

    #_*_ coding:utf8 _*_ import sys,time import yaml import re import os import ssl import random import ...

  10. ExaWizards 2019

    AB:div 3 AB??? C:div 1 C???场内自闭的直接去看D.事实上是个傻逼题,注意到物品相对顺序不变,二分边界即可. #include<iostream> #include ...