VS2010/MFC編程入門之十四(對話框:嚮導對話框的建立及顯示)

原文地址:http://www.jizhuomi.com/software/166.htmlhtml

上一講雞啄米講了屬性頁對話框和相關的兩個類CPropertyPage類和CPropertySheet類,對使用屬性頁對話框作準備。本節將爲你們演示如何建立嚮導對話框。ide

       仍然之前面的「加法計算器」的例子爲基礎,在其中加入嚮導對話框,咱們能夠用它來講明加法計算器的使用方法,一步一步引導用戶操做,這也是比較常見的用法。函數

       加法計算器使用時大概能夠分爲三步:輸入被加數、輸入加數、點「計算」按鈕。工具

       雞啄米就詳細說明嚮導對話框的建立步驟:學習

       1.建立屬性頁對話框資源spa

       根據建立對話框模板和修改對話框屬性中所講方法,在「Resource View」的Dialog」節點上點右鍵,而後在右鍵菜單中選擇「Insert Dialog」建立第一個對話框模板,對話框的ID屬性設置爲IDD_SUMMAND_PAGE,Caption屬性改成「被加數頁」,Style屬性在下拉列表中選擇「Child」,Border屬性在下拉列表中選擇「Thin」。code

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

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

       2.建立屬性頁類blog

       按照建立對話框類和添加控件變量中的方法,在第一個對話框模板上點右鍵,在右鍵菜單中選擇「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. }  

       到此,嚮導對話框就完整的建立完成了,並能夠在加法計算器對話框上點「使用說明」按鈕顯示出來。咱們來看看效果吧:

       上圖只是被加數頁的效果,點其上「下一步」按鈕就能夠繼續顯示後面的兩個頁面。

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

相關文章
相關標籤/搜索