• 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 坐标了。

  • 相关阅读:
    Visual Studio 正则表达式替换
    NHibernate MappingException. No Persister
    C#枚举
    测试
    NHibernate & INotifyPropertyChanged
    NHibernate Profiler使用方法
    根据条件动态拼接LinQ的where条件字串
    wpf中ToolTip实现
    jquery的colorbox关闭并传递数据到父窗
    c#简易反射调用泛型方法
  • 原文地址:https://www.cnblogs.com/personnel/p/9314173.html
Copyright © 2020-2023  润新知