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

VC++ 精通嚮導程式:從標準 CPropertySheet 到完全自訂 UI 的 CustomWizard 實作

     編輯:關於VC++

前言

嚮導對話框將複雜設定拆解為逐步引導,提升使用者體驗。MFC 提供 CPropertySheet + CPropertyPage 快速建構標準嚮導,但按鈕樣式、位置、圖示皆不可調。本文先示範標準嚮導,再完整實作一個完全自訂 UI 的 CustomWizard,支援任意按鈕樣式、動畫切換、自定版面。

第一部分:標準嚮導(CPropertySheet 模式)

核心類別關係

  • CPropertyPage:繼承 CDialog,Style 必須為 Child、Border 為 Thin
  • CPropertySheet:容器,DoModal() 後自動擁有「上一步/下一步/完成/取消」按鈕

建立步驟

  1. 新增三個 Dialog 資源 IDD_STEP1/2/3,對應類別 CStep1/2/3 繼承 CPropertyPage
  2. 新增 CWizard 繼承 CPropertySheet
  3. 啟動程式碼:
    
    CWizard MyWizard(_T("我的嚮導"), this, 1);
    CStep1 MyStep1; CStep2 MyStep2; CStep3 MyStep3;
    MyWizard.AddPage(&MyStep1);
    MyWizard.AddPage(&MyStep2);
    MyWizard.AddPage(&MyStep3);
    MyWizard.SetWizardMode();        // 關鍵:切換為嚮導模式
    MyWizard.SetActivePage(&MyStep1); // 指定第一頁
    MyWizard.DoModal();
        
  4. 各頁面重寫 OnSetActive 控制按鈕顯示:
    
    // 第一頁:只有下一步
    pParent->SetWizardButtons(PSWIZB_NEXT);
    // 中間頁:上一步 + 下一步
    pParent->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
    // 最後頁:上一步 + 完成
    pParent->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
        

第二部分:自訂嚮導 CustomWizard(完全掌控 UI)

設計核心

  • 嚮導主視窗 CWizard : public CDialog(資源 IDC_WIZARD)
  • 每一步為獨立 CDialog(Child、無標題、無邊框)
  • 單向鏈表 PAGELINK 管理所有頁面
  • 預先計算頁面顯示矩形 rectPage
  • 自繪按鈕(可加圖示、自訂位置、預設完成按鈕)

關鍵資料結構


struct PAGELINK {
    UINT nNum;          // 頁碼
    CDialog* pDialog;   // 頁面對話框指標
    PAGELINK* Next;     // 下一頁
};

核心功能實現

新增頁面 AddPage()


void CWizard::AddPage(CDialog* pDialog, UINT nID) {
    PAGELINK* pNew = new PAGELINK;
    pNew->pDialog = pDialog;
    pNew->pDialog->Create(nID, this);          // 無模式建立
    pNew->pDialog->ShowWindow(SW_HIDE);
    pNew->pDialog->MoveWindow(rectPage);       // 定位到預設區域
    // 檢查樣式:必須 WS_CHILD、無 WS_BORDER
    // 插入鏈表尾端...
}

切換頁面 ShowPage()


void CWizard::ShowPage(UINT nPos) {
    // 遍歷鏈表,顯示 nPos,隱藏其他
    // 更新 nCurrentPage
    // 呼叫 SetWizButton() 更新按鈕狀態
}

按鈕狀態控制 SetWizButton()


void CWizard::SetWizButton(UINT uFlag) {
    // uFlag: 0=首頁(禁用上一步), 1=中間頁, 2=尾頁(禁用下一步,啟用完成)
    GetDlgItem(IDC_PREV)->EnableWindow(uFlag != 0);
    GetDlgItem(IDC_NEXT)->EnableWindow(uFlag != 2);
    GetDlgItem(IDC_FINISH)->EnableWindow(uFlag == 2);
}

按鈕事件處理


void CWizard::OnNext()  { ShowPage(++nCurrentPage); }
void CWizard::OnPrev()  { ShowPage(--nCurrentPage); }
void CWizard::OnFinish(){ AfxMessageBox(_T("採用預設值完成嚮導")); OnOK(); }
void CWizard::OnCancel(){ if (AfxMessageBox(IDS_QUIT, MB_OKCANCEL|MB_ICONQUESTION)==IDCANCEL) return; OnCancel(); }

初始化與清理


BOOL CWizard::OnInitDialog() {
    CDialog::OnInitDialog();
    // 計算 rectPage:以 IDC_POS 控制項為參考區域
    // 建立三個頁面並 AddPage
    ShowPage(1);
    return TRUE;
}
void CWizard::OnDestroy() {
    // 遍歷鏈表 DestroyWindow + delete 每個頁面與節點
    CDialog::OnDestroy();
}

啟動自訂嚮導


void CCustomWizardDlg::OnBeginWiz() {
    CWizard MyWiz;
    MyWiz.DoModal();
}

執行畫面對比

標準嚮導範例 標準嚮導效果 自訂嚮導主視窗 自訂嚮導頁面

總結

特性標準嚮導自訂嚮導
開發速度極快中等
按鈕樣式/位置固定完全自訂
頁面切換動畫無可自行實作
預設完成按鈕無支援
適用場景內部工具、快速原型商業軟體、品牌化 UI

完整原始碼請參考本文配套下載。兩種方案均在 VC6.0 + Win2000 編譯通過,亦相容新版 Visual Studio。

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