【windows编程】怎么获得鼠标相对于客户区的坐标?(方法探索历程)

最终方案

使用ScreenToClient, 代码如下:

POINT mousePos;  //存储鼠标微位置
int mx, my;  //存放鼠标相对于客户区的坐标
GetCursorPos(&mousePos);  //获取鼠标位置
ScreenToClient(hwnd, &mousePos);  //获得鼠标相对客户区的位置
mx = mousePos.x;  //鼠标相对客户区左上角的 x 坐标
my = mousePos.y;  //鼠标相对客户区左上角的 y 坐标

探索历程


初步解决方法: 使用GetCursorPos获得鼠标坐标结构体rect,得到坐标(rect.x, rect.y)

发现问题: 获得的鼠标坐标是相对于整个电脑屏幕的,直接用在客户区中行不通,会偏移。


方法探索1: 使用GetWindowRect获得窗口范围rect,用获得的鼠标坐标减去窗口左上角坐标(rect.left, rect.top),再用鼠标坐标减去该坐标,从而计算出鼠标相对于窗口的坐标。

发现问题: GetWindowRect获得的是整个窗口的坐标而不是客户区的坐标,窗口还有标题栏等的干扰导致得到的坐标并不是真正相对客户区的,会有偏差。


方法探索2: 使用GetClientRect获得窗口客户区的范围rect,操作如方法1获得鼠标相对坐标
发现问题: 该方法是失败的!原因在于获得的范围rect本身就是相对客户区的,也就是说,左上角坐标(rect.left, rect.top)对应的值为(0, 0),而右下角对应的是(客户区宽度,客户区高度)。该方法行不通。


方法探索3: 使用ScreenToClient将鼠标坐标结构体传入直接得到鼠标相对于客户区的坐标。

完美解决: 该方法是最简洁最直接的方法,设计人员肯定也想到这个问题了吧!才给出了这么好的一个方法。


星之所在,心之所向(寒冰小澈)

你可能感兴趣的:(笔记,实战经验,windows编程,windows)