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

MFC 對話框自由縮放:EasySize 庫完整整合指南

     編輯:關於C語言

MFC 內建並無對話框自動佈局機制,開發者常需手寫 OnSize 計算控制項位置。開源輕量庫 EasySize 以巨集方式宣告式定義控制項錨點與縮放規則,極大簡化開發。本文整理完整整合步驟與常用巨集用法。

整合步驟 (6 步走)

  1. 對話框屬性: 設定 Border = Resizing (WS_THICKFRAME),啟用使用者拖曳調整大小。
  2. 包含標頭: 主對話框 .cpp 或 stdafx.h 加入 #include "EasySize.h"。
  3. 類別宣告巨集: 在對話框類別定義中加入 DECLARE_EASYSIZE。
  4. 初始化巨集: OnInitDialog 中呼叫 INIT_EASYSIZE。
  5. 處理 WM_SIZE: 重寫 OnSize,呼叫 UPDATE_EASYSIZE。
  6. 定義佈局映射表: 在類別實作檔中,以 BEGIN_EASYSIZE_MAP ... END_EASYSIZE_MAP 區塊,為每個需動態調整的控制項寫入一行 EASYSIZE 巨集。

核心巨集:EASYSIZE(control, left, top, right, bottom, options)

參數可用值含義
control控制項 ID (如 IDOK)目標控制項
left / top / right / bottomES_BORDER該邊緣與對話框對應邊界保持固定距離
ES_KEEPSIZE該方向尺寸保持不變 (不拉伸)
其他控制項 ID以該控制項對應邊緣為基準,保持相對距離
options0 / 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) 必須出現在參考它的控制項之前**,確保基準座標已計算完成。
  • EasySize 僅支援對話框類別 (CDialog/CDialogEx),不直接支援 CFormView,需手動轉發 OnSize 至內部對話框物件。
  • 若專案已使用 MFC Feature Pack (CMFCDialogEx),可能與其內建佈局管理衝突,建議二選一。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved