關於屬性頁的創建過程:
1.
首先添加三個Dialog資源,選擇IDD_PROPRAGE_LARGE分別命名為P1,P2,P3。再往3個屬性頁中添加控件,P1中添加組合框,組合框中添加三個RadioButton命名為職業,和一個List Box;P2中添加組合框,組合框中為四個Check Box,命名為興趣愛好;P3中添加Combo Box,為工資水平。
2.
創建3個類,基類為CPropertyPage,分別為CPro1,CPro2,CPro3.
3.
通過查MSDN知要實現屬性頁要有一個CPropetySheet類,於是創建一個類CProsheet,基類為CPropetySheet,另外再CProsheet中增加3個分別為CPro1,CPro2,CPro3的變量,在它的構造函數中利用AddPage()函數把3個屬性頁對象添加進取(詳細見MSDN,注意文件的包含)。
4.
再就要實現菜單的功能實現,在創建的單文檔工程中添加一個名為“屬性”的菜單。在View類中增加其消息處理函數,一要構造屬性表對象CProsheet Prosheet;二要調用Prosheet.DoModal()函數顯示。(注意改變屬性頁的語言和字體,否則顯示的是亂碼,另外注意文件的包含)
5.
上面構成生成的是屬性表,而大部分時候我們需要向導類型的屬性填寫,向導生成的基本構成和上一樣,只不過之後要在DoModal()之前要用CPropertySheet中的SetWizardMode()函數使它成為向導類型。完成後運行會發現在第一頁不應該有上一步這個按鈕,最後一頁不應該有下一步這個按鈕,應該為完成按鈕,要解決這個問題該怎麼辦呢?
6.
要解決上面的問題要利用屬性表單成員函數SetWizardBttons()這個函數,但MSDN中知這個函數是通過OnSetActive()這個函數來實現的。所以要在屬性頁CPro1,CPro2,CPro3類中添加虛函數OnSetActive(),再在此函數中調用SetWizardBttons()函數來實現這個功能。(注意SetWizardBttons()是屬性表CPropetySheet類的成員函數,所以要調用它應((CPropertySheet*)GetParent( ))->SetWizardButtons(PSWIZB_NEXT);)
7.
完成上述功能後,就要對各屬性頁進行判斷了,只有滿足條件才能進行下一步。對第一個屬性頁CPro1,要增加虛函數OnWizardNext()函數進行判斷。(注意對Radio Button控件要點Croup,具體參見組的具體操作,另外,控件的數據傳遞要用UpdateData()函數),而對於List Box控件,它是一個CListBox類的實例,要初始化要添加消息處理WM_INITDIALOG接著在它生成的函數中用CListBox類中的AddString()函數來實現。
8.
對於第二個屬性頁同上,第三個屬性頁CPro3,基本操作過程同上,它是CComboBox類的一個實例,添加的虛函數應是OnWizardFinish();要利用GetCurSel( )和GetLBText()函數對其先得到索引值,再得到具體字符串,具體為
int index;
i ndex=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel( );
((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_m);
(它的初始化和一一樣添加WM_INITDIALOG再用CComboBox類中AddString()函數,另外要注意控件中把Sort取消,這樣文本的顯示就按輸入的順序顯示)
9.
最後要將各屬性頁的選擇顯示在視圖中,先在視圖類中定義相應的變量並初始化,(注意數組的初始化有些時候可以用memset()函數來實現)再視圖類中的prosheet.DoModal()進行判斷if(prosheet.DoModal()==ID_WIZFINISH )就將屬性頁中的信息傳遞到各變量中。最後要用Invalidate();使視圖重畫。
10.
再將各信息顯示在視圖中,在OnDraw(CDC* pDC)函數中實現。(對獲取文本的大小位置可用TEXTMETRIC tm; pDC->GetTextMetrics(&tm);來實現)