【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將鼠標座標結構體傳入直接得到鼠標相對於客戶區的座標。

完美解決: 該方法是最簡潔最直接的方法,設計人員肯定也想到這個問題了吧!纔給出了這麼好的一個方法。


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章