Delphi IDE 主視窗最大化時不會佔滿整個螢幕,這得益於 WM_GETMINMAXINFO 訊息機制。本文詳細說明如何攔截此訊息,精確控制表單的最大/最小尺寸、最大化位置與追蹤尺寸,打造符合人因工學的視窗行為。
type
TForm1 = class(TForm)
private
procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
end;
procedure TForm1.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
begin
with Message.MinMaxInfo^ do
begin
// 最大化尺寸(螢幕工作區座標)
ptMaxSize.X := 800; // 最大寬度
ptMaxSize.Y := 600; // 最大高度
// 最大化位置(左上角座標)
ptMaxPosition.X := 100; // 距離螢幕左邊 100 像素
ptMaxPosition.Y := 50; // 距離螢幕上邊 50 像素
// 最小追蹤尺寸(使用者拖曳調整的最小值)
ptMinTrackSize.X := 400;
ptMinTrackSize.Y := 300;
// 最大追蹤尺寸(使用者拖曳調整的最大值)
ptMaxTrackSize.X := 1200;
ptMaxTrackSize.Y := 900;
end;
Message.Result := 0; // 告知 Windows 已處理
inherited; // 呼叫繼承實作(重要)
end;
| 欄位 | 型別 | 說明 |
|---|---|---|
ptReserved | TPoint | 保留,勿修改 |
ptMaxSize | TPoint | 最大化時的視窗寬高(X=寬, Y=高) |
ptMaxPosition | TPoint | 最大化時左上角座標(相對螢幕工作區) |
ptMinTrackSize | TPoint | 使用者拖曳調整時的最小寬高 |
ptMaxTrackSize | TPoint | 使用者拖曳調整時的最大寬高 |
procedure TForm1.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
var
WorkArea: TRect;
begin
// 取得工作區(排除工作列)
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
with Message.MinMaxInfo^ do
begin
// 最大化不超過工作區 90%
ptMaxSize.X := Round((WorkArea.Right - WorkArea.Left) * 0.9);
ptMaxSize.Y := Round((WorkArea.Bottom - WorkArea.Top) * 0.9);
// 置中顯示
ptMaxPosition.X := (WorkArea.Right - WorkArea.Left - ptMaxSize.X) div 2;
ptMaxPosition.Y := (WorkArea.Bottom - WorkArea.Top - ptMaxSize.Y) div 2;
// 最小追蹤尺寸固定
ptMinTrackSize.X := 400;
ptMinTrackSize.Y := 300;
end;
Message.Result := 0;
inherited;
end;
ptMaxSize.X := 0; // 0 表示使用預設
ptMaxSize.Y := 0;
ptMaxTrackSize.X := 1200; // 僅限制拖曳上限
ptMaxTrackSize.Y := 900;
ptMinTrackSize.X := 800;
ptMinTrackSize.Y := 600;
ptMaxTrackSize.X := 800;
ptMaxTrackSize.Y := 600;
// 並設定 BorderStyle := bsDialog 或 bsSingle
ptMaxPosition 相對於螢幕工作區(排除工作列),非虛擬螢幕座標ptMinTrackSize 不影響最小化動畫目標位置| 方法 | 適用場景 | 靈活度 |
|---|---|---|
WM_GETMINMAXINFO | 精細控制最大/最小/追蹤尺寸、最大化位置 | 最高 |
Constraints 屬性 | 簡單的最小/最大尺寸限制 | 中等(設計時/執行時皆可) |
BorderStyle := bsDialog | 固定大小對話框 | 低 |
SetWindowPos + SWP_NOSIZE | 運行時動態強制尺寸 | 中等(需自行處理訊息迴路) |
WM_GETMINMAXINFO 是 Delphi 控制視窗幾何約束的最強大原生機制。透過正確設定 MINMAXINFO 結構體各欄位,可實現從「禁止調整大小」到「動態適應螢幕工作區」的多樣化視窗行為。建議搭配 Constraints 屬性使用:設計時設定基礎約束,運行時透過訊息處理實現動態邏輯,打造專業級的使用者介面體驗。