如果想要做出屬性頁(yè)樣子的程序,我們有兩種方法:
一、控件的介紹
MFC中封裝了許多有用的類(lèi),CTabCtrl和CPropertySheet是其中兩個(gè)比較常用的類(lèi)型。CTabCtrl即Tab控件對應的類(lèi),Windows應用程序中大量使用了Tab控件。屬性頁(yè)對應的是CPropertySheet,你在桌面上右鍵鼠標彈出的顯示對話(huà)框就是一個(gè)CPropertySheet類(lèi)型的對象。事實(shí)上這類(lèi)彈出的、類(lèi)似“屬性頁(yè)”的窗口大部分都是CPropertySheet。
其實(shí),這兩個(gè)類(lèi)之間也有著(zhù)很密切的聯(lián)系。使用Spy++觀(guān)察一個(gè)屬性頁(yè)窗口可以發(fā)現,它也包含了一個(gè)Tab控件
二、屬性頁(yè)的使用
屬性頁(yè)的使用比較簡(jiǎn)單,過(guò)程也很清晰。先說(shuō)一下,CPropertySheet和CDialog對話(huà)框類(lèi)同樣都派生于CWnd類(lèi),所以他倆在使用上有很多相似的地方。我不知道是不是這哥倆太相似了,以至于Spy++把我自建的一個(gè)CPropertySheet窗口認作是CDialog。
既然屬性頁(yè)和對話(huà)框相似,我們只要有了一個(gè)屬性頁(yè)的類(lèi),就可以使用DoModal()方法來(lái)產(chǎn)生一個(gè)模態(tài)的窗口,或者用Create()產(chǎn)生一個(gè)非模態(tài)的窗口。注意如果顯示非模式的窗口,要考慮變量生存期的問(wèn)題,這點(diǎn)和非模態(tài)對話(huà)框是一樣的。
屬性頁(yè)窗口里面那么多的選項卡是怎么弄出來(lái)的?這就需要CPropertyPage。這是一個(gè)對話(huà)框類(lèi)的子類(lèi),對應著(zhù)一個(gè)選項卡。對一個(gè)屬性頁(yè),我們使用AddPage()方法來(lái)添加選項卡
選項卡既然是對話(huà)框,我們就可以在資源窗口中建立對話(huà)框,然后利用類(lèi)向導為他建立類(lèi),注意要選擇派生自CPropertyPage。MSDN上面說(shuō),建立這類(lèi)對話(huà)框資源模板時(shí)有幾點(diǎn)要注意
1.保留TitleBar屬性。對話(huà)框標題就是將來(lái)顯示在選項卡上的標簽
2.對話(huà)框風(fēng)格設為Child,邊框設為T(mén)hin
3.將對話(huà)框設為Disabled
好了,總結一下屬性頁(yè)的使用步驟就是
1.建立模板資源,構造你需要的每一個(gè)CPropertyPage。
2.使用CPropertySheet類(lèi),用AddPage()方法為其添加至少一個(gè)選項卡?;蛘?,你可以派生一個(gè)自己的CMyPropertySheet類(lèi),在內部添加上各個(gè)CPropertyPage作為成員變量,并在構造函數中用AddPage
3.在需要使用屬性頁(yè)的地方聲明變量,使用DoModal()或者Create()方法顯示屬性頁(yè)
三、Tab控件的使用
Tab控件一般用在對話(huà)框中。在我看來(lái)Tab控件本身并不復雜,其實(shí)也就是一組簡(jiǎn)單的按鈕而已,因為它并不能直接對各個(gè)選項卡進(jìn)行操縱。我們需要對用戶(hù)選擇選項卡的行為進(jìn)行手工地響應
比如你希望對每一個(gè)選項卡顯示不同的內容,你必須通過(guò)顯示/隱藏不需要的內容。當每一個(gè)選項卡上的內容較多時(shí),可以把這些內容放在一個(gè)容器里,比如一個(gè)對話(huà)框。這樣,一個(gè)選項卡對應一個(gè)對話(huà)框,關(guān)系比較清晰。這些對話(huà)框應設置為沒(méi)有標題欄、Child風(fēng)格、無(wú)邊框的、非模式的。以此為例,對話(huà)框中使用Tab控件的步驟是
1.在對話(huà)框中添加Tab控件
2.為各選項卡建立對話(huà)框模板資源
3.響應Tab控件的TCN_SELCHANGE消息,在OnSelChange()函數中,用ShowWindow()函數顯示欲顯示的選項卡,隱藏其他。非模式對話(huà)框的生存期問(wèn)題這里仍然存在,不可忽視
4.初始化Tab控件??稍趯υ?huà)框初始化時(shí)手工調用OnSelChange()函數的方法來(lái)實(shí)現.