GetDeviceCaps(hDC, nIndex) 可查詢裝置內容能力。關鍵索引值:
| 索引常數 | 含義 | 單位 |
|---|---|---|
HORZSIZE | 螢幕寬度 | 毫米 |
VERTSIZE | 螢幕高度 | 毫米 |
HORZRES | 螢幕寬度 | 像素 |
VERTRES | 螢幕高度 | 像素 |
LOGPIXELSX | 水平 DPI | Dots Per Inch |
LOGPIXELSY | 垂直 DPI | Dots Per Inch |
procedure TForm1.FormCreate(Sender: TObject);
var
mmW, mmH: Integer; // 毫米尺寸
pixW, pixH: Integer; // 像素尺寸
PixPerMm: Double; // 每毫米像素數
begin
// 取得裝置內容
mmW := GetDeviceCaps(Canvas.Handle, HORZSIZE);
mmH := GetDeviceCaps(Canvas.Handle, VERTSIZE);
pixW := GetDeviceCaps(Canvas.Handle, HORZRES);
pixH := GetDeviceCaps(Canvas.Handle, VERTRES);
ShowMessageFmt('螢幕寬: %d 毫米; 高: %d 毫米', [mmW, mmH]);
ShowMessageFmt('螢幕寬: %d 像素; 高: %d 像素', [pixW, pixH]);
// 計算 1 毫米 = 幾像素
PixPerMm := pixW / mmW; // 水平
ShowMessageFmt('水平: 1 毫米 = %.2f 像素', [PixPerMm]);
PixPerMm := pixH / mmH; // 垂直
ShowMessageFmt('垂直: 1 毫米 = %.2f 像素', [PixPerMm]);
// 一步到位
ShowMessageFmt('水平 DPI: %d', [GetDeviceCaps(Canvas.Handle, LOGPIXELSX)]);
end;
螢幕寬: 320 毫米; 高: 240 毫米 螢幕寬: 1024 像素; 高: 768 像素 水平: 1 毫米 = 3.20 像素 垂直: 1 毫米 = 3.20 像素 水平 DPI: 96
1 英吋 = 25.4 毫米
DPI = 每英吋像素數
像素/毫米 = DPI / 25.4
例: 96 DPI → 96 / 25.4 ≈ 3.78 像素/毫米
實際 GetDeviceCaps 回傳會因驅動程式回報而異
Canvas.Handle 需在表單可見時有效,FormCreate 通常可用Per Monitor DPI Aware 並使用 GetDpiForWindow (Win10 1607+)GetDeviceCaps 是取得螢幕物理與邏輯尺寸的標準 API。透過 HORZSIZE/VERTSIZE (毫米) 與 HORZRES/VERTRES (像素) 即可計算「1毫米等於多少像素」,進而實現物理尺寸感知的繪圖、列印與 UI 縮放。