MFC 屬性表單 / 向導構建全流程
步驟 1:插入屬性頁對話框資源
- 資源視圖 → 右鍵 `Dialog` → `Insert Dialog` → 選擇 `Property Page` (帶 `IDD_PROPPAGE_XXX`)。
- 根據需要插入 2-3 個頁面 (如 `General`、`Advanced`、`Network`)。
- 在每個頁面拖放控件 (Edit、Combo、Check Box 等),設置 ID (如 `IDC_EDIT_PORT`)。
步驟 2:為每個屬性頁創建類
- 類視圖 → 右鍵 `Add Class` → `MFC Class` → `CDialogEx` 基類。
* 類名:`CGeneralPage`、`CAdvancedPage`... 對應步驟 1 的資源 ID。
* 勾選 `DDX/DDV` 支持,自動生成 `DoDataExchange` 綁定控件變量。
步驟 3:創建屬性表單類
- `Add Class` → `MFC Class` → 基類選 **`CPropertySheet`** (或 `CPropertySheetEx`)。
* 類名:`CMyPropSheet`。
* 在構造函數中調用 `AddPage(&m_page1)` 等添加頁面對象。
步驟 4:定義頁面對象並添加到表單
// CMyPropSheet.h
class CMyPropSheet : public CPropertySheet {
DECLARE_DYNAMIC(CMyPropSheet)
public:
CGeneralPage m_page1;
CAdvancedPage m_page2;
CNetworkPage m_page3;
CMyPropSheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
virtual ~CMyPropSheet();
};
// CMyPropSheet.cpp
CMyPropSheet::CMyPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
: CPropertySheet(nIDCaption, pParentWnd, iSelectPage) {
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
// 啟用向導模式 (可選)
SetWizardMode();
}
步驟 5:設置向導模式與頁面激活處理
步驟 6:主界面按鈕彈出屬性表單
void CMainDlg::OnBnClickedBtnConfig() {
CMyPropSheet sheet(IDS_PROPSHEET_CAPTION, this);
sheet.DoModal(); // 模態對話框
}
關鍵點總結
- **資源類同步**:對話框資源 ID、類名、頭文件包含關係必須一一對應。
- **頁面對象作為成員變量** 定義在 Sheet 類中,生命周期隨 Sheet 自動管理。
- **向導模式** 需 `SetWizardMode()` + 各頁 `OnSetActive()` 設置按鈕狀態 (`PSWIZB_NEXT`/`BACK`/`FINISH`/`DISABLEDFINISH`)。
- **數據交換**:頁面類 `DoDataExchange` 綁定控件,Sheet 關閉時自動 `UpdateData(TRUE)` 回寫。