屬性表(Property Sheet)提供分頁式對話框,適合分類設定介面。核心類別:`CPropertyPage`(單一頁面)與 `CPropertySheet`(容器)。本文涵蓋資源建立、類別產生、模態/非模態建立、動態頁面增減與常見陷阱。
建立步驟
- 資源編輯器:插入「Property Page」資源,或插入 Dialog 並設 Style=Child、Border=Thin
- ClassWizard:對每個頁面資源建立類別,基類選 `CPropertyPage`
- Sheet 類別:建立 `CPropertySheet` 衍生類,將頁面物件作為成員變數,建構函數中 `AddPage`
Sheet 類別範例
class CMyPropSheet : public CPropertySheet {
CPage1 m_page1;
CPage2 m_page2;
public:
CMyPropSheet() : CPropertySheet(_T("設定"), NULL, 0) {
m_page1.Construct(IDD_PAGE_1);
m_page2.Construct(IDD_PAGE_2);
AddPage(&m_page1);
AddPage(&m_page2);
}
};
模態 vs 非模態
| 類型 | 建立方式 | 生命週期 | 適用場景 |
| 模態 | `sheet.DoModal()` | 函數返回時銷毀 | 設定對話框、精靈 |
| 非模態 | `sheet.Create()` | 手動 `DestroyWindow()` | 工具面板、長期顯示 |
動態增減頁面
- `AddPage(CPropertyPage*)`:新增頁面
- `RemovePage(int nPageIndex)` 或 `RemovePage(CPropertyPage*)`:移除頁面
- `SetActivePage(int nPageIndex)`:程式切換頁面
- `GetPageCount()` / `GetPage(index)`:枚舉頁面
常見問題與技巧
- 頁面資源必須設 **Style=Child, Border=Thin**,否則顯示異常
- 非模態 Sheet 需在父視窗銷毀前手動銷毀,避免記憶體洩漏
- 頁面間共享資料:放在 Sheet 類別成員變數,頁面透過 `GetParent()->m_xxx` 存取
- 嚮導模式:`SetWizardMode()` 後頁面底部顯示「上一步/下一步/完成」按鈕
- 套用按鈕:覆寫 `OnApply()` 處理「套用」邏輯,`OnOK()` 預設呼叫 `OnApply()` 再關閉
- 上一篇文章: MFC 座標映射模式:從 MM_TEXT 到 MM_ANISOTROPIC 完整解析
- 下一篇文章: MFC 通用對話框:檔案、顏色、字型對話框完整用法
Copyright ©
程式碼之家 All Rights Reserved