?? 07 對話框(1).txt
字號:
第7章對話框( )
圖 7.2程序的"關于"對話框
如果想在程序中創建自己的對話框,可以通過插入一個對話框資源來完成。具體方法是:在VC++開發環境窗口中選擇【Insert】菜單下的【Resource..】菜單命令,此時會彈出如圖7.3所示的對話框,在此對話框中選擇Dialog資源類型,然后單擊【New】按鈕,即可為程序新建一個新的對話框資源。 VC++自動將其標識設置為IDD DIALOGl,井添加到 ResourceView選項卡中的 Dialog項下,同時在資源編輯窗口中打開了這個新對話框資源,如圖 7.4所示。從該圖中,可以看到在 Dialog項下還有一個對話框資源標識: IDD_ABOUTBOX,這就是 t面所說的那個"關于"對話框的對話框資源。
圖 7.3 Insert Resource對話框
圖 7.4新建的對話框資源
也可以通過單擊資源工具欄上的 [New ]按鈕來新建一個對
話框資源。
可以看到,這個新建的IDD_DIALOGl對話框中有兩個按鈕: OK和Cancel,并通過它們的屬性對話框可以發現它們的ID分別為IDOK和IDCANCEL
VC++已經為這兩個按鈕提供了默認的消息響應函數 OnOK和 OnCancel,它們實現的主要功能都是一樣的,就是關閉對話框,因此,當程序運行時,單擊這兩個按鈕中的任何一個都可以關閉對話框。但是,單擊這兩個按鈕關閉對話框后,返回的結果值是不一樣的,在程序中,通常根據該返回值來判斷用戶單擊的是哪個按鈕,從而確定用戶的行為:是確定還是取消當前操作。
我們選中IDD DIALOGl這個對話框資源本身,打開其屬性對話框,將其Caption屬性設置為"測試",以下統稱這個對話框為測試對話框。
在MFC中,對資源的操作通常都是通過一個與資源相關的類來完成的。對話框資源也有一個相應的基類: CDialog。根據MSDN提供的幫助信息,可以知道CDia10g類派生于CWnd類,所以它是一個與窗口相關的類,主要用來在屏幕上顯示一個對話框。由此可知,實際上,對話框本身也是一個窗口界面。
既然在 MFC中,對資源的操作是通過一個類來完成的,那么就需要創建一個類與這個新建的對話框資源相關聯。為此,在 VC++開發環境中,選擇【View】菜單下的 <ClassWizard】菜單命令,這時會彈出如圖7.5所示的對話框,提示用戶: IDD_DIALOGl 資源是一個新資源,并且因為它是一個對話框資源,所以需要為它創建一個相關聯的類,或者可以選擇程序中己有的一個類與之相關聯。單擊【OK】按鈕,將出現如圖7.6所示的對話框,利用這個對話框就可以為新建的對話框資源創建一個關聯的類。
目標:在新建的對話框資源上時鼠標燭,也可彈的圖 7.5所示的對
話框。
圖 7.5 Adding a Class對話框圖 7.6 New Class對話框
從圖7.6可以看到, Dialog ID項的內容己經被自動填充,就是剛才新建的那個對話框資源標識: IDD_DIALOG1.井且在Base class項中也指定了這個新類的基類:CDialog。我們需要做的是,在Name編輯框中為這個新類命名,例如CTestDIg。讀者會發現,在輸入類名的同時, File name只讀框中會顯示這個類所在的文件名(如圖7.7所示),該文件名的命名是類名去掉第一個 'C'字母。通常情況下,直接接受這個文件名即可,但有些情況下必須要修改這個文件名,例如,如果新建的這個類的文件名與程序,中己有文件同名,
或者新建的這個類名很長,想以縮寫的形式來命名文件名,使其變短些等。如果想要修改這個默認的文件名,可以單擊【 Change...]按鈕,這時就會出現如圖 7.8所示的對話框,利用這個對話框,可以改變這個新類的頭文件名和源文件名。本例直接接受自動產生的類文件名,不對其進行修改,所以直接單擊圖 7.7所示對話框中的【 OK】按鈕即可,并單擊隨后出現的 MFC ClassWizard對話框上的【OK】按鈕,關閉該對話框,從而就完成了 CTestD lg這個新類的創建。
圖 7.7為新類命名后的 New Class對話框圖 7.8 Change Files對話框
這時,在 Mybole程序的 ClassView選項卡中,就可以看到這個新類??梢钥吹剑@個 CTestDlg新類有兩個成員函數,其中一個就是它的構造函數,其定義代碼如例 7 -1所示。
例 7-1
CTestDlg::CTestDlg(CWnd* pParent / *=NULL*/ )
:CDialog(CTestDlg : : IDD, pParent)
//{{AFX_DATA_1N1T(CTestDlg) // NOTE : the ClassWizard will add member initializat工 on here //}}AFX_ DATA_ 1N1T
從例 7-1所示的代碼中可以看到, CTestDlg類的構造函數首先調用其基類 :CDialog的構造函數,并傳遞兩個參數 =一個是 CTestDlg類的 IDD成員,一個是父窗口指針。打開 CTestDl g類的頭文件,就可以發現這個 IDD就是這個對話框資源的 ID,代碼如例 7-2所示。
例 7-2
// Dialog Data
//{{AFX_ DATA(CTestDlg)
enum {IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here //}}AFX_DATA
CTestDlg類的另一個函數是: DoDataExchange,主要用來完成對話框數據的交換和校驗,其定義如例 7-3所示。
例7-3
void CTestDlg :: DoDataExchange (CDataExchange* pDX)
CDialog : : DoDataExchange (pDX) ; 11 {{AFX_DATA_MAP{CTestDlg) 11 NOTE: the ClassWizard will add DDX and DDV calls here II }}AFX_DATA_MAP
現在,我們就有了一個類 (CTestDlg)與IDD-DIALOGl這個對話框資源相關聯了,就像程序中 CAboutDlg類與 IDD ABOUTBOX這個對話框資源相關聯一樣。接下來,我們希望在程序中顯示這個對話框窗口,為此,可以為 Mybole程序增加一個菜單項,當用戶單擊這個菜單項時就顯示這個對話框窗口。因此,首先在 Mybole程序的【幫助】子菜單后增加一個菜單項,然后打開其屬性對話框,將其Caption屬性設置為"對話框",去掉該菜單的Pop-up選工頁,井將其E設置為IDM DIALOG,如圖7.9所示。
圖 7.9新增對話框菜單項的屬性
接著,利用 ClassWizard為此菜單項添加COMMAND命令消息響應函數。本例中,讓視類 (CMyboleView )捕獲這個新增的【對話框】菜單項命令響應。然后,在此響應函數中實現對話框窗口的顯示。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -