【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将鼠标坐标结构体传入直接得到鼠标相对于客户区的坐标。
◉ 完美解决: 该方法是最简洁最直接的方法,设计人员肯定也想到这个问题了吧!才给出了这么好的一个方法。
星之所在,心之所向(寒冰小澈)

浙公网安备 33010602011771号