首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Delphi 限制視窗大小與位置:WM_GETMINMAXINFO 訊息處理完整指南

     編輯:更多程式設計知識

Delphi IDE 主視窗最大化時不會佔滿整個螢幕,這得益於 WM_GETMINMAXINFO 訊息機制。本文詳細說明如何攔截此訊息,精確控制表單的最大/最小尺寸、最大化位置與追蹤尺寸,打造符合人因工學的視窗行為。

核心實作步驟

1. 私有區宣告訊息處理函數

type
  TForm1 = class(TForm)
  private
    procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
  end;

2. 實作訊息處理邏輯

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;

MINMAXINFO 結構體完整欄位說明

欄位型別說明
ptReservedTPoint保留,勿修改
ptMaxSizeTPoint最大化時的視窗寬高(X=寬, Y=高)
ptMaxPositionTPoint最大化時左上角座標(相對螢幕工作區)
ptMinTrackSizeTPoint使用者拖曳調整時的最小寬高
ptMaxTrackSizeTPoint使用者拖曳調整時的最大寬高

進階應用場景

動態依據螢幕解析度調整

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

常見坑點與注意事項

  • 必須呼叫 inherited:確保 VCL 內部預設處理(如邊框樣式調整)正常執行
  • 座標系統:ptMaxPosition 相對於螢幕工作區(排除工作列),非虛擬螢幕座標
  • DPI 感知:高 DPI 環境下,尺寸單位為邏輯像素;建議啟用 Per-Monitor DPI Awareness
  • 最小化動畫:ptMinTrackSize 不影響最小化動畫目標位置
  • 多螢幕:最大化位置若超出當前螢幕工作區,Windows 會自動修正

替代方案比較

方法適用場景靈活度
WM_GETMINMAXINFO精細控制最大/最小/追蹤尺寸、最大化位置最高
Constraints 屬性簡單的最小/最大尺寸限制中等(設計時/執行時皆可)
BorderStyle := bsDialog固定大小對話框低
SetWindowPos + SWP_NOSIZE運行時動態強制尺寸中等(需自行處理訊息迴路)

總結

WM_GETMINMAXINFO 是 Delphi 控制視窗幾何約束的最強大原生機制。透過正確設定 MINMAXINFO 結構體各欄位,可實現從「禁止調整大小」到「動態適應螢幕工作區」的多樣化視窗行為。建議搭配 Constraints 屬性使用:設計時設定基礎約束,運行時透過訊息處理實現動態邏輯,打造專業級的使用者介面體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved