?? 08.2.2 創建屬性表單.txt
字號:
8.2.2 創建屬性表單
為了創建一個屬性表單,首先需要創建一個 CPropertySheet對象,接下來,在此對象中為每一個屬性頁創建一個對象(CPropertyPage類型),并調用AddPage函數添加每一個屬性頁,然后調用DoModal函數顯示一個模態屬性表單,或者調用Create函數創建一個非模態屬性表單。
因此,可以通過以下幾個步驟實現屬性表單創建的功能:
由需要為Prop程序創建一個屬性表單對象。選擇VC++開發環境窗口上的【Insert\ New Class..】菜單命令,將彈出添加新類對話框,在此對話框中,將新類命名為: CPropSheet,并選擇其基類為CPropertySheet,結果如圖8.42所示。
一一圖 8.42添加的屬性表單類
在屬性表單對象 (CPropSheet)中添加屬性頁。這需要調用 CPropertySheet類的成員函數: AddPage,其聲明原型如下所示 :
void AddPage( CPropertypage *pPage );
可以看到,這個函數有一個 CPropertyPage類型指針的參數,它指向的就是需要添加到屬性表單中的屬性頁對象。也就是說,通過這個函數,可以將屬性頁對象添加到屬性表單中。
我們首先在屬性表單對象 (CPropSheet )的頭文件中為先前創建的三個屬性頁分別定義一個成員對象,代碼如下所示 :
CPropl ID-propl;
CProp2 ID-prop2;
CProp3 ID-prop3;
通常都是在屬性表單對象的構造函數中添加屬性頁對象。但是對 CPropSheet對象來說,此時它還不知道 CPropl、 CProp2和 CProp3這三種類型的定義,所以還必須在 CPropSheet類的頭文件中分別把這三個屬性頁類的頭文件包含進來,代碼如下所示:
#include "Propl.h"
#include .Prop2.h"
#include "Prop3.h"
接下來,我們就可以在 CPropSheet類的構造函數中添加這三個屬性頁對象,但是發現這個類有兩個構造函數,代碼如例 8-3所示。
例 8-3
CPropSheet : : CPropSheet(U工NT nIDCaption, CWnd* pParentWnd, U工 NT工 SelectPage) :CPropertySheet(nIDCaption, pParentWnd,工 SelectPage)
CPropSheet : :CPropSheet (LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
其中一個函數是用 ID號( nIDCaption ) ,另一個函數是用標題字符串( pszCaption )來
構造屬性表單對象。而對應的基類: CPropertySheet的兩個構造函數的聲明原型如下所示 :
CPropertySheet ( U工NT n1以:aption, CWnd *pParent階ld = NULL , UINT iSelectPage = 0 ) ; CPropertySheet( LPCTSTR pszCaption, Cwnd *pParentWnd = NULL , U工 NT iSelectPage = 0 );
可以看到,這兩個構造函數的后兩個參數都是相同的,并且第二個參數 pParentW時,即父窗口指針都有默認值: NULL,此時屬性表單的父窗口就是應用程序的主窗口。對于 SDI應用程序來說,就是應用程序的主框架窗口。第三個參數 iSelectPage指定的是屬性表
單初始選擇的屬性頁,我們可以通過這個參數,來指定屬性表單初始顯示時顯示的屬性頁,默認是第一個頁面。
因為屬性表單類有兩個構造函數,在構造屬性表單對象時,讀者可以任選其中一個構
造函數。這里我們在這兩個構造函數都調用AddPage函數添加屬性頁對象,代碼如下所示:
AddPage(&m-propl) ;
AddPage(&m-prop2) ;
AddPage(&m-prop3) ;
③顯示屬性表單。 CPropertySheet類的繼承層次結構如圖 8.43所示,我們可以看到這個 CPropertySheet類是從CWnd類派生而來的,而不是派生于CDialog類。但是, CPropertySheet對象
圖8.43 CPrope句Sheet類的繼承層次結構和CDialog對象的操縱方式是類似的。例如,屬性表單對象的創建也需要兩個步驟,第一步調用構造函數定義一個屬性表單對象,然后調用DoModal成員函數創建一個模態屬性表單,或者調用Create成員函數創建一個非模態屬性表單。
知道了屬性表單的創建步驟,下面我們就據此在Prop程序中創建井顯示 CPropertySheet對象。首先在該工程的主菜單上添加一個菜單項,當用戶單擊這個菜單項
后,程序顯示CPropertySheet屬性表單對象。為了簡單起見,就在Prop程序主菜單的【幫
助】子菜單后面添加一個菜單項,并在其屬性對話框中取消Pop-up選工頁,將其Caption屬
性設置為:屬性表單, ID屬性設置為: IDM_PROPERTYSHEET,結果如圖8.44所示。
圖 8.44新添菜單項的屬性對話框
然后利用 ClassWizard為這個新菜單項添加命令響應函數。本例讓CPropView類捕在此菜單命令,井接受系統自動賦予的響應函數名稱: OnPropertysheet。然后,在此函數中添加創建屬性表單的代碼,結果代碼如例8-4所示。
例8-4
void CProp飛liew: :OnPropertysheet()
// TODO : Add your command handler code here
CPropSheet propSheet("肩性表單);
) ;
propSheet.DoModal();
上述例8-4所示代碼中,首先構造了一個CPropSheet類型的屬性表單對象:propSheet,
這里調用的是以標題為參數的屬性表單構造函數,并且因為該構造函數的后兩個參數都有默認值,所以調用時沒有為它們提供參數值。然后,調用該屬性表單對象的 DoModal函數,, 顯示一個模態屬性表單。當然,別忘了在 CPropView類中包含 CPropSheet類的頭文件,即在 C PropView類的源文件開始部分添加例 8-5所示代碼中加灰顯示的那行語句。
成員函數來顯示一個模態屬性表羊。
Build并運行 Prop程序,單擊【屬性表單】菜單項,即可彈出如圖 8.45所示的屬性表單。 |應性表單川丁'主j F噸.1 Ihce2 11'噸.3 I
從圖 8.45可以看到,這個屬性表單有一些問題,屬性頁上的中文顯示的是亂碼。這主要是因為在插入屬性頁資源時,它默認的語言是英語。因此,必須將屬性頁資源的語言屬性修改為中文,方法是在 ResourceView選項卡上,在 IDD_PROPl資源 t單擊鼠標右鍵,從彈出的快捷菜單中選擇【 Properties】菜單命令,即可顯示如圖 8.46所示的對話框屬性對話框,將該屬性頁的語言選項修改為 : Chinese ( P.R.C.)。按照同樣的方法將 IDD PROP2 和 IDD PROP3屬性頁資源的語言都改為中文。
然后還需要修改屬性頁對話框的字體。方法是在 ResourceView選項卡上,雙擊 IDD PROPl標識項,這將打開 Pagel屬性頁資源,在此資源上單擊鼠標右鍵,從彈出的快捷菜單中選擇【Properties】菜單命令,將顯示該屬性頁的屬性對話框,單擊該對話框上的【Font】按鈕,即可出現如圖8.47所示的選擇對話框字體的對話框,從字體的下拉列表中選擇:宋體,從而將Pagel屬性頁資源的字體修改為"宋體"。利用同樣的方法將Page2和Page3屬性頁資源的字體也修改為"宋體"。
圖 8.47對話框字體設置對話框
再次運行Prop程序,單擊【屬性表單】菜單項,將彈出如圖8.48所示的屬性表單,分別單擊Page2和 Page3選項頁,可以得到如圖 8.49和圖 8.50所示的屬性頁,可以看到中文的顯示正常了。如果之前在創建屬性頁資源時,我們選擇的是插入普通對話框資源,就不會出現這種問題。但是這時也需要修改普通對話框資源的一些屬性(具體屬性參見前面的內容),使其符合屬性頁資源的要求。可見這兩種創建屬性頁資源的方法各有利弊,讀者可以根據自己的習慣選擇其中的一種方法。
圖 8.50屬性表單的第三個屬性頁
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -