上一講雞啄米講了屬性頁對話框和相關的兩個類CPropertyPage類和CPropertySheet類,對使用屬性頁對話框做準備。本節將為大家演示如何創建向導對話框。

       仍然以前面的“加法計算器”的例子為基礎,在其中加入向導對話框,我們可以用它來說明加法計算器的使用方法,一步一步引導用戶操作,這也是比較常見的用法。

       加法計算器使用時大概可以分為三步:輸入被加數、輸入加數、點“計算”按鈕。

       雞啄米就詳細說明向導對話框的創建步驟:

       1.創建屬性頁對話框資源

       根據創建對話框模板和修改對話框屬性中所講方法,在“Resource View”的Dialog”節點上點右鍵,然后在右鍵菜單中選擇“Insert Dialog”創建第一個對話框模板,對話框的ID屬性設置為IDD_SUMMAND_PAGE,Caption屬性改為“被加數頁”,Style屬性在下拉列表中選擇“Child”,Border屬性在下拉列表中選擇“Thin”。

       刪除“OK”和“Cancel”按鈕,再按照為對話框添加控件中所講方法,添加一個靜態文本框,并修改靜態文本框的Caption屬性為“請先輸入double型被加數”。

       按照上述步驟,繼續添加第二個和第三個對話框資源。第二個對話框模板的ID設為IDD_ADDEND_PAGE,Caption屬性改為“加數頁”,也添加一個靜態文本框,Caption設為“請繼續輸入double型加數”,其他屬性同第一個對話框。第三個對話框模板的ID設為IDD_ADD_PAGE,Caption屬性改為“計算頁”,添加靜態文本框的Caption屬性改為“最后請按下“計算”按鈕”,其他屬性也第一個對話框一樣。

       2.創建屬性頁類

       按照創建對話框類和添加控件變量中的方法,在第一個對話框模板上點右鍵,在右鍵菜單中選擇“Add Class”,彈出類向導對話框,在“Class name”編輯框中輸入類名“CSummandPage”,與之前不同的是,因為屬性頁類都應繼承于CPropertyPage類,所以要修改下面“Base class”的選項,在下拉列表中選擇“CPropertyPage”。

       因為是第一個屬性頁,所以它應該有一個“下一步”按鈕,在哪里添加呢?上一講CPropertyPage類的可重載函數中提到,OnSetActive函數用于處理屬性頁被切換為當前活動頁的消息,所以我們可以在OnSetActive函數中進行相關設置。

       那怎樣重載OnSetActive函數呢?我們可以在“Class View”中找到“CSummandPage”節點,點右鍵彈出右鍵菜單,選擇“Properties”,然后VS2010右側面板上會顯示對話框的屬性列表,屬性列表的工具欄上有個tip信息為“Overrides”的按鈕,按下它,下方列表中就列出了重載函數,找到“OnSetActive”,點其右側空白列表項出現向下箭頭,再點箭頭就在下面出現了“<Add>OnSetActive”的選項,選擇它就會自動在CSummandPage類中添加函數OnSetActive。

 

       我們只需在OnSetActive函數體中添加相關代碼就可以實現添加“下一步”按鈕的效果了。新的函數體如下:

C++代碼
  1. BOOL CSummandPage::OnSetActive()   
  2. {   
  3.     // TODO: Add your specialized code here and/or call the base class   
  4.   
  5.     // 獲得父窗口,即屬性表CPropertySheet類   
  6.     CPropertySheet* psheet = (CPropertySheet*) GetParent();   
  7.     // 設置屬性表只有“下一步”按鈕   
  8.     psheet->SetWizardButtons(PSWIZB_NEXT);   
  9.   
  10.     return CPropertyPage::OnSetActive();   
  11. }  

       為第二個和第三個對話框也分別添加屬性頁類CAddendPage和CAddPage。但第二個對話框的屬性頁不需要重載OnSetActive函數。第三個對話框是最后一個對話框,所以不需要“下一步”按鈕,而應該換成“完成”按鈕,所以也需要重載OnSetActive函數設置“完成”按鈕。重載后的OnSetActive如下:

C++代碼
  1. BOOL CAddPage::OnSetActive()   
  2. {   
  3.     // TODO: Add your specialized code here and/or call the base class   
  4.   
  5.     // 獲得父窗口,即屬性表CPropertySheet類   
  6.     CPropertySheet* psheet = (CPropertySheet*) GetParent();   
  7.     //設置屬性表只有“完成”按鈕   
  8.     psheet->SetFinishText(_T("完成"));   
  9.   
  10.     return CPropertyPage::OnSetActive();   
  11. }  

       上面的代碼段中,字符串“完成”前加了個_T,這是因為本工程創建的時候用的默認的Unicode字符集,而如果“完成”前不加_T就是ASCII字符串。_T實際上是一個宏,工程的字符集選擇為Unicode時字符串就轉為Unicode字符串,選擇為Muli-Byte時就轉為ASCII字符串。我們可以在Solution Explorer的Addition根節點上點右鍵,在右鍵菜單上選擇“Properties”,彈出工程的屬性對話框,Configuration Properties->General右側列表中的Character Set就顯示選擇的字符集。

       那點了第三個屬性頁上的“完成”按鈕我們想進行某些處理的話,就重載OnWizardFinish函數,方法同OnSetActive函數。重載后的OnWizardFinish函數如下:

C++代碼
  1. BOOL CAddPage::OnWizardFinish()   
  2. {   
  3.     // TODO: Add your specialized code here and/or call the base class   
  4.   
  5.     // 提示向導完成   
  6.     MessageBox(_T("使用說明向導已閱讀完!"));   
  7.   
  8.     return CPropertyPage::OnWizardFinish();   
  9. }  

        3.創建屬性表類

       屬性頁資源和屬性頁類創建完以后,還不能生成向導對話框,我們還需要一個屬性表類,來容納這些屬性頁。

       在Solution Explorer視圖中的根節點“Addition”上點右鍵,在右鍵菜單中選擇Add->Class,彈出“Add Class”對話框,然后在中間區域中選擇“MFC Class”,點“Add”按鈕,彈出另一個類向導對話框,設置Class name為CAddSheet,Base class選擇“CPropertySheet”,點“Finish”按鈕,這樣就屬性表類就建好了。

       接下來,在新生成的AddSheet.h中包含三個屬性頁類的頭文件:

       #include "SummandPage.h"
       #include "AddendPage.h"
       #include "AddPage.h"

       之后在AddSheet.h中添加private變量:

       CSummandPage    m_summandPage;
       CAddendPage     m_addendPage;
       CAddPage        m_addPage;

       然后在AddSheet.cpp文件中修改CAddSheet的兩個構造函數為:

C++代碼
  1. CAddSheet::CAddSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)   
  2.     :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)   
  3. {   
  4.     // 添加三個屬性頁到屬性表   
  5.     AddPage(&m_summandPage);   
  6.     AddPage(&m_addendPage);   
  7.     AddPage(&m_addPage);   
  8. }   
  9.   
  10. CAddSheet::CAddSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)   
  11.     :CPropertySheet(pszCaption, pParentWnd, iSelectPage)   
  12. {   
  13.     // 添加三個屬性頁到屬性表   
  14.     AddPage(&m_summandPage);   
  15.     AddPage(&m_addendPage);   
  16.     AddPage(&m_addPage);   
  17. }  

        4.顯示向導對話框

        我們在加法計算器對話框上添加一個按鈕,點擊它就打開向導對話框。此按鈕的ID設為IDC_INSTRUCT_BUTTON,Caption屬性設為“使用說明”。

        按照為控件添加消息處理函數中所講方法,為IDC_INSTRUCT_BUTTON按鈕在CAdditionDlg類中添加點擊消息的處理函數OnBnClickedInstructButton。然后在AdditionDlg.cpp文件中包含CAddSheet的頭文件:#include "AddSheet.h"。最后修改OnBnClickedInstructButton函數如下:

C++代碼
  1. void CAdditionDlg::OnBnClickedInstructButton()   
  2. {   
  3.     // TODO: Add your control notification handler code here   
  4.   
  5.     // 創建屬性表對象   
  6.     CAddSheet sheet(_T(""));   
  7.     // 設置屬性對話框為向導對話框   
  8.     sheet.SetWizardMode();   
  9.     // 打開模態向導對話框   
  10.     sheet.DoModal();   
  11. }  

       到此,向導對話框就完整的創建完成了,并可以在加法計算器對話框上點“使用說明”按鈕顯示出來。我們來看看效果吧:

       上圖只是被加數頁的效果,點其上“下一步”按鈕就可以繼續顯示后面的兩個頁面。

       是不是向導對話框沒有以前想象的那般復雜了?大家可以發揮想象,進行更復雜的修改,實現更完善的功能。依然歡迎朋友們到雞啄米博客來交流學習。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.ojizl5.fun/software/166.html
2012年4月25日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:108