第6章 對話框和標(biāo)準(zhǔn)控件.ppt_第1頁
第6章 對話框和標(biāo)準(zhǔn)控件.ppt_第2頁
第6章 對話框和標(biāo)準(zhǔn)控件.ppt_第3頁
第6章 對話框和標(biāo)準(zhǔn)控件.ppt_第4頁
第6章 對話框和標(biāo)準(zhǔn)控件.ppt_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第 6 章 對話框和標(biāo)準(zhǔn)控件,對話框是Windows應(yīng)用程序中一種常用的資源,其主要功能是輸出信息和接收用戶的輸入數(shù)據(jù)??丶乔度朐趯υ捒蛑谢蚱渌复翱谥械囊粋€特殊的小窗口,它用于完成不同的輸入、輸出功能。 對話框與控件關(guān)系密切,在每個對話框上一般都有一些控件,對話框依靠這些控件與用戶進(jìn)行信息的交互。 本章主要介紹對話框的工作原理和編程方法,并通過實例學(xué)習(xí)一些標(biāo)準(zhǔn)控件和公共控件的使用方法。,6.1 對話框概述,在MFC中,對話框的功能被封裝在CDialog類中,而CDialog類是CWnd類的派生類。作為窗口,對話框和其它窗口一樣具有窗口的一切功能。 對話框的一個典型應(yīng)用是通過菜單命令或工具欄

2、按鈕打開一個對話框,當(dāng)然,對話框也可以作為一個程序的主界面。,6.1.1 基于對話框的應(yīng)用程序,可以直接利用MFC AppWizard向?qū)?chuàng)建一個基于對話框的應(yīng)用程序,這種程序運(yùn)行后首先出現(xiàn)一個對話框。在向?qū)У牡谝徊竭x擇Dialog Based項。此時,應(yīng)用程序向?qū)⒊霈F(xiàn)與單文檔和多文檔程序向?qū)Р煌牟僮鞑襟E,因為對話框應(yīng)用程序一般不包含文檔,故不支持?jǐn)?shù)據(jù)庫和復(fù)合文檔。 按照對話框應(yīng)用程序向?qū)崾镜牟襟E進(jìn)行操作就得到一個對話框應(yīng)用程序項目,出現(xiàn)對話框編輯器和控件工具欄浮動窗口,它們采用的是一種所見即所得的可視化工作方式。利用向?qū)?chuàng)建應(yīng)用程序的框架后,程序員可根據(jù)程序具體功能要求添加代碼。,例

3、編寫一個對話框應(yīng)用程序MyDialog,程序運(yùn)行后顯示一個對話框,并在對話框上顯示文本串。,1執(zhí)行File|New命令出現(xiàn)New對話框,選擇MFC AppWizardexe項,輸入程序名MyDialog,單擊OK按鈕。在隨后出現(xiàn)的MFC AppWizard-Step 1對話框窗口中選擇Dialog Based選項,單擊Finish按鈕就創(chuàng)建了應(yīng)用程序項目,并在Developer Studio中打開了對話框編輯器和控件工具欄。 2去掉對話框中標(biāo)題為“TODO: 在這里設(shè)置對話控制”的靜態(tài)文本控件,調(diào)整對話框大小,在成員函數(shù)CMyDialogDlg:OnPaint()中添加代碼。,void CMy

4、DialogDlg:OnPaint() . . . . . . else CPaintDC dc(this); dc.SetBkMode(TRANSPARENT);/背景設(shè)透明 dc.TextOut(20, 50, 這是一個對話框應(yīng)用程序!); CDialog:OnPaint(); ,6.1.2 對話框類CDialog,MFC提供了一系列對話框類,并實現(xiàn)了對話框消息響應(yīng)和處理機(jī)制。CDialog類是對話框類中最重要的類,我們在程序中創(chuàng)建的對話框類一般都是CDialog類的派生類。CDialog類還是其它所有對話框類的基類,其派生關(guān)系如下所示: CObject CCmdTarget CWnd C

5、Dialog,對話框類為程序員提供了管理對話框的編程接口。 CDialog類從CWnd類派生而來,所以它繼承了CWnd類的成員函數(shù),具有CWnd類的基本功能,可以編寫代碼移動、顯示或隱藏對話框,并能根據(jù)對話框的特點(diǎn)增加新的成員函數(shù),擴(kuò)展它的功能。 在CDialog類的派生類中可以直接調(diào)用CDialog類的成員函數(shù)。大部分的成員函數(shù)是虛函數(shù),可以在派生類中重載,以實現(xiàn)特定的目的。 除了CDialog類成員函數(shù),類CWnd和CWinApp也提供了一些成員函數(shù)用于對話框的管理。,對話框的分類,對話框主要有以下兩種: (1)模態(tài)對話框 在對話框關(guān)閉之前,用戶無法在應(yīng)用程序的其他窗口中進(jìn)行工作的對話框稱

6、為模態(tài)對話框。 例如,Windows的各種應(yīng)用軟件中的Open File對話框。用戶不能在應(yīng)用程序的其他地方工作,直到模態(tài)對話框關(guān)閉。 (2)非模態(tài)對話框 對話框保留在屏幕的同時,用戶還可以在應(yīng)用程序其他窗口中進(jìn)行工作的對話框稱為非模態(tài)對話框。 例如,Word字處理軟件中的Find和Replace對話框就是非模態(tài)對話框的例子。,有關(guān)對話框的常用處理函數(shù) CDialog:CDialog() 通過調(diào)用派生類構(gòu)造函數(shù),根據(jù)對話框資源模板定義一個對話框。 CDialog:DoModal() 激活模態(tài)對話框,顯示對話框窗口。 CDialog:Create() 根據(jù)對話框資源模板創(chuàng)建非模態(tài)對話框窗口。如果

7、對話框不是Visible屬性,還需通過調(diào)用CWnd:ShowWindow()函數(shù)顯示非模態(tài)對話框窗口。 CDialog:OnOk() 單擊OK按鈕時調(diào)用該函數(shù),接收對話框輸入數(shù)據(jù),關(guān)閉對話框。 CDialog:OnCancel() 單擊Cancel按鈕或按Esc鍵時調(diào)用該函數(shù),不接收對話框輸入數(shù)據(jù),關(guān)閉對話框。,CDialog:OnInitDialog() WM_INITDIALOG消息處理函數(shù),在調(diào)用DoModal或Create函數(shù)時系統(tǒng)發(fā)送WM_INITDIALOG消息,在顯示對話框前調(diào)用該函數(shù)進(jìn)行初始化。 CDialog:EndDialog() 用于關(guān)閉模態(tài)對話框窗口。 CWnd:Sho

8、wWindow() 顯示或隱藏對話框窗口 CWnd:DestroyWindow() 關(guān)閉并銷毀非模態(tài)對話框 CWnd:UpdateData() 通過調(diào)用DoDataExchange()設(shè)置或獲取對話框控件的數(shù)據(jù) CWnd:DoDataExchange() 被UpdateData()調(diào)用以實現(xiàn)對話框數(shù)據(jù)交換,不能直接調(diào)用。,CWnd:GetWindowText() 獲取對話框窗口的標(biāo)題 CWnd:SetWindowText() 修改對話框窗口的標(biāo)題 CWnd:GetDlgItemText() 獲取對話框中控件的文本內(nèi)容 CWnd:SetDlgItemText() 設(shè)置對話框中控件的文本內(nèi)容 CW

9、nd:GetDlgItem() 獲取控件或子窗口的指針 CWnd:MoveWindow() 用于移動對話框窗口 CWnd:EnableWindow() 使窗口處于禁用或可用狀態(tài),6.1.3 對話框數(shù)據(jù)交換DDX和驗證DDV,在對話框中實現(xiàn)用戶數(shù)據(jù)輸入和輸出的一般方法是通過ClassWizard類向?qū)υ捒蚩丶c成員變量相關(guān)聯(lián),利用對話框數(shù)據(jù)交換DDX(Dialog Data Exchange)和驗證DDV(Dialog Data Validation)機(jī)制實現(xiàn)數(shù)據(jù)的輸入和輸出。 MFC提供了CDataEchange類實現(xiàn)對話框數(shù)據(jù)交換DDX,交換功能由DoDataExchange()完成。但

10、是不能直接調(diào)用,它由CWnd類的成員函數(shù)UpdateData()調(diào)用。,當(dāng)利用ClassWizard類向?qū)砑映蓡T變量時,用戶如果在窗口的左下角輸入數(shù)據(jù)的范圍,ClassWizard將自動加入函數(shù)DDV的調(diào)用代碼。 例如,當(dāng)添加一個UINT型的成員變量m_nInput時指定它的最小值和最大值分別為0和100,則ClassWizard類向?qū)⒃诔蓡T函數(shù)DoDataExchange()中添加以下DDV函數(shù)的調(diào)用語句: DDV_MinMaxUInt(pDX, m_nInput, 0, 100); 程序運(yùn)行后,如果用戶的輸入數(shù)據(jù)超出0100的范圍,DDV將顯示一個提示信息對話框,提示用戶有效的輸入范圍

11、。,UpdateData()的用法:,當(dāng)調(diào)用UpdateData(TRUE)時,MFC通過調(diào)用DDX函數(shù)將數(shù)據(jù)從控件傳遞到關(guān)聯(lián)的成員變量;當(dāng)調(diào)用UpdateData(FALSE)時,MFC通過調(diào)用DDX函數(shù)將數(shù)據(jù)從成員變量傳遞到關(guān)聯(lián)的的控件。利用UpdateData()函數(shù)實現(xiàn)了在刷新后重新獲取成員變量。,注意: 表面上看程序并沒有調(diào)用UpdateData(),但是,當(dāng)程序調(diào)用CDialog:DoModal()創(chuàng)建并顯示對話框時,將自動調(diào)用CDialog:OnInitDialog()完成初始化的工作。在OnInitDialog()中調(diào)用了UpdateData(FALSE),將數(shù)據(jù)從成員變量傳遞

12、到關(guān)聯(lián)的控件,從而顯示在控件中。而單擊OK按鈕將調(diào)用CDialog:OnOk()函數(shù),在OnOK()中調(diào)用了UpdateData(TRUE),將數(shù)據(jù)從控件傳遞到關(guān)聯(lián)的成員變量。 由此看來,不管MFC將DDX技術(shù)如何復(fù)雜化,我們只需知道,DDX就如同一條雙向通道,而方向控制開關(guān)就是UpdateData()函數(shù)中的BOOL類型參數(shù)是TRUE還是FALSE。,6.1.4 提示信息對話框,提示信息對話框也稱消息對話框,用來顯示有關(guān)的提示信息。提示信息對話框是一種最簡單的對話框,不需要用戶自己創(chuàng)建它就可以直接使用,Visual C+提供了相應(yīng)的函數(shù)實現(xiàn)這樣的功能。: int AfxMessageBox(

13、LPCTSTR lpText, UINT nType=MB_OK, UINT nlDHelp=0); int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT nType); int CWnd:MessageBox(LPCTSTR lpText, LPCTSTR lpCaption=NULL, UINT nType=MB_OK);,這三個函數(shù)分別是MFC全局函數(shù)、API函數(shù)和CWnd類的成員函數(shù),它們的功能基本相同,但適用范圍有所不同。AfxMessageBox()和:MessageBox()可以在程序中任何地方使用,而

14、CWnd:MessageBox()只能用于控件、對話框、窗口等一些窗口類中。,例如,在軟件安裝過程中為了彈出如下圖所示的警告提示信息對話框并進(jìn)行相應(yīng)的處理:,編寫的代碼如下: int nChoice=MessageBox(文件復(fù)制失敗!, 錯誤, MB_ICONWARNING | MB_ABORTRETRYIGNORE ); switch(nChoice) case IDABORT: / 用戶按下終止按鈕 . . . . . . caseIDRETRY: / 用戶按下重試按鈕 . . . . . . case IDIGNORE: / 用戶按下忽略按鈕 . . . . . . ,6.2 使用對話

15、框,為了在屏幕上顯示對話框: (1)首先需要建立對話框資源及其與資源相關(guān)的對話框類; (2)然后添加控件、與控件關(guān)聯(lián)的成員變量和消息處理函數(shù); (3)最后在程序中顯示對話框并訪問與控件關(guān)聯(lián)的成員變量。 在Visual C+中可以利用集成工具如對話框編輯器和ClassWizard類向?qū)Ш芊奖愕貏?chuàng)建對話框,不需要程序員手工編寫太多的源代碼。,6.2.1 一般對話框工作流程,1.當(dāng)定義了一個對話框類后,就可以利用這個對話框類聲明一個對話框?qū)ο?,即一個能夠在屏幕上顯示的對話框。 2.聲明了一個對話框?qū)ο蠛?,可以調(diào)用對話框類的成員函數(shù)DoModal()建立對話框窗口并顯示對話框。 例如,假設(shè)定義了一個名

16、為CMyDialog的對話框類,為了在屏幕上顯示一個對話框,可以編寫如下代碼: CMyDialog myDlg; myDlg.DoModal();,函數(shù)OnOK()、 OnCancel()與DoModal()的關(guān)系: 對話框中一般都有OK和Cancel按鈕,單擊OK按鈕時調(diào)用CDialog:OnOK()函數(shù),單擊Cancel按鈕時調(diào)用CDialog:OnCancel()函數(shù)。 OnOK()函數(shù)和OnCancal()函數(shù)都將結(jié)束DoModal()函數(shù)調(diào)用,但令DoModal()返回不同的值。OnOK()函數(shù)令DoModal()返回IDOK,OnCancel()函數(shù)令DoModal()返回IDCA

17、NCAL。 用戶可以根據(jù)DoModal()的返回值做出不同的選擇。如: if (myDlg.DoModal() = = IDOK ) ,對話框的初始化可以在三個不同的階段所調(diào)用的函數(shù)中進(jìn)行: (1)對話框類構(gòu)造函數(shù); (2)WM_CREATE消息處理函數(shù); (3)WM_INITDIALOG消息處理函數(shù)。 通常是在消息WM_INITDIALOG的消息處理函數(shù)OnInitDialog()中進(jìn)行初始化。在收到WM_INIT- DIALOG消息時,對話框的框架已創(chuàng)建,對話框中的每個控件也已建立起來,但它們還沒有在屏幕上顯示。此時自然可以設(shè)置或優(yōu)化對話框中各個控件的外觀、尺寸、位置以及其它屬性。函數(shù)On

18、InitDialog()將被成員函數(shù)DoModal()調(diào)用。,6.2.2 創(chuàng)建對話框,在Windows中對話框是作為一種資源被使用,在程序中要創(chuàng)建一個對話框,首先要創(chuàng)建一個對話框模板資源,然后創(chuàng)建一個基于該對話框模板資源的對話框類。對話框模板資源指定了對話框本身的屬性(如大小、位置、風(fēng)格、類型等)和對話框中的控件及屬性, 對話框類規(guī)定了對話框和對話框中每個控件的行為。通過對話框模板資源才能創(chuàng)建對話框類和對象。,為了向應(yīng)用程序項目中添加一個對話框資源,執(zhí)行Insert|Resource命令或直接按Ctrl+R鍵,彈出Insert Resource資源列表框。一般要加入通用對話框資源,所以在Ins

19、ert Resource框中直接選擇Dialog項,然后單擊New按鈕。系統(tǒng)將給對話框資源設(shè)置一個默認(rèn)的ID標(biāo)識,對話框的默認(rèn)標(biāo)題Caption為Dialog,對話框有OK和Cancel兩個按鈕。,對話框資源的添加:,添加對話框資源的簡單方法:,在項目工作區(qū)鼠標(biāo)右擊資源項Dialog,從彈出式菜單中選擇“Insert Dialog”命令項。,對話框是在對話框模板資源和對話框類的基礎(chǔ)上形成的,在完成了對話框的屬性和外觀設(shè)計后,再來設(shè)計對話框的行為。 我們需要利用ClassWizard類向?qū)?chuàng)建一個對話框類,并將這個類同先前創(chuàng)建的對話框資源連接起來。 在創(chuàng)建對話框類之前或之后,都可以為對話框資源添

20、加控件。 但在創(chuàng)建對話框類之后,才可以為對話框資源添加與對話框控件相關(guān)聯(lián)的成員變量和消息處理函數(shù)。,創(chuàng)建對話框類:,如果按Ctrl+W鍵或在對話框資源的非控件區(qū)域雙擊鼠標(biāo),ClassWizard類向?qū)l(fā)現(xiàn)已添加了一個對話框模板資源,卻沒有設(shè)計其對應(yīng)的類,因此將彈出Adding a Class對話框,詢問用戶是否需要利用該對話框資源創(chuàng)建一個對話框類。,Name框:用于輸入對話框類的名稱; File Name框:列出類的文件名,單擊Change按鈕可改變文件名; Base class下拉框:列出可選擇的基類; Dialog ID下拉框:列出可選擇對話框資源的ID。,在Adding a Class

21、對話框單擊OK按鈕,彈出New Class對話框:,例 假設(shè)已利用MFC AppWizard應(yīng)用程序向?qū)Ы⒘艘粋€名為Mysdi的單文檔應(yīng)用程序,請向應(yīng)用程序中添加對話框資源和對話框類。 1首先向應(yīng)用程序項目添加一個對話框資源,在項目工作區(qū)鼠標(biāo)右擊資源項Dialog,從彈出式菜單中執(zhí)行Insert Dialog命令,插入一個對話框資源。,2設(shè)置對話框的屬性,將光標(biāo)指向?qū)υ捒虻目瞻孜恢?,單擊鼠?biāo)右鍵,從彈出式菜單中選擇Properties項,或直接按Enter鍵,彈出Dialog Properties屬性對話框。該對話框包括General、Styles、More Styles、Extended

22、Styles、More Extended Styles等頁面,用于設(shè)置對話框多種不同的屬性。 3創(chuàng)建對話框類,鼠標(biāo)雙擊對話框資源的非控件區(qū)域。,6.2.3 添加控件及關(guān)聯(lián)的成員變量,如果沒有控件,對話框完成不了什么具體功能,對話框與控件有著密不可分的關(guān)系。結(jié)合對話框編輯器,利用Controls控件工具欄可給當(dāng)前正在編輯的對話框模板資源添加控件。 若Visual C+窗口中沒有出現(xiàn)Controls工具欄,只需將光標(biāo)指向菜單欄并單擊鼠標(biāo)右鍵,從彈出式菜單中選擇Controls項。 控件工具欄上的每一個圖標(biāo)都代表了一種控件,如果不能確定控件的類型,只要將光標(biāo)在該控件圖標(biāo)上停留片刻,就會顯示該控件類型

23、的提示。,向?qū)υ捒蛱砑涌丶r,先在Controls工具欄單擊要添加的控件,再將光標(biāo)指向?qū)υ捒蚩瞻讌^(qū)域并單擊鼠標(biāo)。,添加與控件關(guān)聯(lián)的成員變量,在生成自己的對話框類并添加需要的控件后,可以利用ClassWizard類向?qū)г趯υ捒蝾惖亩x中為對話框資源上的每一個控件添加一個或多個對應(yīng)的成員變量。 ClassWizard類向?qū)У腗ember Variables頁面主要用來為對話框類添加和刪除與對話框控件關(guān)聯(lián)的成員變量,我們在編寫對話框程序時經(jīng)常同該頁面打交道。,Class name下拉框:選擇要添加成員變量的對話 框類; Control IDs欄:選擇控件,因為要添加的成員變量總是與一個對話框控件ID

24、聯(lián)系在一起,它們代表控件對象本身或控件的某項屬性; Add Variable按鈕:添加與控件關(guān)聯(lián)的成員變量; Delete Variable按鈕:刪除控件的某個成員變量。 Control IDs欄:列出對話框資源上已有的控件,第1列Control IDs表示控件的ID,第2列Type表示變量的類型,第3列Member表示成員變量名。,在Member Variables頁面:,Add Member Variable對話框,Member variable name框:輸入成員變量名; Category下拉框:選擇成員變量的類別,可為Control或Value; Variable type下拉框:選

25、擇成員變量的類型。,如果在Category下拉框選擇Value項,表示要為該控件的某項屬性定義一個變量,這意味著程序關(guān)心的是控件中的值,而不是控件對象本身。這時,還可以通過Variable type下拉框為變量選擇不同的類型。,如果在Category下拉框中選擇Control項,則表示定義的變量代表控件對象本身, Control類別的變量實質(zhì)是一個控件對象,其類型是MFC控件類。,可以為一個控件同時定義一個Control類別的變量和一個Value類別的變量。這些變量都是作為對話框派生類的成員變量,為了在程序其它地方能夠直接訪問添加的成員變量,它們都被聲明為public屬性。,例 完善Mysdi

26、程序,向?qū)υ捒蛸Y源添加需要使用的控件,并添加與控件關(guān)聯(lián)的成員變量。,1向?qū)υ捒蛸Y源添加控件。添加一個靜態(tài)文本控件,其Caption為“請輸入半徑”。添加一個Edit Box編輯框控件,其ID標(biāo)識為IDC_EDIT_ RADIUS,該控件用于接收用戶的輸入數(shù)據(jù)。 2添加與控件關(guān)聯(lián)的成員變量。按Ctrl+W鍵啟動ClassWizard類向?qū)?,單擊Member Variables標(biāo)簽。在Class name下拉框選擇類CRadiusDialog,在Control IDs欄選擇編輯框IDC_EDIT_RADIUS,單擊Add Variable按鈕。通過Add Member Variable對話框添加成

27、員變量m_nRadius,其數(shù)據(jù)類型為UINT。 3使用對話框數(shù)據(jù)驗證DDV功能,在該頁面的左下角輸入成員變量m_nRadius的最小值5和最大值250。,例 完善Mysdi程序,通過“編輯”菜單中的“輸入半徑(I)”命令打開上述標(biāo)題為“輸入半徑”的對話框,并根據(jù)輸入的半徑畫一個圓。 1為了在視圖對象中接收并存儲對話框編輯控件的值,在視圖類CMysdiView中手工定義一個UINT類型的成員變量m_nCViewRadius。 2利用菜單編輯器在“編輯”菜單增加一個菜單項“輸入半徑(I)”,其ID標(biāo)識為ID_EDIT_INPUTRADIUS,Caption為“輸入半徑( / 定義一個對話框?qū)ο?

28、dlg.m_nRadius=100;/ 設(shè)置編輯框顯示的初始值 if (dlg.DoModal()=IDOK) / 顯示對話框 m_nCViewRadius=dlg.m_nRadius; / 接收并存儲編輯框數(shù)據(jù) Invalidate(); / 刷新視圖 ,3在視圖類構(gòu)造函數(shù)CMysdiView:CMysdiView()中將成員變量m_nCViewRadius初始化為0。在函數(shù)CMysdiView:OnDraw()中添加如下畫圓的語句: pDC-Ellipse(0, 0, 2*m_nCViewRadius, 2*m_nCViewRadius); 在視圖類實現(xiàn)文件MysdiView.cpp的開始

29、位置加入包含對話框類頭文件的語句: #include RadiusDialog.h”,例:采用另一種方法獲取對話框編輯框控件的數(shù)據(jù)。 步驟: 1.刪除編輯框控件的成員變量m_nRadius. 2.給CRadiusDialog添加WM_INITAIALOG的消息函數(shù)。 BOOL CRadiusDialog:OnInitDialog() CDialog:OnInitDialog(); CString strRadius; strRadius.Format(%d,100); CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_RADIUS); pEdit-SetWindo

30、wText(strRadius); return TRUE; ,3.在CRadiusDialog定義一個public屬性、UINt類型的成員變量m_nDiaCtlRdu。在IDOK添加BN_CLICKED的消息函數(shù),添加代碼: void CRadiusDialog:OnOK() m_nDiaCtlRdu=GetDlgItemInt(IDC_EDIT_RADIUS); CDialog:OnOK(); ,4.改寫菜單項“輸入半徑”的命令函數(shù)。 void CMysdiView:OnEditInputradius() / TODO: Add your command handler code here

31、 CRadiusDialog dlg; / 定義一個對話框?qū)ο?if (dlg.DoModal()=IDOK) / 顯示對話框 m_nCViewRadius=dlg.m_nDiaCtlRdu; / 接收并存儲編輯框數(shù)據(jù) Invalidate(); / 刷新視圖 ,6.3 標(biāo)準(zhǔn)控件,Windows提供的控件分為兩類:標(biāo)準(zhǔn)控件和公共控件。 標(biāo)準(zhǔn)控件:靜態(tài)控件、編輯框、按鈕、列表框、組合框和滾動條等。利用標(biāo)準(zhǔn)控件可滿足大部分用戶界面程序設(shè)計的要求。 公共控件:滑塊、進(jìn)度條、列表視控件、樹視控件和標(biāo)簽控件等,利用公共控件實現(xiàn)應(yīng)用程序用戶界面風(fēng)格的多樣性。,6.3.1 控件概述,控件是Windows提供

32、的完成特定功能的獨(dú)立小部件,它使應(yīng)用程序?qū)υ捁δ艿脑O(shè)計更容易完成,在對話框與用戶的交互過程中擔(dān)任主要角色,用于完成用戶輸入和程序運(yùn)行過程中的輸出。 控件對應(yīng)一個CWnd派生類的對象,它實際上也是一個窗口,可以通過調(diào)用窗口類的成員函數(shù)實現(xiàn)控件的移動、顯示或隱藏、禁用或可用等操作,也可以重新設(shè)置它們的尺寸和風(fēng)格等屬性。 MFC以類的形式對標(biāo)準(zhǔn)控件和公共控件進(jìn)行了封裝,這些類大部分是從CWnd類直接派生而來。,常用的MFC控件類,常用的MFC控件類,控件通知Notification消息:,用戶對控件的操作將引發(fā)控件事件,Windows產(chǎn)生對應(yīng)的控件通知Notification消息,消息由其父窗口(如

33、對話框)接收并處理。 標(biāo)準(zhǔn)控件發(fā)送WM_COMMAND控件通知消息,公共控件一般發(fā)送WM_NOTIFY控件通知消息,有時也發(fā)送WM_COMMAND消息。 通過WM_COMMAND消息參數(shù)標(biāo)識發(fā)出消息的控件和具體的事件,消息參數(shù)中包含了控件的ID標(biāo)識和通知碼(如BN_CLICKED單擊按鈕事件)??丶ㄖa前綴最后一個字母為N。 程序員不必關(guān)心消息具體的發(fā)送和接收,只需利用ClassWizard將控件映射到成員變量,將控件消息映射到成員函數(shù),然后編寫具體的處理代碼。,控件的創(chuàng)建方法:,控件在程序中可作為對話框控件或獨(dú)立的窗口兩種形式存在,因此,控件的創(chuàng)建方法也有兩種。 一種方法是在對話框模板資源

34、中指定控件,這樣當(dāng)應(yīng)用程序創(chuàng)建對話框時,Windows就會為對話框創(chuàng)建控件,編程時我們一般都采用這種方法。 一種方法是通過調(diào)用MFC控件類的成員函數(shù)Create()創(chuàng)建控件,也可以調(diào)用API函數(shù)CreateWindow()或CreateWindowEx()創(chuàng)建控件。 控件也可以用于其它窗口,如在程序視圖窗口顯示控件。這時,需要首先聲明一個MFC控件類的對象,然后調(diào)用Create()函數(shù)創(chuàng)建控件。,6.3.2 控件的組織,1. 添加或刪除控件 打開對話框編輯器和控件工具欄,在控件工具欄中單擊要添加的控件,此時,當(dāng)光標(biāo)指向?qū)υ捒驎r將變成十字形狀,在對話框指定位置處單擊鼠標(biāo)左鍵,則該控件被添加到對話

35、框中指定的位置。也可以將光標(biāo)指向控件工具欄中的控件,然后按住鼠標(biāo)不放,采用鼠標(biāo)拖曵的方法將控件拖入到對話框中。 要刪除已添加的控件,先單擊對話框中的控件,再按Delete鍵即可刪除指定的控件。,2. 設(shè)置控件屬性 將光標(biāo)指向?qū)υ捒蛑行柙O(shè)置屬性的控件,按回車鍵(或右擊鼠標(biāo),在彈出式菜單中選擇Properties項)彈出Properties對話框,在Properties對話框中設(shè)置控件屬性??梢詫傩詫υ捒蚴冀K保持打開,只需要按下屬性對話框左上角的圖釘按鈕。 3. 調(diào)整控件的大小 對于靜態(tài)文本控件,當(dāng)輸入標(biāo)題內(nèi)容時,控件的大小會自動改變。對于其它控件,先單擊控件,然后利用控件周圍的尺寸調(diào)整點(diǎn)來改變

36、控件的大小。所選對象的位置和大小將顯示在狀態(tài)欄的右端。,4. 同時選取多個控件 一種方法是在對話框內(nèi)按住鼠標(biāo)不放,拖曵出一個大的虛線框,然后釋放鼠標(biāo),則被該虛線框所包圍的控件都將被同時選取;另一種方法是按住Shift(或Ctrl)鍵不放,然后用鼠標(biāo)連續(xù)選取控件。 5. 移動和復(fù)制控件 當(dāng)單個或多個控件被選取后,按方向鍵或用鼠標(biāo)拖動選擇的控件可移動控件。若在鼠標(biāo)拖動過程中按住Ctrl鍵則復(fù)制控件,復(fù)制的控件保持原來控件的大小和屬性。并且,控件能夠通過復(fù)制和粘貼操作而加入到其它對話框中。,6. 編排控件 編排控件主要是指同時調(diào)整對話框中一組控件的大小或位置。編排控件有兩種方法,一種方法是使用控件布

37、局工具欄,自動編排對話框中同時選定的多個控件;另一種方法是使用Layout菜單,當(dāng)打開對話框編輯器時,Layout菜單將出現(xiàn)在菜單欄上。為了便于用戶在對話框內(nèi)精確定位各個控件,系統(tǒng)還提供了網(wǎng)格、標(biāo)尺等輔助功能。 測試對話框和控件的方法: 通過按下Ctrl+T組合鍵就能測試對話框運(yùn)行時的界面效果。,6.3.3 控件共有屬性,控件的屬性決定了控件的外觀和功能,我們只有通過控件屬性對話框才能設(shè)置控件的屬性。 控件屬性對話框上有若干選項卡,如General(通用屬性)、Style(風(fēng)格)及Extend Styles(擴(kuò)展風(fēng)格)選項卡等,其中General頁用于設(shè)置控件的通用屬性,Styles和Exte

38、ndcd Styles頁用來設(shè)置控件的外觀和輔助屬性。 不同控件有不同的屬性,但它們都具有通用屬性,如控件標(biāo)識ID、標(biāo)題Caption等項,,控件的General屬性,6.3.4 靜態(tài)控件,靜態(tài)控件(Static control)是用來顯示一個文本串或圖形信息的控件,它包括靜態(tài)文本控件、圖片控件和組框。 靜態(tài)文本控件用來顯示一般不需要變化的文本;圖片控件用來顯示邊框、矩形、圖標(biāo)或位圖等圖形;組框用來顯示一個文本標(biāo)題和一個矩形邊框,通常用來作為一組控件周圍的虛擬邊界,并將一組控件組織在一起。 管理靜態(tài)文本控件和圖片控件的MFC類是CStatic類,而管理組框的MFC類是CButton類。,所有靜

39、態(tài)控件默認(rèn)的ID標(biāo)識都為IDC_STATIC,如果要為一個靜態(tài)控件添加成員變量或消息處理函數(shù),必須重新為它指定一個唯一的ID標(biāo)識。 編程時用的最多是靜態(tài)文本控件,它被用來作為其它控件的標(biāo)題。每一個靜態(tài)文本控件最多可以顯示255個字符,可以使用“n”換行符,并可以通過Styles頁面設(shè)置控件的風(fēng)格。,6.3.5 編輯框,編輯框(Edit box)又稱文本框或編輯控件,它一般與靜態(tài)文本控件一起使用,用于數(shù)據(jù)的輸入和輸出。編輯框提供了完整的鍵盤輸入和編輯功能,可以輸入各種文本、數(shù)字或者口令。 編輯框為用戶提供了良好的輸入、輸出功能,能夠?qū)㈡I盤輸入的字符串轉(zhuǎn)化為要求的數(shù)據(jù)類型,并驗證它是否符合輸入要求

40、(字符串長度或數(shù)值范圍)。通過前述對話框內(nèi)容的學(xué)習(xí)我們已經(jīng)知道,完成上述工作是利用了MFC提供的對話框數(shù)據(jù)交換(DDX)和數(shù)據(jù)驗證(DDV)技術(shù)。,編輯框常用屬性: Multiline設(shè)置單行或多行編輯,Align text設(shè)置文本對齊方式,Number表示只能輸入數(shù)字,Password表示鍵入編輯框的字符都將顯示為“*”,Uppercase或Lowercase表示鍵入編輯框的字符全部轉(zhuǎn)換成大寫或小寫形式,Read-Only表示只能輸出數(shù)據(jù)。 當(dāng)編輯框的文本被修改,會向父窗口發(fā)送消息,可以利用ClassWizard在對話框類中添加消息處理函數(shù)。編輯框發(fā)送消息有:EN_CHANGE、EN_KIL

41、LFOCUS、EN_SETFOCUS、EN_MAX TEXT、EN_UPDATE等。,例 編寫一個SDI應(yīng)用程序Password,程序啟動后首先彈出一個如圖所示的用戶身份確認(rèn)對話框,當(dāng)用戶鍵入正確的口令后才能進(jìn)入程序的主界面。,6.3.6 按鈕,按鈕(Button)包括按鍵按鈕、單選按鈕、復(fù)選框和組框等4種類型。雖然封裝按鈕控件的MFC類都是CButton類,但它們具有不同的功能。按鍵按鈕在被按下時會立即執(zhí)行某個命令,也被稱為命令按鈕;單選按鈕用于在一組互相排斥的選項中選擇其中一項;復(fù)選框用于在一組選項中選擇其中一項或多項;組框可以使一組控件關(guān)聯(lián)起來。,1. 按鍵按鈕,幾乎所有的對話框都使用簡

42、單的按鍵按鈕,如OK按鈕。通過Properties對話框可以設(shè)置按鈕的不同風(fēng)格,如通過設(shè)置Default button屬性設(shè)置一個默認(rèn)按鈕。默認(rèn)按鈕是指當(dāng)對話框剛顯示時的命令執(zhí)行按鈕,此時按下Enter鍵將執(zhí)行該按鈕的命令功能。一個對話框只能有一個Default button默認(rèn)按鈕,通常情況下將OK按鈕設(shè)置為默認(rèn)按鈕。 其它屬性:Owner draw利用WM_DRAWITEM消息處理函數(shù)定制按鈕的外觀,Icon表示用圖標(biāo)代替原來的文本標(biāo)題,Bitmap表示用位圖代替原來的文本標(biāo)題,Client edge、Static edge、Modal frame用于設(shè)置按鈕的外觀。,2. 單選按鈕,單選

43、按鈕是由一個圓圈和緊隨其后的文本標(biāo)題組成,當(dāng)它被選中時,圓圈中就標(biāo)上一個黑點(diǎn)。 單選按鈕設(shè)置Auto自動屬性為默認(rèn)屬性,Auto屬性表示用戶若選中同組中的某個單選按鈕,則自動清除其余單選按鈕的選中狀態(tài),保證一組選項中始終只有一項被選中。 一般將一組單選按鈕放在一個組框中,在一組單選按鈕中,第一個(Tab鍵順序)按鈕最重要,其ID值可用于在對話框中為控件建立關(guān)聯(lián)的成員變量。必須為同組中的第一個單選按鈕設(shè)置Group屬性,而同組的其它單選按鈕不可再設(shè)置Group屬性。,3. 復(fù)選框,復(fù)選框是由一個空心方框和緊隨其后的文本組成,當(dāng)它被選中時,空心方框中就加上一個“”或“”標(biāo)記。 不同于單選按鈕,在一

44、組復(fù)選框中每次可以同時選擇多項。除了選中和沒選中兩種狀態(tài),復(fù)選框還有第三種狀態(tài),此時選中標(biāo)記顯示為暗色,它表示該項不可以由用戶選擇。通過設(shè)置Tri-state屬性得到這種三態(tài)復(fù)選框。另外,我們可以通過設(shè)置Push-like屬性使單選按鈕或復(fù)選框具有普通按鈕的外觀。,按鈕控件發(fā)送的消息:,按鈕控件只能發(fā)送通知碼為BN_CLICKED(單擊按鈕)和BN_DOUBLECLICKED(雙擊按鈕)的WM_COMMAND消息,我們經(jīng)常需要編寫按鈕的BN_CLICKED消息處理函數(shù)。 CButton類提供了一些成員函數(shù)實現(xiàn)對按鈕控件對象的控制和管理,如利用成員函數(shù)GetCheck()或SetCheck()獲

45、取或設(shè)置單選按鈕或復(fù)選框的當(dāng)前狀態(tài),利用成員函數(shù)GetButtonStyle()或SetButtonStyle()獲取或改變按鈕控件的風(fēng)格。,例 編寫一個對話框應(yīng)用程序ColrButn,對話框中有兩個用于選擇顏色模式的單選按鈕和三個用于選擇具體顏色的復(fù)選框,只有在彩色模式下才能選擇三種不同顏色的組合。當(dāng)用戶單擊“應(yīng)用”按鈕,對話框右邊的按鍵按鈕將根據(jù)選擇的顏色實現(xiàn)按鈕的自畫。,6.3.7 列表框,Windows提供了幾個列表類型控件,如列表框、組合框、列表視控件和樹視控件,其中列表框是一種最簡單的列表類型控件。 列表框(List box)是一個列出了一些文本項的窗口,常用來顯示類型相同的一系列清單,如文件、字體和用戶等。與復(fù)選框類似,用戶可以選擇其中一項或多項,但同時列表框中選項的數(shù)目和內(nèi)容可以動態(tài)變化,用戶可往列表框中添加或刪除某些選項。 列表框有單選Single、多選Multiple、擴(kuò)展多選Extended、不選None四種風(fēng)格,在控件Properties屬性對話框的Selection下拉框中設(shè)置。,當(dāng)列表框中發(fā)生了某個事件,列表框就會向其父窗口發(fā)送

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論