上一講講了屬性頁對話框和相關的兩個類CPropertyPage類和CPropertySheet類,對使用屬性頁對話框作準備。本節將爲你們演示如何建立嚮導對話框。html
仍然之前面的「加法計算器」的例子爲基礎,在其中加入嚮導對話框,咱們能夠用它來講明加法計算器的使用方法,一步一步引導用戶操做,這也是比較常見的用法。編程
加法計算器使用時大概能夠分爲三步:輸入被加數、輸入加數、點「計算」按鈕。當功能實現了想要擁有美觀的界面能夠藉助Toolkit Pro進行界面優化。框架
Xtreme Toolkit Pro:是屢獲殊榮的VC界面庫,是MFC開發中最全面界面控件套包,它提供了Windows開發所須要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。ide
下面詳細說明嚮導對話框的建立步驟:工具
1.建立屬性頁對話框資源優化
根據建立對話框模板和修改對話框屬性中所講方法,在「Resource View」的Dialog」節點上點右鍵,而後在右鍵菜單中選擇「Insert Dialog」建立第一個對話框模板,對話框的ID屬性設置爲IDD_SUMMAND_PAGE,Caption屬性改成「被加數頁」,Style屬性在下拉列表中選擇「Child」,Border屬性在下拉列表中選擇「Thin」。url
刪除「OK」和「Cancel」按鈕,再按照爲對話框添加控件中所講方法,添加一個靜態文本框,並修改靜態文本框的Caption屬性爲「請先輸入double型被加數」。.net
按照上述步驟,繼續添加第二個和第三個對話框資源。第二個對話框模板的ID設爲IDD_ADDEND_PAGE,Caption屬性改成「加數頁」,也添加一個靜態文本框,Caption設爲「請繼續輸入double型加數」,其餘屬性同第一個對話框。第三個對話框模板的ID設爲IDD_ADD_PAGE,Caption屬性改成「計算頁」,添加靜態文本框的Caption屬性改成「最後請按下「計算」按鈕」,其餘屬性也第一個對話框同樣。code
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++代碼
BOOL CSummandPage::OnSetActive() { // TODO: Add your specialized code here and/or call the base class // 得到父窗口,即屬性表CPropertySheet類 CPropertySheet* psheet = (CPropertySheet*) GetParent(); // 設置屬性表只有「下一步」按鈕 psheet->SetWizardButtons(PSWIZB_NEXT); return CPropertyPage::OnSetActive(); }
爲第二個和第三個對話框也分別添加屬性頁類CAddendPage和CAddPage。但第二個對話框的屬性頁不須要重載OnSetActive函數。第三個對話框是最後一個對話框,因此不須要「下一步」按鈕,而應該換成「完成」按鈕,因此也須要重載OnSetActive函數設置「完成」按鈕。重載後的OnSetActive以下:
C++代碼
BOOL CAddPage::OnSetActive() { // TODO: Add your specialized code here and/or call the base class // 得到父窗口,即屬性表CPropertySheet類 CPropertySheet* psheet = (CPropertySheet*) GetParent(); //設置屬性表只有「完成」按鈕 psheet->SetFinishText(_T("完成")); return CPropertyPage::OnSetActive(); }
上面的代碼段中,字符串「完成」前加了個_T,這是由於本工程建立的時候用的默認的Unicode字符集,而若是「完成」前不加_T就是ASCII字符串。_T其實是一個宏,工程的字符集選擇爲Unicode時字符串就轉爲Unicode字符串,選擇爲Muli-Byte時就轉爲ASCII字符串。咱們能夠在Solution Explorer的Addition根節點上點右鍵,在右鍵菜單上選擇「Properties」,彈出工程的屬性對話框,Configuration Properties->General右側列表中的Character Set就顯示選擇的字符集。
那點了第三個屬性頁上的「完成」按鈕咱們想進行某些處理的話,就重載OnWizardFinish函數,方法同OnSetActive函數。重載後的OnWizardFinish函數以下:
C++代碼
BOOL CAddPage::OnWizardFinish() { // TODO: Add your specialized code here and/or call the base class // 提示嚮導完成 MessageBox(_T("使用說明嚮導已閱讀完!")); return CPropertyPage::OnWizardFinish(); }
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++代碼
CAddSheet::CAddSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { // 添加三個屬性頁到屬性表 AddPage(&m_summandPage); AddPage(&m_addendPage); AddPage(&m_addPage); } CAddSheet::CAddSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage) { // 添加三個屬性頁到屬性表 AddPage(&m_summandPage); AddPage(&m_addendPage); AddPage(&m_addPage); }
4.顯示嚮導對話框
咱們在加法計算器對話框上添加一個按鈕,點擊它就打開向導對話框。此按鈕的ID設爲IDC_INSTRUCT_BUTTON,Caption屬性設爲「使用說明」。
按照爲控件添加消息處理函數中所講方法,爲IDC_INSTRUCT_BUTTON按鈕在CAdditionDlg類中添加點擊消息的處理函數OnBnClickedInstructButton。而後在AdditionDlg.cpp文件中包含CAddSheet的頭文件:#include "AddSheet.h"。最後修改OnBnClickedInstructButton函數以下:
C++代碼
void CAdditionDlg::OnBnClickedInstructButton() { // TODO: Add your control notification handler code here // 建立屬性表對象 CAddSheet sheet(_T("")); // 設置屬性對話框爲嚮導對話框 sheet.SetWizardMode(); // 打開模態嚮導對話框 sheet.DoModal(); }
到此,嚮導對話框就完整的建立完成了,並能夠在加法計算器對話框上點「使用說明」按鈕顯示出來。咱們來看看效果吧:
上圖只是被加數頁的效果,點其上「下一步」按鈕就能夠繼續顯示後面的兩個頁面。
點擊獲取MFC開發中最全面界面控件套包Xtreme Toolkit Pro,讓你專一於功能,構建卓越GUI從「這」開始!!!
更多往期內容:
- VS2010/MFC編程入門之對話框:如何建立對話框模板和修改對話框屬性
- Visual C++/MFC編程入門:如何建立對話框類和添加控件變量
- VS2019/MFC對話框系列:爲控件添加消息處理函數
- VS2019/MFC對話框系列:爲控件添加消息處理函數
- VS2019/MFC編程入門之對話框:如何設置對話框控件的Tab順序
- VS2019/MFC編程入門教程:MFC應用程序框架分析
- VS2019/MFC編程入門:MFC消息映射機制概述
- VS2019/MFC對話框系列:對話框上控件的Tab順序如何調整
- VS2019/MFC編程入門:模態對話框及其彈出過程
- VS2019/MFC編程入門之對話框:非模態對話框的建立及顯示