VC++0入門創(chuàng)建和使用對話框_第1頁
VC++0入門創(chuàng)建和使用對話框_第2頁
VC++0入門創(chuàng)建和使用對話框_第3頁
VC++0入門創(chuàng)建和使用對話框_第4頁
VC++0入門創(chuàng)建和使用對話框_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、VC+6簡明教程第6章創(chuàng)建和使用對話框精講對話框是一種用戶界面,幾乎每一個Windows程序都使用對話框與用戶進行交互。對話框可能是-個簡單的只含有OK按鈕的消息框,也可以是一個復(fù)雜的數(shù)據(jù)輸入表單。對話框上有一些方便用戶輸入 的控件,對話框依靠這些控件與用戶進行交互,其實質(zhì)是一個接收消息的窗口。在本章節(jié)我們主要講述模式對話框和無模式對話框的原理和使用方法,下一章將詳細介紹各種控件的使用。你將學(xué)習(xí)創(chuàng)建一個對話框,使用對話框模板編輯一個對話框資源,并在程序中調(diào)用對話框的方 法。6.1對話框的基本原理6.1.1對話框的工作原理在創(chuàng)建一個對話框之前,我們先來了解一下對話框是如何工作的,對話框的數(shù)據(jù)來自

2、三方面:對話 框資源、對話框?qū)ο?、和一個文檔對象:1. 對話框資源對話框資源是一個用戶輸入或取得數(shù)據(jù)的圖形界面。這個圖形界面是使用Develop Studio的對話框編輯器在對話框模板上創(chuàng)建的,程序員可以在對話框模板上增加并編輯控件,生成對話框資源。當(dāng)應(yīng)用 程序運行時,就可以得到一個對話框。2. 對話框?qū)ο驧FC使用CDialog類來描述對話框,它是 CWnd類的派生類。在 CWnd類的基礎(chǔ)上增加了數(shù)據(jù)交 換的功能。當(dāng)創(chuàng)建一個新的對話框資源后,使用ClassWizard可以創(chuàng)建一個對話框類的派生類。對話框?qū)ο髮崿F(xiàn)了對話框和應(yīng)用程序之間的通信。在應(yīng)用程序中定義一個對話框?qū)ο蠛?,在對話框顯示前,可

3、 以通過訪問對話框?qū)ο蟮某蓡T變量為一個對話框的控件初始化,在對話框關(guān)閉后,可以通過訪問對話框 對象的成員變量獲得用戶的輸入數(shù)據(jù)。3. 文檔對象MFC使用文檔對象描述應(yīng)用程序處理的數(shù)據(jù),用戶輸入的數(shù)據(jù)要進一步的處理,通常要先存貯到 文檔對象中。例如:一個學(xué)生記錄處理的應(yīng)用程序,用戶通過一個對話框輸入學(xué)生記錄并貯存到一個文 件中。應(yīng)用程序的處理順序是:用戶在對話框中輸入信息,通過對話框?qū)ο蟮玫捷斎胄畔?,將輸入信?整理到文檔對象中,使用序列化函數(shù)將文檔對象存貯到一個文件中,所以文檔對象扮演了一個很重要的 數(shù)據(jù)交換的角色。MFC使用以上三者實現(xiàn)用戶與應(yīng)用程序之間數(shù)據(jù)交換,數(shù)據(jù)交換流程見圖 6-1所示

4、,遵循四個步驟。Public:data memberdocumentxxxxxxxxxxxxxxxxxxxxxxxxxxxx創(chuàng)建對話框模板i定義對話框類和 3公有成員變量圖6-1對話框基本原理6.1.2對話框的類型對話框分為模式對話框和無模式對話框兩種。當(dāng)一個模式對話框打開了,在其關(guān)閉之前,用戶不能轉(zhuǎn)向其它用戶界面對象,只能與該對話框進行交互。我們平時接觸到的對話框, 大多數(shù)都是模式對話框, 例如,一個執(zhí)行菜單命令 File->Save后,Save 對話框被打開后,用戶不能再做其它工作,只能保存完文件或取消保存文件,關(guān)閉對話框窗口后,才能 做其它工作。無模式對話框恰恰相反,當(dāng)用戶打開一個

5、無模式對話框,對話框停留在屏幕上,仍然允許用戶與其它用戶界面對象進行交互。無模式對話框最典型的例子是在Word中使用的查找與替換對話框,打開該對話框后,可以交替地進行文檔編輯,和查找替換操作。從第一節(jié)的介紹可以看到對話框的設(shè)計任務(wù)主要包括對話框資源模板的設(shè)計,對話框類的設(shè)計和對話框的運行,絕大多數(shù)對話框的創(chuàng)建任務(wù),模式對話框和無模式對話框都是相同的,只有在對話框與應(yīng) 用程序代碼的交互中,也就是對話框的運行中,兩者有明顯的區(qū)別。6.2設(shè)計對話框資源6.2.1創(chuàng)建對話框使用AppWizard生成的單文檔或多文檔應(yīng)用程序,只有一個默認的About對話框,用于顯示應(yīng)用程序版本信息。需要使用對話框模板創(chuàng)

6、建自己的對話框資源。Develop Studio提供的對話框模板創(chuàng)建了一個基本界面,包括一個OK (確定)按鈕和一個 Cancel(取消)按鈕等。你可以移動、修改、刪除這些控件,或者是增加新的控件到對話框模板,構(gòu)成應(yīng)用程序所需的對話框資源。創(chuàng)建一個對話框資源到工程的步驟:(1) 使用AppWizard生成一個單文檔的 MFC應(yīng)用程序Exam6_1。(2) 選擇 Insert->Resource 菜單命令。(3) 在彈出的Insert Resource對話框左邊的列表中選擇Dialog ,單擊New按鈕。3第6章創(chuàng)建和使用對話框(4)在項目工作區(qū)中選擇 ResourceView面板,展開D

7、ialog文件夾,可以看到增加了一個對話框資源IDD_DIALOG1 ,如圖6-2所示,雙擊IDD_DIALOG1 ,在編輯區(qū)出現(xiàn)一個對話框模板。KiciusDf t Visual C f Ex»6 1. re HXD.DULQG1 (Dialog) 1EE3 Ed £dit * 盡戲rt Exojtet Juild L&yoiiL Jitili Jindw Qelp 苜 R 即 F Q S皿若修島IpfizCnidLincGlobslsAll qluhal EErntjE e T,N(j EEmbE,| t| .17.7 I!_3 Exam6_1 resource

8、s.+ u Accelerator:-m Dialog昌 I DD_ADOUTBOXiDOjoiALOGT4-ill IconLil MenuO String Tab!Toolbar_j Versfcn對話框資源ID卒口1B7X44I州|V醐小abl Readyti a, dREAD圖6-2 Exam6_1對話框設(shè)計新建對話框資源6.2.2增加控件一個控件是能夠放置在一個對話框中,提供應(yīng)用程序與用戶交互的某種功能。例如,Edit Box提供用戶文本輸入的場所,一組Radio Button提供用戶對某一主題的單項選擇。MFC將控件設(shè)計為對話框窗口的子窗口,控件通過事件通知消息與父窗口聯(lián)系。在一個

9、對話框資源中增加控件的操作十分方便,只需從圖6-2所示的控件工具欄中選中要增加的控件,再將此控件拖拉至對話框模板中的確定位置上,松開鼠標按鍵即生成一個控件。調(diào)整控件的位置和 大小的操作與Word中對文本框的操作完全一樣。在默認情況下,控件工具欄總是打開的,如果沒有打開,可以在Develop Studio工具欄后的空白處,單擊鼠標右鍵,在彈出的快捷菜單中選擇Controls ,便可打開控件工具欄。圖6-3中列出了 VC+ 6.0中支持的標準控件名稱,我們可以很方便地從控件工具欄中生成新的控件,但每一種控件都具有不同的特性,需要學(xué)習(xí)和掌握。Selection ToolStatic TextGrou

10、p Box Check Box Combo Box Horizontal Scroll BarSpin SliderList ControlTab ControlRich Edit Month Calender Custom ControlX圈Aa abl o|x $3匪EE圄令EE%.四&日地囹.n日PictureEdit ControlButtonRadio ButtonList BoxVertical Scroll BarProgressHot KeyTree ControlAnirSateDate Time PickerIP AddressExtended Combo Box第

11、6章創(chuàng)建和使用對話框圖6-3標準控件下面我們試著設(shè)計一個可以輸入5門功課成績的輸入窗口,在上一節(jié)生成的對話框資源IDD_DIALOG1中做以下操作,得到如圖 6-4所示的對話框:(1) 調(diào)整對話框模板窗口大小,將 OK和Cancel按鈕移到窗口的底部。(2) 控件工具欄中選中 Static Text (靜態(tài)文本)控件,拖到對話框模板中。(3) 通過復(fù)制和粘貼操作,生成其它四個 Static Text控件。(4) 控件工具欄中選中 Edit Box控件(編輯框),拖到對話框模板中。(5) 通過復(fù)制和粘貼操作,生成其它四個 Edit Box控件圖6-4 EX6對話框設(shè)計增加控件6.2.3設(shè)置控件屬

12、性一個控件相關(guān)的屬性設(shè)置決定了一個控件可操作行為和顯示。例如,控件的ID是控件的一個重要屬性,MFC內(nèi)部是以控件ID來標識一個控件,當(dāng)消息產(chǎn)生后,是哪一個控件需要進行處理,MFC內(nèi)部使用的是控件ID。屬性的設(shè)置是在與每個控件相對應(yīng)的屬性對話框中進行的,單擊鼠標右鍵,在彈出的快捷菜單中選擇Properties,打開屬性對話框。每一種控件的屬性對話框都有所不同,與其特性相關(guān),在下一章我們將詳細介紹一些常用控件的屬性含義。對上一節(jié)的對話框IDD DIALOG1中的控件作屬性設(shè)置:(1)鼠標選中第一個 Static Text對象,單擊鼠標右鍵,在彈出的快捷菜單中選擇Properties,彈出屬性對話框

13、,如圖6-5所示。圖6-5屬性對話框設(shè)置(2) 修改Caption右邊的文本框,輸入"高等數(shù)學(xué)”,單擊關(guān)閉按鈕,關(guān)閉屬性對話框。重復(fù)步驟(1)(2),將其它四個Static控件的Caption改為“大學(xué)物理”,“大學(xué)英語”,“哲學(xué)”和 “計算機基礎(chǔ)”。(4) 同樣的操作打開 5個Edit Box控件的屬性對話框,修改 ID為IDC_SCORE1、IDC_SCORE2、 IDC_SCORE3、IDC_SCORE4、IDC_SCORE5。(5) 打開按鈕OK的屬性對話框,修改 Caption為“確定”。打開按鈕Cancel的屬性對話框,修改 Caption為"取消”。操作完畢,

14、對話框如圖 6-6所示。圖6-6 EX6對話框設(shè)計設(shè)置屬性同樣,對話框的屬性設(shè)計也是在對話框的屬性對話框中設(shè)置,在對話框任意空白處單擊鼠標右鍵,在彈出的快捷菜單中選擇Properties,如圖6-7所示。在Caption中填寫"成績錄入",將成為對話框的標題,單擊Font會彈出字體對話框,能設(shè)置對話框中顯示的字體格式。其它的幾個標簽頁還提供了選項, 可以修改對話框窗口的顯示樣式,可以自己試一試。圖6-7 對話框?qū)傩栽O(shè)置6.2.4組織和安排控件當(dāng)選擇了一個對話框資源進入對話框編輯器時,Develop Studio的菜單欄上會增加一個菜單Layout,如圖6-8所示。Layou

15、t菜單提供了在對話框模板中合理布置控件的功能菜單項。Layout Tools Window helpSpace EvenlyMake Same 5izeArrange ButtonsGerter in DialogSZ to Corrtent 5hift4-F7Aud Size者 ElipTab OrderCtrl+DGuide Settings.可 Ibs:Ctl+T圖6-8 Layout下拉菜單Align提供了控件的六種對齊方式:左對齊、右對齊、上對齊、下 對齊、水平居中、垂直居中。Space Evenly提供了兩種等間距方式:垂直方向等間距、水平方 向等間距。Make Same Size

16、提供了三種等尺寸方式:寬相等、高相等、兩者 都相等。Arrange Button提供了兩種組織按鍵的方式:底部排列、右邊排 列。Center in Dialog提供了兩種居中方式:水平居中、垂直居中。Flip用于水平反方向顯示控件及窗口標題。Size to Content命令根據(jù)內(nèi)容決定控件的大小,例如,按鈕的大小由按鈕上的顯示文本決定。通過上面幾個菜單項的操作能夠很方便地齊整控件的擺放位置?,F(xiàn)在我們可以整理一下IDD_DIALOG1 中 擺放凌亂的控件:(1) 確定第一個和最后一個Static Text控件的位置,同時選中 5個Static Text控件,執(zhí)行菜單命令Layout->M

17、ake Same Size-width(2) 執(zhí)行菜單命令 Layout->Align-Bottom,水平對齊 5個控件。(3) 執(zhí)行菜單命令 Layout->Space Evenly-Across,使5個控件水平等間距。(4) 選擇"哲學(xué)”,執(zhí)行菜單命令 Layout->Size to Content ,微調(diào)控件位置(5) 確定第一個和最后一個Static Text控件的位置,同時選中 5個Static Text控件,執(zhí)行菜單命令Layout->Align->Bottom 和 Layout->Space Evenly->Across 。圖6

18、-9 EX6對話框設(shè)計整理控件操作完畢,可以看到控件整齊地排放在對話框模板上,如圖 6-9所示。33在Windows環(huán)境中通常提供兩種操作方法,鼠標操作方式和鍵盤操作方式,使用鼠標可以直接點擊控件進行訪問,使用鍵盤訪問控件需要通過Tab鍵順次找到某個控件。Tab Order規(guī)定了使用Tab鍵訪問控件的順序,一般 Tab Order是控件生成的順序,執(zhí)行菜單命令Layout->Tab Order可以顯示并修改 TabOrder,對IDD_DIALOG1 執(zhí)行菜單命令 Tab Order如圖6-10所示。圖 6-10 顯示 Tab Order按你所想要的訪問Tab順序變成先訪改變Tab Or

19、der的方法既簡單又直觀,執(zhí)行了 Tab Order命令出現(xiàn)了順序號之后,順序依次點擊每一個控件,完成后,點擊空白處就可以了。讀者可以試練習(xí)將上圖的 問第一個Edit Box,訪問完所有的 Edit Box后再訪問Button。6.2.5測試對話框當(dāng)構(gòu)造好一個對話框后,還不能立即在應(yīng)用程序中運行對話框,MFC提供了 Test命令,使程序員在設(shè)計階段就能夠測試對話框的運行效果。測試對話框的方法有:(1) 菜單命令 Layout->Test(2) Dialog工具欄上的Test按鈕(3) 快捷鍵Ctrl+T測試對話框IDD_DIALOG1 ,試著使用文本框輸入,并使用Tab鍵是否符合要求。如

20、圖6-11所示。¥高等數(shù)學(xué)大學(xué)物理大學(xué)英語哲學(xué)計算機基礎(chǔ)痛定取消醫(yī)閉團令A(yù)EnlEl航一德tdM測試對話框窗口READ圖6-11 Exam6 1對話框設(shè)計測試對話框6.3設(shè)計對話框類一個對話框資源要加入到一個窗口應(yīng)用程序中,首先要為它創(chuàng)建一個對話框類,是CDialog類的派生類。應(yīng)用程序運行時,窗口操作系統(tǒng)使用對話框類為對話框在內(nèi)存開辟空間。在Win32 API類型的窗口應(yīng)用程序中,都是直接通過控件ID來訪問對話框上的控件的,而MFC提供了連接變量來標識控件,連接變量是對話框的成員變量,同時對話框類有一套交換和驗證數(shù)據(jù)的方式。6.3.1創(chuàng)建對話框類創(chuàng)建對話框類的步驟如下:1. 保存已

21、創(chuàng)建好的對話框模板。2. 確保新的對話框資源在對話框編輯器中打開狀態(tài)下,打開ClassWizard窗口。打開ClassWizard的方式有 3種:(1) 窗口菜單命令 View->ClassWizard(2) 快捷菜單命令ClassWizard(3) 快捷鍵:Ctrl+w3. 在彈出的Adding a Class對話框中,如圖 6-12所示,選擇 Create a new class單選鈕,單擊 OK按鈕。圖6-12“增加類”對話框4.在隨后彈出的 New Class對話框中,如圖6-13所示,只需填寫類的名稱:CScoreDlg,單擊OK按鈕。 關(guān)閉ClassWizard ,對話框類的

22、創(chuàng)建就完成了。圖6-13填寫新類名稱在 Workspace窗口的ClassView面板中,可以看到增加了一個新的類CScoreDlg ,選擇FileView面板,在Header Files和Source Files文件夾中,可以看到該類的頭文件和實現(xiàn)文件,文件名是類名除去開 頭的類標志“ C”。Exam61 Brc 奇 ExamB I Doc cpp 為 ExamB IView.cppMainFrm.cpn司 ScnreDIgxpl .I 林IJHM-WP-J Header Files81 Exam6_1.h同 ExamG_1Doc.h回 Exam6_1Vicw.h回 MainFrm.h國Rc

23、source.h-7 ExamG 1 classes:* "CCAbcutDIg*1 CExamb lApp4. ,; CEaiTiB IDoc-CExain5_1View-*5 CScoreDlg I« CScorcDlg(CY/ld *pPa® D dD ataCxcha nJr(C D dijjRcso.匐 FikVi,v蜀 Sco旭Dl%h0 Erl/Kj h圖6-14新增對話框類及文件在創(chuàng)建新類的時候, 要注意新類的對話框ID 一定要與對話框資源ID 一致,這些ID告訴對話框類, 在對話框窗口創(chuàng)建前,哪一個對話框資源要被檢查,初始化控件并顯示。尤其在創(chuàng)建

24、好對話框后,不能 隨意地改動對話框資源 ID和刪除對話框資源。6.3.2創(chuàng)建對話框成員變量創(chuàng)建好一個對話框類后,可以增加類的成員變量來操作對話框上的控件。出于不同的操作目的,MFC提供了兩種類型的成員變量,如表 6-1所示。表6-1 對話框類的成員變量類型Values值類型的成員變量。用于控件的值控制,可以有多種數(shù)據(jù)類型,由所連接的控件類型決定。例如,Edit Box控件可以有CString 型或 int 型。Radio Button 可以是 int 型。Controls控件類型的成員變量,實質(zhì)是該控件類的一個對象。創(chuàng)建了 一個控件對象,就可以通過該對象使用控件類的方法對控件 進行操作,例如,

25、在程序運行時為Combo Box加入選擇項,設(shè)置控件是否有效或可見等。例如,創(chuàng)建了 CScoreDlg類后,需要為對話框中每一個Edit Box控件創(chuàng)建一個值類型的成員變量,來取得用戶在EditBox輸入的數(shù)據(jù),增加控件成員變量的步驟如下:(1)打開 ClassWizard 窗口,選擇 Member Variables 標簽頁,Class name下拉列表中選擇 CScoreDlg 類。這時,對話框中可以創(chuàng)建成員變量的控件ID出現(xiàn)在下方的Control IDs列表中,如圖6-15所示。圖6-15增加一個對話框類的成員變量(2)選擇一個 IDC_SCORE1 ,單擊 Add Variable 按

26、鈕,彈出 Add Member Variable 對話框,Member variable name編輯框中填寫變量名為:m_score1,確認Category T拉框中為:Value,在Variabletype下拉框中選擇為:into 單擊OK按鈕,回到ClassWizard窗口,可以看到新增的成員變量出現(xiàn)在列表中。同樣的操作增加其它四個成員變量。(4)如果增加成員變量時操作有誤,例如變量名錯誤,變量類型錯誤,選擇該成員變量,單擊DeleteVariable按鈕刪除該變量,再重新創(chuàng)建。創(chuàng)建好的成員變量如圖 6-16所示。圖6-16成員變量列表創(chuàng)建好成員變量后,我們來檢查一下ClassWizar

27、d作了哪些工作: 展開項目工作區(qū)的 ClassView面板中的CScoreDlg類,在樹目錄上出現(xiàn)了剛創(chuàng)建的成員變量。雙擊CScoreDlg的類名,進入該類的頭文件ScoreDlg.h ,可以找到對話框類定義的代碼,如程序清單6-1中所示。程序清單6-1 :對話框成員變量定義示例class CScoreDlg : public CDialog/ Constructionpublic:CScoreDlg(CWnd* pParent = NULL); / standard constructor/ Dialog Data/AFX_DATA(CScoreDlg)enum ( IDD = IDD_DI

28、ALOG1 );intm_score1;intm_scroe2;intm_score4;intm_score5;intm_score3;/AFX_DATAJ其中呈灰色顯示的,在宏“AFX_DA TA(CScoreDlg).AFX_DATA ”之間定義的是用 ClassWizard創(chuàng)建的成員變量。需要注意的是,所有ClassWizard產(chǎn)生的灰色顯示的代碼,不要在文件中直接修改,而應(yīng)在ClassWizard工具中進行修改,不然容易引起錯誤。(3)打開該類的構(gòu)造函數(shù),可以看到ClassWizard自動加入了成員變量的初始化代碼,如程序清單6-2所示。程序清單6-2 :對話框類的構(gòu)造函數(shù)CScore

29、Dlg:CScoreDlg(CWnd* pParent /*=NULL*/):CDialog(CScoreDlg:IDD, pParent)/AFX_DATA_INIT(CScoreDlg)m_score1 = 0;m_scroe2 = 0;m_score4 = 0;m_score5 = 0;m_score3 = 0;/AFX_DATA_INIT6.3.3對話框數(shù)據(jù)交換和校驗對話框的值類型的成員變量存儲了與控件相對應(yīng)的數(shù)據(jù),對框話打開時,用戶可以修改控件的數(shù)據(jù),有時需要應(yīng)用程序?qū)τ脩舻妮斎脒M行及時反饋,這時數(shù)據(jù)成員變量需要與控件交換數(shù)據(jù),以完成輸入輸 出功能。對于這種功能MFC是靠CDataE

30、xchange類提供的數(shù)據(jù)交換(DDX : Dialog Data Exchange )機制來完成的,該類提供了數(shù)據(jù)有效機制( DDV : Dialog Data Validation )當(dāng)在對話框類中增加一個數(shù)據(jù)成員變量,有時需要規(guī)定數(shù)據(jù)的有效性校驗規(guī)則,例如,成績錄入對 話框中,應(yīng)設(shè)置各門課的成績應(yīng)在0 100的范圍內(nèi)。在應(yīng)用程序運行的時候,當(dāng)用戶輸入數(shù)據(jù)拷貝到數(shù)據(jù)成員變量時,DDV機制被調(diào)用,如果有效性校驗失敗,即用戶輸入一個不合理的數(shù)據(jù)時,將出現(xiàn) 一個錯誤信息對話框,并返回到出現(xiàn)錯誤輸入的控件。有效性校驗的設(shè)置也是在 ClassWizard中完成的。我們再回到成績錄入的 Member

31、Variables標簽頁, 選擇表示成績輸入框的 m_score1,在標簽頁的下方會出最大值和最小值的輸入框,如圖 6-17所示,填 入0和100。如果一個CString型的數(shù)據(jù)成員變量對應(yīng)的通常是字符串的長度。圖6-17添加數(shù)據(jù)成員變量的有效范圍對話框類調(diào)用 DoDataExchange函數(shù)來實現(xiàn)DDV 和 DDX,對應(yīng)圖 6-17的 CScoreDlg 類的DoDataExchange代碼如程序清單 6-3所示。程序清單6-3 :對話框類的 DoDataExchange函數(shù)void CScoreDlg:DoDataExchange(CDataExchange* pDX)CDialog:Do

32、DataExchange(pDX);/AFX_DATA_MAP(CScoreDlg)DDX_Control(pDX, IDOK, m_OK); /控件對象數(shù)據(jù)交換DDX_Control(pDX, IDC_SCORE5, m_Score5Edit); /文本框數(shù)據(jù)交換DDX_Control(pDX, IDC_SCORE4, m_Score4Edit);DDX_Control(pDX, IDC_SCORE3, m_Score3Edit);DDX_Control(pDX, IDC_SCORE2, m_Score2Edit);DDX_Control(pDX, IDC_SCORE1, m_Score1E

33、dit);DDX_Text(pDX, IDC_SCORE2, m_score2);DDX_Text(pDX, IDC_SCORE3, m_score3);DDX_Text(pDX, IDC_SCORE4, m_score4);DDX_Text(pDX, IDC_SCORE5, m_score5);DDX_Text(pDX, IDC_SCORE1, m_score1);DDV_MinMaxInt(pDX, m_score1, 0, 100); / 最大最小值檢查/AFX_DATA_MAPJpDX指針指向一個 CDataExchange對象,DDX函數(shù)來完成控件和數(shù)據(jù)成員變量之間的數(shù)據(jù)交換,DDV

34、完成數(shù)據(jù)有效性檢查。DDX和DDV適用于文本框、復(fù)選框、單選按鈕、列表框和組合框。當(dāng)程序需要交換數(shù)據(jù)時,不需要編寫代碼調(diào)用 DoDataExchange函數(shù),而應(yīng)該調(diào)用CWnd:UpdateData() 函數(shù),UpdateData()函數(shù)內(nèi)部調(diào)用了 DoDataExchange函數(shù)。UpdateData()函數(shù)只有一個 BOOL類型的參數(shù),決定數(shù)據(jù)交換的方向:(1) UpdateData (false)將對話框?qū)ο蟮臄?shù)據(jù)成員變量的值拷貝到對話框中的控件。(2) UpdateData (true)將對話框中控件的值拷貝到對話框?qū)ο蟮臄?shù)據(jù)成員變量。你可以隨時在需要進行數(shù)據(jù)交換時調(diào)用相應(yīng)的Updat

35、eData()函數(shù),例如,在成績錄入的對話框中增加兩個控件,一個是Edit Box用于顯示總分,另一個是Button用于計算總分,則在Button的Click事件處理函數(shù)中,就需要先調(diào)用UpdateData(true)獲取用戶錄入的5門功課的成績,在計算總分后,調(diào)用UpdateData(false),將總分顯示在 Edit Box 中。在默認的CDialog:OnInitDialog()函數(shù)中調(diào)用了 UpdateData(false),這樣在對話框創(chuàng)建的時候,數(shù)據(jù)成員的初值就會反映到相應(yīng)的控件上。若用戶單擊OK (確定)按鈕關(guān)閉對話框,CDialog:OnOK()函數(shù)會調(diào)用UpdateData

36、(true),將控件中的數(shù)據(jù)傳給數(shù)據(jù)成員變量,如圖 6-18所示。圖中說明了對話框的控件與對話框?qū)ο笾g的數(shù)據(jù)交換是由框架自動完成的,而對話框?qū)ο笈c文檔對象之間的數(shù)據(jù)交換則需要編寫代碼。DDX and DDVdataDDXdocumentPublic: memberxxxxxxxxxxxxxxxxxxxxxxxxxxxxIt架處理對話框和對象之間的編寫代碼在文檔對象和對話框?qū)ο笾g交換數(shù)據(jù)數(shù)據(jù)交換和驗證圖6-18數(shù)據(jù)交換和驗證在應(yīng)用程序中的實現(xiàn)6.4運行對話框創(chuàng)建好一個對話框資源和對話框類,要在應(yīng)用程序中運行對話框,通常要在一個菜單命令下打開- 個對話框。所以,首先要定義一個菜單項和相應(yīng)的菜單

37、命令處理函數(shù),在函數(shù)中編寫代碼運行對話框。運行模式對話框和無模式對話框有所不同,下面結(jié)合實例詳細介紹兩種對話框運行的方法。6.4.1模式對話框在應(yīng)用程序中使用得更多的還是模式對話框,模式對話框的運行分兩個步驟:(1) 創(chuàng)建一個對話框?qū)ο?2) 調(diào)用CDialog:DoModal()函數(shù)打開對話框DoModal()函數(shù)負責(zé)模式對話框的創(chuàng)建和撤消。在創(chuàng)建對話框時,DoModal()的任務(wù)包括:裝載對話框資源、調(diào)用 OnInitDialog()初始化對話框和將對話框顯示在屏幕上。完成對話框的創(chuàng)建后,DoModal()啟動一個消息循環(huán),以響應(yīng)用戶的輸入。這時,用戶只能與對話框進行交互,其它用戶界面對象

38、收不到 輸入信息,只有終止模式對話框后才能進行其它工作。若用戶在對話框內(nèi)單擊了系統(tǒng)默認的OK (確定)按鈕,則CDialog:OnOK()函數(shù)將被調(diào)用,OnOK()首先調(diào)用UpdateData(true)函數(shù),將數(shù)據(jù)從對話框中的控件拷貝到數(shù)據(jù)成員變量,再調(diào)用CDialog:EndDialog()關(guān)閉對話框,并返回值IDOK。若用戶在對話框單擊了系統(tǒng)默認的Cancel (取消)按鈕,貝U CDialog:OnCancel()函數(shù)將被調(diào)用,該函數(shù)只調(diào)用 CDialog:EndDialog()關(guān)閉對話框,并返回值IDCANCEL。程序可以根據(jù)返回值是IDOK還是IDCANCEL來判斷用戶關(guān)閉對話框按

39、的哪一個鍵。下面我們將運行成績錄入對話框,當(dāng)按“確定”按鈕返回時,將其顯示在主窗口視圖上。為此,要 定義對應(yīng)的文檔對象。步驟如下:1. 增加文檔類公有變量并設(shè)置初值int型成員變量數(shù)組score5,存放5門課程成績;int型成員變量TScore,用來存放總分。在構(gòu)造函數(shù)中設(shè)置數(shù)組 score和TScore的初值都為0。2. 在視圖類OnDraw函數(shù)中添加代碼實現(xiàn)成績的輸出具體代碼見程序清單 6-4所示粗體部分。程序清單6-4 : OnDraw函數(shù)輸出int型文檔類成員變量的值void CExam6_1View:OnDraw(CDC* pDC) CExam6_1Doc* pDoc = GetDo

40、cument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC->TextOut(0,0,"高等數(shù)學(xué)大學(xué)物理大學(xué)英語 哲學(xué)計算機基礎(chǔ) 總分");輸出表頭CString str;/將int型數(shù)據(jù)轉(zhuǎn)換為格式字符串str.Format("%10d%16d%16d%16d%16d%18d",pDoc->score0,pDoc->score1, pDoc->score2,pDoc->score3,pDoc->score4,pDoc->TSc

41、ore );pDC->TextOut(0,20,str); / 輸出成績J3. 增加一個菜單項在“編輯”菜單的最下面增加一個菜單項,Caption為“成績錄入”,菜單ID為ID_SCOREFILLING 。4. 為新增菜單在文檔類定義消息處理函數(shù)用ClassWizard在文檔類生成菜單命令處理函數(shù)OnScorefilling()。5. 編輯代碼完成下面的功能(1) 創(chuàng)建對話框?qū)ο蟆?2) 運行成績錄入對話框,并把對話框數(shù)據(jù)成員的值拷貝到文檔類成員變量score數(shù)組中。(3) 計算總分。(4) 更新視圖。具體代碼見程序清單 6-5所示粗體部分。程序清單6-5 :調(diào)用模式對話框示例void

42、CExam6_1Doc:OnScorefilling() / TODO: Add your command handler code hereCScoreDlg dlg; /創(chuàng)建對話框?qū)ο骾f(dlg.DoModal()=IDOK )/ 調(diào)用對話框并判斷返回值為IDOK 使用對話框?qū)ο蟮某蓡T變量的值修改文檔對象的成員變量score0=dlg.m_score1 ;score1=dlg.m_score2 ;score2=dlg.m_score3 ;score3=dlg.m_score4 ;score4=dlg.m_score5 ;for(int i=0;i<5;i+)計算總分TScore+=

43、scorei;this->UpdateAllViews(NULL); / 更新視圖 j6. 加入頭文件在Exam6_1Doc.cpp文件的頭部的所有的 include語句之后加入語句: #include ScoreDlg.h”7. 編輯運行程序執(zhí)行菜單命令“編輯”-> “成績錄入”,彈出“成績錄入”對話框,輸入各門課的成績后,按“確 定”退出對話框,應(yīng)用程序主窗口中顯示剛剛輸入的各課成績和總分。6.4.2對話框初始化對話框的初始化工作包括:為控件賦初始值(如:文本框的顯示值,單選按鈕,復(fù)選框的選中狀態(tài) 等),或者設(shè)置控件的初始狀態(tài)(如:控件是否可用、是否顯示,下拉框中的選擇項等)。

44、為控件賦初始值也就是為對話框?qū)ο蟮臄?shù)據(jù)成員變量賦初值,可在兩個位置進行:1. 對話框類的構(gòu)造函數(shù)系統(tǒng)一般在對話框類的構(gòu)造函數(shù)中,為數(shù)據(jù)成員變量賦初值。2. 對話框?qū)ο髣?chuàng)建后對話框?qū)ο笠话阍谝粋€菜單命令處理函數(shù)中創(chuàng)建,創(chuàng)建后在對話框調(diào)用之前,也就是在DoModal ()函數(shù)調(diào)用之前,可以通過對象調(diào)用數(shù)據(jù)成員變量為其賦初值。修改程序清單 6-5中的OnScorefilling()函數(shù),實現(xiàn)每次調(diào)用成績錄入對話框時,以文檔對象 score 數(shù)組中現(xiàn)有的成績?yōu)槌跏贾?,作為對?dāng)前視圖的修改。增加的代碼見程序清單6-6所示粗體部分。程序清單6-6 :模式對話框數(shù)據(jù)成員賦初值 void CExam6_1Do

45、c:OnScorefilling() / TODO: Add your command handler code hereCScoreDlg dlg;/創(chuàng)建對話框?qū)ο骴lg.m_score1=score0; 初始化對話框數(shù)據(jù)成員 dlg.m_score2=score1; dlg.m_score3=score2; dlg.m_score4=score3; dlg.m_score5=score4; if(dlg.DoModal()=IDOK)score0=dlg.m_score1 ;score1=dlg.m score2 ;score2=dlg.m_score3 ;score3=dlg.m_sco

46、re4 ;score4=dlg.m_score5 ;for(int i=0;i<5;i+)TScore+=scorei;this->UpdateAllViews(NULL);修改后再次編譯運行程序,可以看到每次對話框打開時,控件的初值都能反應(yīng)當(dāng)前視圖的顯示。程 序清單6-6也給出的調(diào)用對話框的一個范例,一般遵循四個基本步驟:(1) 創(chuàng)建對話框?qū)ο?2) 初始化對話框(3) 調(diào)用對話框(4) 確定返回后的處理圖6-18中文檔對象和對話框?qū)ο笾g交換數(shù)據(jù)通常是在第(2)、(4)步編寫代碼完成的。設(shè)置控件的初始狀態(tài),可以直接在對話框資源中各控件的屬性對話框中進行,更靈活地方式是在對話框類

47、的OnInitDialog()函數(shù)中進行控件的設(shè)置。默認情況下,OnInitDialog()函數(shù)不出現(xiàn)在對話框類中,需要映射對話框類的WM_INITDIALOG窗口消息。下面繼續(xù)修改應(yīng)用程序Exam6_1,實現(xiàn)功能:打開成績錄入對話框時,“確定”按鈕不可用,當(dāng)任意一個Edit Box的內(nèi)容修改后,“確定”按鈕可以使用。實現(xiàn)步驟如下:(1)打開ClassWizard的Member Variables標簽頁,增加數(shù)據(jù)成員變量如表6-2所示。表6-2 EX6數(shù)據(jù)成員變量設(shè)置控件ID變量名稱分類數(shù)據(jù)類型IDC_SCORE1m_Score1EditcontrolCEditIDC_SCORE2m_Scor

48、e2EditcontrolCEditIDC_SCORE3m_Score3EditcontrolCEditIDC_SCORE4m_Score4EditcontrolCEditIDC_SCORE5m_Score5EditcontrolCEditIDOKm_OKcontrolCButton(2) 打開 ClassWizard 的 Message Maps 標簽頁,Class name 中選擇 CScoreDlg 類,Objects IDs 中選 擇 CScoreDlg , Messages中選擇 WM_INITDIALOG 窗口消息,單擊 Add Function 按鈕。在對話 框類CScoreDl

49、g中增加了成員函數(shù) OnInitDialog()。(3) 增加代碼如程序清單6-7所示粗體部分。使對話框顯示時,“確定”按鈕灰色顯示不能使用。程序清單6-7 :初始化對話框函數(shù)示例BOOL CScoreDlg:OnInitDialog()(CDialog:OnInitDialog();/ TODO: Add extra initialization herem OK.EnableWindow (false);/ 禁止“確定”按鈕使用,灰色顯示 return TRUE; / return TRUE unless you set the focus to a control/ EXCEPTION:

50、 OCX Property Pages should return FALSE(4) 打開 ClassWizard 的 Message Maps 標簽頁,Class name 中選擇 CScoreDlg , Object IDs 中選擇IDC_SCORE1 , Messages中選擇 EN_CHANGE 事件消息,單擊 Add Function按鈕。對話框類 CScoreDlg增加對Edit Box進行修改事件的處理函數(shù)OnChangeScore1()。(5) 在OnChangeScore1()函數(shù)中添加代碼如程序清單6-8所示粗體部分,使"確定”按鈕可用。程序清單6-8 : Edi

51、tBox響應(yīng)EN CHANGE件處理函數(shù)示例void CScoreDlg:OnChangeScore1()(/ TODO: Add your control notification handler code herem_OK.EnableWindow (true);(6) 重復(fù)、(5)兩步,為每一個 Edit Box控件映射EN_CHANGE事件處理函數(shù),并添加代碼,使“確定”按鈕可用。(7) 編譯運行程序。6.4.3無模式對話框無模式對話框與模式對話框的不同在于,用戶打開無模式對話框后,仍然可以與其它用戶界面交互。創(chuàng)建無模式對話框的過程與模式對話框基本相同,都包括對話框資源的創(chuàng)建和對話框的

52、創(chuàng)建,但在運行 對話框的設(shè)計上存在著差異:(1) Visible 屬性在對話框的屬性對話框More Styles標簽頁中,有 Visible屬性的設(shè)置,默認情況下,對話框模板是不選擇Visible屬性。模式對話框不需要設(shè)置該屬性,而無模式對話框沒有選擇該屬性,窗口創(chuàng)建后, 對話框是不顯示的,需要調(diào)用CWnd:ShowWindow(SW_SHOW)來顯示對話框。(2) 創(chuàng)建方式由于無模式對話框?qū)ο笤诔绦蜻\行時可以一直存在,所以不能以局部變量的形式創(chuàng)建,只能用new操作符動態(tài)創(chuàng)建,并且在調(diào)用對話框類的窗口類內(nèi)聲明一個指向?qū)υ捒蝾惖闹羔樧兞?,通過指針訪問對 話框?qū)ο蟆?3) 窗口創(chuàng)建方式無模式對話框

53、的創(chuàng)建與普通窗口的創(chuàng)建是一樣的,通過調(diào)用CWnd:Create()函數(shù)來創(chuàng)建對話框。由于Create()函數(shù)不會啟動新的消息循環(huán),對話框與應(yīng)用程序共用一個消息循環(huán),這樣對話框就不會屏蔽 用戶對其它界面對象的訪問。Create()函數(shù)與DoModal()函數(shù)不同之處是:Create()創(chuàng)建了對話框后立即返 回,而DoModal()函數(shù)要在對話框關(guān)閉后返回。(4) 窗口刪除函數(shù)無模式對話框必須調(diào)用 CWnd:DestoryWindow()來關(guān)閉對話框。模式對話框是調(diào)用 CDialog:EndDialog()關(guān)閉對話框。由于默認的對話框函數(shù)OnOK()和OnCancel()都是調(diào)用 EndDialo

54、g()關(guān)閉對話框的,所以無模式對話框類要用自己的OnOK()和OnCancel()函數(shù),調(diào)用DestoryWindow()來關(guān)閉對話框。(5) 清理對話框?qū)ο蟮姆绞脚c創(chuàng)建對象的方式 new操作相對應(yīng),使用delete操作刪除一個無模式對話框?qū)ο?。?dāng)屏幕上一個窗 口被刪除后,框架會自動調(diào)用 CWnd:PostNcDestroy(),這是一個函數(shù),可以編寫程序在這個函數(shù)中清理 無模式對話框?qū)ο蟆?6) 無模式對話框不能重入因為在無模式對話框打開的情況下,用戶有可能再次選擇菜單命令執(zhí)行打開對話框的操作,這是不 能再創(chuàng)建一個新的無模式對話框。所以程序在用戶選擇菜單命令后,應(yīng)該能夠判斷是打開一個新的對話

55、 框還是激活一個已打開的對話框。通??梢允褂脤υ捒?qū)ο笾羔榿砼袛?。對話框?qū)ο笾羔樖冀K指向一個 對話框?qū)ο?,?dāng)關(guān)閉對話框時,設(shè)置指針的值為NULL。下面我們在工程 Exam6_1中增加一個可以畫圓的無模式對話框:1. 增加一個對話框模板使用菜單命令I(lǐng)nsert->Resource,增加一個新的對話框模板IDD_DIALOG2,如圖6-19所示,增加相應(yīng)控件并設(shè)置屬性。圖6-19無模式對話框控件ID變量名稱分類數(shù)據(jù)類型IDC_EDIT1m_xvalueintIDC_EDIT2m_yvaluelintIDC_EDIT3m_radiusvalueint表6-3數(shù)據(jù)成員變量2. 創(chuàng)建對話框類CModelessDlg,并按表6-3創(chuàng)建對話框類的數(shù)據(jù)成員變創(chuàng)建成員函數(shù)。打開ClassWizard ,創(chuàng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論