Windows 使用兩種座標系:螢幕座標 (以螢幕左上角為原點) 與 用戶端座標 (以視窗用戶端區域左上角為原點)。GetCursorPos 取得螢幕座標,VCL 提供 ScreenToClient / ClientToScreen 方法互轉,亦可直接呼叫同名 API 函數。
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
str: string;
begin
str := Format('%d,%d', [X, Y]);
ShowMessage(str);
end;
var
ps: TPoint;
str: string;
begin
GetCursorPos(ps);
str := Format('%d,%d', [ps.X, ps.Y]);
ShowMessage(str);
end;
var
ps: TPoint;
str: string;
begin
GetCursorPos(ps);
ps := ScreenToClient(ps); // TWinControl 方法
str := Format('%d,%d', [ps.X, ps.Y]);
ShowMessage(str);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
str: string;
ps: TPoint;
begin
str := Format('%d,%d', [X, Y]); // 用戶端座標
ShowMessage(str);
ps := Point(X, Y);
ps := ClientToScreen(ps); // 轉螢幕座標
str := Format('%d,%d', [ps.X, ps.Y]);
ShowMessage(str);
end;
| VCL 方法 | WinAPI 函數 | 用途 |
|---|---|---|
ScreenToClient | ScreenToClient(hWnd, lpPoint) | 螢幕 → 用戶端 |
ClientToScreen | ClientToScreen(hWnd, lpPoint) | 用戶端 → 螢幕 |
| - | GetCursorPos(lpPoint) | 取得螢幕座標 |
掌握座標轉換,拖放、ToolTip 定位、跨視窗互動才能得心應手。