MFC 內建並無對話框自動佈局機制,開發者常需手寫 OnSize 計算控制項位置。開源輕量庫 EasySize 以巨集方式宣告式定義控制項錨點與縮放規則,極大簡化開發。本文整理完整整合步驟與常用巨集用法。
Border = Resizing (WS_THICKFRAME),啟用使用者拖曳調整大小。.cpp 或 stdafx.h 加入 #include "EasySize.h"。DECLARE_EASYSIZE。OnInitDialog 中呼叫 INIT_EASYSIZE。OnSize,呼叫 UPDATE_EASYSIZE。BEGIN_EASYSIZE_MAP ... END_EASYSIZE_MAP 區塊,為每個需動態調整的控制項寫入一行 EASYSIZE 巨集。EASYSIZE(control, left, top, right, bottom, options)| 參數 | 可用值 | 含義 |
|---|---|---|
| control | 控制項 ID (如 IDOK) | 目標控制項 |
| left / top / right / bottom | ES_BORDER | 該邊緣與對話框對應邊界保持固定距離 |
ES_KEEPSIZE | 該方向尺寸保持不變 (不拉伸) | |
| 其他控制項 ID | 以該控制項對應邊緣為基準,保持相對距離 | |
| options | 0 / ES_HCENTER / ES_VCENTER / ES_HCENTER|ES_VCENTER | 在計算出的矩形區域內水平/垂直置中 |
BEGIN_EASYSIZE_MAP(CMyDialog)
// OK 按鈕:右下角固定,尺寸不變
EASYSIZE(IDOK, ES_BORDER, ES_BORDER, ES_BORDER, ES_BORDER, 0)
// 取消按鈕:靠右固定,靠下固定,水平置中於剩餘空間
EASYSIZE(IDCANCEL, ES_BORDER, ES_BORDER, ES_BORDER, ES_BORDER, ES_HCENTER)
// 編輯框:左上右下皆貼邊,隨對話框拉伸
EASYSIZE(IDC_EDIT1, ES_BORDER, ES_BORDER, ES_BORDER, ES_BORDER, 0)
// 列表控制項:左上固定,右邊靠近 IDC_EDIT1,下固定,垂直置中
EASYSIZE(IDC_LIST1, ES_BORDER, ES_BORDER, IDC_EDIT1, ES_BORDER, ES_VCENTER)
// 靜態文字:置中於對話框客戶區
EASYSIZE(IDC_STATIC_TITLE, ES_BORDER, ES_BORDER, ES_BORDER, ES_BORDER, ES_HCENTER|ES_VCENTER)
END_EASYSIZE_MAP
在訊息映射加入 ON_WM_SIZING(),並在 OnSizing 中呼叫:
void CMyDialog::OnSizing(UINT fwSide, LPRECT pRect) {
CDialog::OnSizing(fwSide, pRect);
// 僅限制最小尺寸 280x250
EASYSIZE_MINSIZE(280, 250, fwSide, pRect);
// 若需最大尺寸,需自行修改 EasySize.h 增加 EASYSIZE_MAXSIZE 巨集
}
IDC_EDIT1) 必須出現在參考它的控制項之前**,確保基準座標已計算完成。CDialog/CDialogEx),不直接支援 CFormView,需手動轉發 OnSize 至內部對話框物件。CMFCDialogEx),可能與其內建佈局管理衝突,建議二選一。