huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


接受一般的鼠标消息时(如 WM_MOUSEMOVE),从 lparam 得到的鼠标坐标是客户区坐标

https://docs.microsoft.com/zh-cn/windows/win32/inputdev/wm-mousemove  :

  • lParam

  • 低序单词指定游标的 x 坐标。 坐标相对于工作区的左上角

    高序单词指定游标的 y 坐标。 坐标相对于工作区的左上角


但是,如果获取的是 WM_MOUSEWHEEL 消息,则得到的鼠标坐标是屏幕坐标(坑我一把)

https://docs.microsoft.com/zh-CN/windows/win32/inputdev/wm-mousewheel

  • lParam

  • 低序单词指定指针的 x 坐标,相对于屏幕左上角

    高阶单词指定指针的 y 坐标,相对于屏幕左上角


如果是前者,得到的坐标是客户区坐标,则肯定不会出现负数,所以使用 LOWORDHIWORD 宏提取游标位置的 x 坐标和 y 坐标,按理来说是没问题的。

但是如果是后者,获取到的屏幕坐标就可能出现负数(多监视器),但是 LOWORDHIWORD 宏都会产生无符号数量,所以此时就得用 GET_X_LPARAMGET_Y_LPARAM 获取坐标。

看微软原文:

重要

请勿使用 LOWORDHIWORD 宏提取游标位置的 x 坐标和 y 坐标,因为这些宏在具有多个监视器的系统上返回不正确的结果。 具有多个监视器的系统可以具有负 x 和 y 坐标, LOWORDHIWORD 将坐标视为无符号数量。


注意:要使用 GET_X_LPARAMGET_Y_LPARAM 宏提取 x 坐标或 y 坐标,需要包含 windowsx.h。


若要将获取到的屏幕坐标转换为客户区坐标,请使用 ScreenToClient 函数。




返回首页


Copyright (C) 2018-2024 huidong