最終方案
使用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將鼠標座標結構體傳入直接得到鼠標相對於客戶區的座標。
◉ 完美解決: 該方法是最簡潔最直接的方法,設計人員肯定也想到這個問題了吧!纔給出了這麼好的一個方法。
星之所在,心之所向(寒冰小澈)