ClientToScreen()函数不处理签名的客户端坐标吗?

k3fezbri  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(101)

为了实现拖放功能,当我收到按钮按下消息时,我捕获光标并检测当我收到按钮按下消息时的坐标。为了检测当我收到按钮按下消息时光标所在的窗口类,我首先使用ClientToScreen()将客户端坐标转换为屏幕坐标,使用WindowFromPoint()获取窗口句柄,然后使用GetClassName()获取类名。
问题是当光标位于工作区的左侧或上方时。如API文档的ClientToScreen()备注部分所述,客户端坐标为负值。但是,当调用ClientToScreen()时,客户端坐标不会被视为有符号值,并且结果坐标不是预期值。
我觉得奇怪的是,文档会注意到期望负的客户端坐标,然后函数无法处理它们。典型的解决方法是在客户端区域原点调用ClientToScreen()并从结果中减去差值吗?

5n0oy7gb

5n0oy7gb1#

这似乎是一个转换问题。WM_LBUTTONUP消息的lParam将x和y坐标作为有符号的SHORT(16位)。由于这些是有符号的值,因此不能简单地将它们设置为等于POINT结构的x和y坐标。ClientToScreen()在POINT结构上工作,该结构将每个坐标存储为LONG(32位),因此使二进制补码SHORT值不正确。
感谢@RaymondChen为我指明了正确的方向,以及你在这个论坛内外所做的一切。

相关问题