zoukankan      html  css  js  c++  java
  • SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP

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

  • 相关阅读:
    vim使用笔记
    想象的天空
    修电脑记
    反编译 Component重要类,全文解释 - 组件篇
    被动扫描和主动处理的比较
    第一次运行起来XAML
    学习 Aero 随笔
    Google AdSense 申请已得到批准
    延迟加载的一般实现
    看见几篇文章,收藏一下。
  • 原文地址:https://www.cnblogs.com/personnel/p/9314173.html
Copyright © 2011-2022 走看看