版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、版權(quán)所有版權(quán)所有 復(fù)制必究復(fù)制必究第13講課 題: 對(duì)話框概述及使用對(duì)話框目的要求: 讓學(xué)生學(xué)會(huì)開發(fā)基于對(duì)話框的應(yīng)用程序教學(xué)重點(diǎn): 對(duì)話框類CDialog、一般對(duì)話框工作流程教學(xué)難點(diǎn): 添加控件及關(guān)聯(lián)的成員變量教學(xué)課時(shí): 2課時(shí)教學(xué)方法: 授課為主、鼓勵(lì)課堂交流本次課涉及的學(xué)術(shù)前沿: 對(duì)話框?qū)υ捒蚴荳indows應(yīng)用程序中一種常用的資源,其主要功能是輸出信息和接收用戶的輸入數(shù)據(jù)??丶丶乔度朐趯?duì)話框中或其它父窗口中的一個(gè)特殊的小窗口,它用于完成不同的輸入、輸出功能。 對(duì)話框與控件關(guān)系密切,在每個(gè)對(duì)話框上一般都有一些控件,對(duì)話框依靠這些控件與用戶進(jìn)行信息的交互。本章主要介紹對(duì)話框的工作原理和編
2、程方法,并通過實(shí)例學(xué)習(xí)一些標(biāo)準(zhǔn)控件和公共控件的使用方法。6.1 對(duì)話框概述對(duì)話框概述l就用戶交互輸入功能而言,菜單和工具欄的功能是極其有限的。而對(duì)話框除了用來顯示提示信息(如程序啟動(dòng)時(shí)顯示版權(quán)和運(yùn)行進(jìn)度信息),一個(gè)主要功能是用于接收用戶的輸入數(shù)據(jù)。l在MFC中,對(duì)話框的功能被封裝在CDialog類中,而CDialog類是CWnd類的派生類。作為窗口,對(duì)話框和其它窗口一樣具有窗口的一切功能。l對(duì)話框的一個(gè)典型應(yīng)用是通過菜單命令或工具欄按鈕打開一個(gè)對(duì)話框,當(dāng)然,對(duì)話框也可以作為一個(gè)程序的主界面。6.1.1 基于對(duì)話框的應(yīng)用程序基于對(duì)話框的應(yīng)用程序 可以直接利用MFC AppWizard向?qū)?chuàng)建一個(gè)
3、基于對(duì)話框的應(yīng)用程序,這種程序運(yùn)行后首先出現(xiàn)一個(gè)對(duì)話框。在向?qū)У牡谝徊竭x擇Dialog Based項(xiàng)。此時(shí),應(yīng)用程序向?qū)⒊霈F(xiàn)與單文檔和多文檔程序向?qū)Р煌牟僮鞑襟E,因?yàn)閷?duì)話框應(yīng)用程序一般不包含文檔,故不支持?jǐn)?shù)據(jù)庫和復(fù)合文檔。 按照對(duì)話框應(yīng)用程序向?qū)崾镜牟襟E進(jìn)行操作就得到一個(gè)對(duì)話框應(yīng)用程序項(xiàng)目,出現(xiàn)對(duì)話框編輯器和控件工具欄浮動(dòng)窗口,它們采用的是一種所見即所得的可視化工作方式。利用向?qū)?chuàng)建應(yīng)用程序的框架后,程序員可根據(jù)程序具體功能要求添加代碼。例例 編寫一個(gè)對(duì)話框應(yīng)用程序MyDialog,程序運(yùn)行后顯示一個(gè)對(duì)話框,并在對(duì)話框上顯示文本串。1執(zhí)行File|New命令出現(xiàn)New對(duì)話框,選擇MFC
4、AppWizardexe項(xiàng),輸入程序名MyDialog,單擊OK按鈕。在隨后出現(xiàn)的MFC AppWizard-Step 1對(duì)話框窗口中選擇Dialog Based選項(xiàng),單擊Finish按鈕就創(chuàng)建了應(yīng)用程序項(xiàng)目,并在Developer Studio中打開了對(duì)話框編輯器和控件工具欄。2去掉對(duì)話框中標(biāo)題為“TODO: 在這里設(shè)置對(duì)話控制”的靜態(tài)文本控件,調(diào)整對(duì)話框大小,在成員函數(shù)CMyDialogDlg:OnPaint()中添加代碼。 void CMyDialogDlg:OnPaint() . . . . . . else CPaintDC dc(this); dc.SetBkMode(TRANSP
5、ARENT); dc.TextOut(20, 50, 這是一個(gè)對(duì)話框應(yīng)用程序!); CDialog:OnPaint(); 6.1.2 對(duì)話框類對(duì)話框類CDialog MFC提供了一系列對(duì)話框類,并實(shí)現(xiàn)了對(duì)話框消息響應(yīng)和處理機(jī)制。CDialog類是對(duì)話框類中最重要的類,我們?cè)诔绦蛑袆?chuàng)建的對(duì)話框類一般都是CDialog類的派生類。CDialog類還是其它所有對(duì)話框類的基類,其派生關(guān)系如下所示:CObject CCmdTarget CWnd CDialog 對(duì)話框類為程序員提供了管理對(duì)話框的編程接口。 CDialog類從CWnd類派生而來,所以它繼承了CWnd類的成員函數(shù),具有CWnd類的基本功能,
6、可以編寫代碼移動(dòng)、顯示或隱藏對(duì)話框,并能根據(jù)對(duì)話框的特點(diǎn)增加新的成員函數(shù),擴(kuò)展它的功能。在你的CDialog類的派生類中可以直接調(diào)用CDialog類的成員函數(shù)。大部分的成員函數(shù)是虛函數(shù),可以在你的派生類中重載,以實(shí)現(xiàn)特定的目的。除了CDialog類成員函數(shù),類CWnd和CWinApp也提供了一些成員函數(shù)用于對(duì)話框的管理。有關(guān)對(duì)話框的常用處理函數(shù)有關(guān)對(duì)話框的常用處理函數(shù)CDialog:CDialog() 通過調(diào)用派生類構(gòu)造函數(shù),根據(jù)對(duì)話框資源模板定義一個(gè)對(duì)話框。CDialog:DoModal() 激活模態(tài)對(duì)話框模態(tài)對(duì)話框,顯示對(duì)話框窗口。CDialog:Create() 根據(jù)對(duì)話框資源模板創(chuàng)建非
7、模態(tài)對(duì)話框非模態(tài)對(duì)話框窗口。如果對(duì)話框不是Visible屬性,還需通過調(diào)用CWnd:ShowWindow()函數(shù)顯示非模態(tài)對(duì)話框窗口。CDialog:OnOk() 單擊OK按鈕時(shí)調(diào)用該函數(shù),接收對(duì)話框輸入數(shù)據(jù),關(guān)閉對(duì)話框。CDialog:OnCancel() 單擊Cancel按鈕或按Esc鍵時(shí)調(diào)用該函數(shù),不接收對(duì)話框輸入數(shù)據(jù),關(guān)閉對(duì)話框。CDialog:OnInitDialog() WM_INITDIALOG消息處理函數(shù),在調(diào)用DoModal或Create函數(shù)時(shí)系統(tǒng)發(fā)送WM_INITDIALOG消息,在顯示對(duì)話框前調(diào)用該函數(shù)進(jìn)行初始化。CDialog:EndDialog() 用于關(guān)閉模態(tài)對(duì)話框
8、窗口。CWnd:ShowWindow() 顯示或隱藏對(duì)話框窗口CWnd:DestroyWindow() 關(guān)閉并銷毀非模態(tài)對(duì)話框CWnd:UpdateData() 通過調(diào)用DoDataExchange()設(shè)置或獲取對(duì)話框控件的數(shù)據(jù)CWnd:DoDataExchange() 被UpdateData()調(diào)用以實(shí)現(xiàn)對(duì)話框數(shù)據(jù)交換,不能直接調(diào)用。CWnd:GetWindowText() 獲取對(duì)話框窗口的標(biāo)題CWnd:SetWindowText() 修改對(duì)話框窗口的標(biāo)題CWnd:GetDlgItemText() 獲取對(duì)話框中控件的文本內(nèi)容CWnd:SetDlgItemText() 設(shè)置對(duì)話框中控件的文本內(nèi)
9、容CWnd:GetDlgItem() 獲取控件或子窗口的指針CWnd:MoveWindow() 用于移動(dòng)對(duì)話框窗口CWnd:EnableWindow() 使窗口處于禁用或可用狀態(tài)6.1.3 對(duì)話框數(shù)據(jù)交換對(duì)話框數(shù)據(jù)交換DDX和驗(yàn)證和驗(yàn)證DDV 在對(duì)話框中實(shí)現(xiàn)用戶數(shù)據(jù)輸入和輸出的一般方法是通過ClassWizard類向?qū)?duì)話框控件與成員變量相關(guān)聯(lián),利用對(duì)話框數(shù)據(jù)交換DDX(Dialog Data Exchange)和驗(yàn)證DDV(Dialog Data Validation)機(jī)制實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出。 當(dāng)利用ClassWizard類向?qū)砑映蓡T變量時(shí),用戶如果在窗口的左下角輸入數(shù)據(jù)的范圍,Cla
10、ssWizard將自動(dòng)加入函數(shù)DDV的調(diào)用代碼。 例 如 , 當(dāng) 添 加 一 個(gè) U I N T 型 的 成 員 變 量m_nInput時(shí)指定它的最小值和最大值分別為0和100,則 C l a s s W i z a r d 類 向 導(dǎo) 將 在 成 員 函 數(shù)DoDataExchange()中添加以下DDV函數(shù)的調(diào)用語句:DDV_MinMaxUInt(pDX, m_nInput, 0, 100); 程序運(yùn)行后,如果用戶的輸入數(shù)據(jù)超出0100的范圍,DDV將顯示一個(gè)提示信息對(duì)話框(例7-2c),提示用戶有效的輸入范圍。UpdateData()的用法的用法: 當(dāng)調(diào)用UpdateData(TRUE)
11、時(shí),MFC通過調(diào)用DDX函數(shù)將數(shù)據(jù)從控件傳遞到關(guān)聯(lián)的成員變量;當(dāng)調(diào)用UpdateData(FALSE)時(shí),MFC通過調(diào)用DDX函數(shù)將數(shù)據(jù)從成員變量傳遞到關(guān)聯(lián)的控件。利用UpdateData()函數(shù)實(shí)現(xiàn)了在刷新后重新獲取成員變量。注意:注意: 表面上看程序并沒有調(diào)用UpdateData(),但是,當(dāng)程序調(diào)用CDialog:DoModal()創(chuàng)建并顯示對(duì)話框時(shí),將自動(dòng)調(diào)用CDialog:OnInitDialog()完成初始化的工作。在OnInitDialog()中調(diào)用了UpdateData(FALSE),將數(shù)據(jù)從成員變量傳遞到關(guān)聯(lián)的控件,從而顯示在控件中。而單擊OK按鈕將調(diào)用CDialog:OnO
12、k()函數(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 提示信息對(duì)話框提示信息對(duì)話框 提示信息對(duì)話框也稱消息對(duì)話框,用來顯示有關(guān)的提示信息。提示信息對(duì)話框是一種最簡單的對(duì)話框,不需要用戶自己創(chuàng)建它就可以直接使用,Visual C+提供了相應(yīng)的函數(shù)實(shí)現(xiàn)這樣的功能。: int AfxMessageBox(LPCTSTR lpText, UINT nType=MB_O
13、K, 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); 這三個(gè)函數(shù)分別是MFC全局函數(shù)、API函數(shù)和CWnd類的成員函數(shù),它們的功能基本相同,但適用范圍有所不同。AfxMessageBox()和:MessageBox()可以在程序中任何地方使用,而CWnd:MessageBox()只能用于控件、對(duì)話框、窗口等一
14、些窗口類中。 例如,在軟件安裝過程中為了彈出如下圖所示的警告提示信息對(duì)話框并進(jìn)行相應(yīng)的處理:編寫的代碼如下: int nChoice=MessageBox(文件復(fù)制失敗!, 錯(cuò)誤, MB_ICONWARNING | MB_ABORTRETRYIGNORE ); switch(nChoice) case IDABORT: / 用戶按下終止按鈕. . . . . . caseIDRETRY: / 用戶按下重試按鈕. . . . . . case IDIGNORE: / 用戶按下忽略按鈕. . . . . . 6.2 使用對(duì)話框使用對(duì)話框 為了在屏幕上顯示對(duì)話框: (1)首先需要建立對(duì)話框資源及其與
15、資源相關(guān)的對(duì)話框類; (2)然后添加控件、與控件關(guān)聯(lián)的成員變量和消息處理函數(shù); (3)最后在程序中顯示對(duì)話框并訪問與控件關(guān)聯(lián)的成員變量。 在Visual C+中可以利用集成工具如對(duì)話框編輯器和ClassWizard類向?qū)Ш芊奖愕貏?chuàng)建對(duì)話框,不需要程序員手工編寫太多的源代碼。6.2.1 一般對(duì)話框工作流程一般對(duì)話框工作流程 當(dāng)定義了一個(gè)對(duì)話框類后,就可以利用這個(gè)對(duì)話框類聲明一個(gè)對(duì)話框?qū)ο?,即一個(gè)能夠在屏幕上顯示的對(duì)話框。 聲明了一個(gè)對(duì)話框?qū)ο蠛?,可以調(diào)用對(duì)話框類的成員函數(shù)DoModal()建立對(duì)話框窗口并顯示對(duì)話框。例如,假設(shè)定義了一個(gè)名為CMyDialog的對(duì)話框類,為了在屏幕上顯示一個(gè)對(duì)話框
16、,可以編寫如下代碼: CMyDialog myDlg; myDlg.DoModal();函數(shù)函數(shù)OnOK()、 OnCancel()與與DoModal()的關(guān)系的關(guān)系: 對(duì)話框中一般都有OK和Cancel按鈕,單擊OK按鈕時(shí)調(diào)用CDialog:OnOK()函數(shù),單擊Cancel按鈕時(shí)調(diào)用CDialog:OnCancel()函數(shù)。OnOK()函數(shù)和OnCancal()函數(shù)都將結(jié)束DoModal()函數(shù)調(diào)用,但令DoModal()返回不同的值。OnOK()函數(shù)令DoModal()返回IDOK,OnCancel()函數(shù)令DoModal()返回IDCANCAL。用戶可以根據(jù)DoModal()的返回值做
17、出不同的選擇。如: if (myDlg.DoModal() = = IDOK ) 對(duì)話框的初始化對(duì)話框的初始化可以在三個(gè)不同的階段所調(diào)用的函數(shù)中進(jìn)行: (1)對(duì)話框類構(gòu)造函數(shù); (2)WM_CREATE消息處理函數(shù); (3)WM_INITDIALOG消息處理函數(shù)。 通常是在消息WM_INITDIALOG的消息處理函數(shù)OnInitDialog()中進(jìn)行初始化。在收到WM_INIT- DIALOG消息時(shí),對(duì)話框的框架已創(chuàng)建,對(duì)話框中的每個(gè)控件也已建立起來,但它們還沒有在屏幕上顯示。此時(shí)自然可以設(shè)置或優(yōu)化對(duì)話框中各個(gè)控件的外觀、尺寸、位置以及其它屬性。函數(shù)OnInitDialog()將被成員函數(shù)Do
18、Modal()調(diào)用。6.2.2 創(chuàng)建對(duì)話框創(chuàng)建對(duì)話框 在Windows中對(duì)話框是作為一種資源被使用,在程序中要?jiǎng)?chuàng)建一個(gè)對(duì)話框,首先要?jiǎng)?chuàng)建一個(gè)對(duì)話框模板資源,然后創(chuàng)建一個(gè)基于該對(duì)話框模板資源的對(duì)話框類。對(duì)話框模板資源指定了對(duì)話框本身的屬性(如大小、位置、風(fēng)格、類型等)和對(duì)話框中的控件及屬性,而對(duì)話框類規(guī)定了對(duì)話框和對(duì)話框中每個(gè)控件的行為。通過對(duì)話框模板資源才能創(chuàng)建對(duì)話框類和對(duì)象。 為了向應(yīng)用程序項(xiàng)目中添加一個(gè)對(duì)話框資源,執(zhí)行Insert| |Resource命令或直接按Ctrl+R鍵,彈出Insert Resource資源列表框。一般要加入通用對(duì)話框資源,所以在Insert Resource框中
19、直接選擇Dialog項(xiàng),然后單擊New按鈕。系統(tǒng)將給對(duì)話框資源設(shè)置一個(gè)默認(rèn)的ID標(biāo)識(shí),對(duì)話框的默認(rèn)標(biāo)題Caption為Dialog,對(duì)話框有OK和Cancel兩個(gè)按鈕。對(duì)話框資源的添加:對(duì)話框資源的添加:添加對(duì)話框資源的簡單方法:添加對(duì)話框資源的簡單方法: 在項(xiàng)目工作區(qū)鼠標(biāo)右擊資源項(xiàng)Dialog,從彈出式菜單中選擇“Insert Dialog”命令項(xiàng)。 對(duì)話框是在對(duì)話框模板資源和對(duì)話框類的基礎(chǔ)上形成的,在完成了對(duì)話框的屬性和外觀設(shè)計(jì)后,再來設(shè)計(jì)對(duì)話框的行為。我們需要利用ClassWizard類向?qū)?chuàng)建一個(gè)對(duì)話框類,并將這個(gè)類同先前創(chuàng)建的對(duì)話框資源連接起來。在創(chuàng)建對(duì)話框類之前或之后,都可以為對(duì)話
20、框資源添加控件控件。而在創(chuàng)建對(duì)話框類之后,還可以為對(duì)話框資源添加與對(duì)話框控件相關(guān)聯(lián)的成員變量成員變量和消息消息處理函數(shù)處理函數(shù)。創(chuàng)建對(duì)話框類:創(chuàng)建對(duì)話框類: 如果按Ctrl+W鍵或在對(duì)話框資源的非控件區(qū)域雙擊鼠標(biāo),ClassWizard類向?qū)l(fā)現(xiàn)已添加了一個(gè)對(duì)話框模板資源,卻沒有設(shè)計(jì)其對(duì)應(yīng)的類,因此將彈出Adding a Class對(duì)話框,詢問用戶是否需要利用該對(duì)話框資源創(chuàng)建一個(gè)對(duì)話框類。 Name框:用于輸入對(duì)話框類的名稱; File Name框:列出類的文件名,單擊Change按鈕可改變文件名; Base class下拉框:列出可選擇的基類; Dialog ID下拉框:列出可選擇對(duì)話框資
21、源的ID。 例例 假設(shè)已利用MFC AppWizard應(yīng)用程序向?qū)Ы⒘艘粋€(gè)名為Mysdi的單文檔應(yīng)用程序,請(qǐng)向應(yīng)用程序中添加對(duì)話框資源和對(duì)話框類。 在Adding a Class對(duì)話框單擊OK按鈕,彈出New Class對(duì)話框:1首先向應(yīng)用程序項(xiàng)目添加一個(gè)對(duì)話框資源,在項(xiàng)目工作區(qū)鼠標(biāo)右擊資源項(xiàng)Dialog,從彈出式菜單中執(zhí)行Insert Dialog命令,插入一個(gè)對(duì)話框資源。2設(shè)置對(duì)話框的屬性,將光標(biāo)指向?qū)υ捒虻目瞻孜恢?,單擊鼠?biāo)右鍵,從彈出式菜單中選擇Properties項(xiàng),或直接按Enter鍵,彈出Dialog Properties屬性對(duì)話框。該對(duì)話框包括General、Styles、M
22、ore Styles、Extended Styles、More Extended Styles等頁面,用于設(shè)置對(duì)話框多種不同的屬性。3創(chuàng)建對(duì)話框類,鼠標(biāo)雙擊對(duì)話框資源的非控件區(qū)域。6.2.3 添加控件及關(guān)聯(lián)的成員變量添加控件及關(guān)聯(lián)的成員變量 如果沒有控件控件,對(duì)話框完成不了什么具體功能,對(duì)話框與控件有著密不可分的關(guān)系。結(jié)合對(duì)話框編輯器,利用Controls控件工具欄可給當(dāng)前正在編輯的對(duì)話框模板資源添加控件。 若Visual C+窗口中沒有出現(xiàn)Controls工具欄,只需將光標(biāo)指向菜單欄并單擊鼠標(biāo)右鍵,從彈出式菜單中選擇Controls項(xiàng)。 控件工具欄上的每一個(gè)圖標(biāo)都代表了一種控件,如果不能確定
23、控件的類型,只要將光標(biāo)在該控件圖標(biāo)上停留片刻,就會(huì)顯示該控件類型的提示。 向?qū)υ捒蛱砑涌丶r(shí),先在Controls工具欄單擊要添加的控件,再將光標(biāo)指向?qū)υ捒蚩瞻讌^(qū)域并單擊鼠標(biāo)。添加與控件關(guān)聯(lián)的成員變量添加與控件關(guān)聯(lián)的成員變量 在生成自己的對(duì)話框類并添加需要的控件后,可以利用ClassWizard類向?qū)г趯?duì)話框類的定義中為對(duì)話框資源上的每一個(gè)控件添加一個(gè)或多個(gè)對(duì)應(yīng)的成員變量。ClassWizard類向?qū)У腗ember Variables頁面主要用來為對(duì)話框類添加和刪除與對(duì)話框控件關(guān)聯(lián)的成員變量,我們?cè)诰帉憣?duì)話框程序時(shí)經(jīng)常同該頁面打交道。 Class name下拉框:選擇要添加成員變量的對(duì)話 框類
24、; Control IDs欄:選擇控件,因?yàn)橐砑拥某蓡T變量總是與一個(gè)對(duì)話框控件ID聯(lián)系在一起,它們代表控件對(duì)象本身或控件的某項(xiàng)屬性; Add Variable按鈕:添加與控件關(guān)聯(lián)的成員變量; Delete Variable按鈕:刪除控件的某個(gè)成員變量。 Control IDs欄:列出對(duì)話框資源上已有的控件,第1列Control IDs表示控件的ID,第2列Type表示變量的類型,第3列Member表示成員變量名。在在Member Variables頁面:頁面:Add Member Variable對(duì)話框?qū)υ捒?Member variable name框:輸入成員變量名; Category下拉
25、框:選擇成員變量的類別,可為Control或 Value; Variable type下拉框:選擇成員變量的類型。 如果在Category下拉框選擇Value項(xiàng),表示要為該控件的某項(xiàng)屬性定義一個(gè)變量,這意味著程序關(guān)心的是控件中的值,而不是控件對(duì)象本身。這時(shí),還可以通過Variable type下拉框?yàn)樽兞窟x擇不同的類型,可以選擇一般的C+數(shù)據(jù)類型或Visual C+自定義的數(shù)據(jù)類型。 例如,對(duì)于編輯框控件,此時(shí)成員變量的類型可以是int、float、long、BOOL等C+一般數(shù)據(jù)類型或者是UINT、CString等Visual C+自定義數(shù)據(jù)類型。 如果在Category下拉框中選擇Cont
26、rol項(xiàng),則表示定義的變量代表控件對(duì)象本身, Control類別的變量實(shí)質(zhì)是一個(gè)控件對(duì)象,其類型是MFC控件類。 例如,對(duì)于編輯框控件,此時(shí)成員變量的類型為CEdit。因此,可以通過添加的控件對(duì)象訪問控件類的成員變量和調(diào)用控件類的成員函數(shù),實(shí)現(xiàn)對(duì)控件行為的控制和管理。l可以為一個(gè)控件同時(shí)定義一個(gè)Control類別的變量和一個(gè)Value類別的變量。這些變量都是作為對(duì)話框派生類的成員變量,為了在程序其它地方能夠直接訪問添加的成員變量,它們都被聲明為public屬性。例例 完善Mysdi程序,向?qū)υ捒蛸Y源添加需要使用的控件,并添加與控件關(guān)聯(lián)的成員變量。1向?qū)υ捒蛸Y源添加控件。添加一個(gè)靜態(tài)文本控件,其
27、Caption為“請(qǐng)輸入半徑”。添加一個(gè)Edit Box編輯框控件,其ID標(biāo)識(shí)為IDC_EDIT_ RADIUS,該控件用于接收用戶的輸入數(shù)據(jù)。2添加與控件關(guān)聯(lián)的成員變量。按Ctrl + W 鍵啟動(dòng)ClassWizard類向?qū)В瑔螕鬗ember Variables標(biāo)簽。在Class name下拉框選擇類CRadiusDialog,在Control IDs欄選擇編輯框IDC_EDIT_RADIUS,單擊Add Variable按鈕。通過Add Member Variable對(duì)話框添加成員變量m_nRadius,其數(shù)據(jù)類型為UINT。3使用對(duì)話框數(shù)據(jù)驗(yàn)證DDV功能,在該頁面的左下角輸入成員變量m_
28、nRadius的最小值5和最大值250。 例例 完善Mysdi程序,通過“編輯”菜單中的“輸入半徑(I)”命令打開上述標(biāo)題為“輸入半徑”的對(duì)話框,并根據(jù)輸入的半徑畫一個(gè)圓。1為了在視圖對(duì)象中接收并存儲(chǔ)對(duì)話框編輯控件的值,在視圖類CMysdiView中手工定義一個(gè)UINT類型的成員變量m_nCViewRadius。2利用菜單編輯器在“編輯”菜單增加一個(gè)菜單項(xiàng)“輸入半徑(I)”,其ID標(biāo)識(shí)為ID_EDIT_INPUTRADIUS,Caption為“輸入半徑(&I).”。按Ctrl+W鍵啟動(dòng)ClassWzard類向?qū)?,在視圖類中為ID_EDIT_INPUTRADIUS菜單項(xiàng)添加消息COMMAND的處
29、理函數(shù),在函數(shù)中添加代碼。在程序中使用創(chuàng)建的對(duì)話框在程序中使用創(chuàng)建的對(duì)話框 void CMysdiView:OnEditInputradius() / TODO: Add your command handler code here CRadiusDialog dlg; / 定義一個(gè)對(duì)話框?qū)ο?dlg.m_nRadius=100;/ 設(shè)置編輯框顯示的初始值 if (dlg.DoModal()=IDOK) / 顯示對(duì)話框 m_nCViewRadius=dlg.m_nRadius; / 接收并存儲(chǔ)編輯框數(shù)據(jù) Invalidate(); / 刷新視圖 3在視圖類構(gòu)造函數(shù)CMysdiView:CMys
30、diView()中將成員變量m_nCViewRadius初始化為0。在函數(shù)CMysdiView:OnDraw()中添加如下畫圓的語句:pDC-Ellipse(0, 0, 2*m_nCViewRadius, 2*m_nCViewRadius); 在視圖類實(shí)現(xiàn)文件MysdiView.cpp的開始位置加入包含對(duì)話框類頭文件的語句: #include RadiusDialog.h”第14講課 題: 標(biāo)準(zhǔn)控件目的要求: 讓學(xué)生學(xué)會(huì)使用各種常用的控件教學(xué)重點(diǎn): 組織控件及控件的共有屬性教學(xué)難點(diǎn): 添加控件及關(guān)聯(lián)的成員變量教學(xué)課時(shí): 2課時(shí)教學(xué)方法: 授課為主、鼓勵(lì)課堂交流本次課涉及的學(xué)術(shù)前沿:6.3 標(biāo)準(zhǔn)
31、控件標(biāo)準(zhǔn)控件 Windows提供的控件分為兩類:標(biāo)準(zhǔn)控件和公共控件。 標(biāo)準(zhǔn)控件:靜態(tài)控件、編輯框、按鈕、列表框、組合框和滾動(dòng)條等。利用標(biāo)準(zhǔn)控件可滿足大部分用戶界面程序設(shè)計(jì)的要求。 公共控件:滑塊、進(jìn)度條、列表視控件、樹視控件和標(biāo)簽控件等,利用公共控件實(shí)現(xiàn)應(yīng)用程序用戶界面風(fēng)格的多樣性。 6.3.1 控件概述控件概述 控件是Windows提供的完成特定功能的獨(dú)立小部件,它使應(yīng)用程序?qū)υ捁δ艿脑O(shè)計(jì)更容易完成,在對(duì)話框與用戶的交互過程中擔(dān)任主要角色,用于完成用戶輸入和程序運(yùn)行過程中的輸出。 控件對(duì)應(yīng)一個(gè)CWnd派生類的對(duì)象,它實(shí)際上也是一個(gè)窗口,可以通過調(diào)用窗口類的成員函數(shù)實(shí)現(xiàn)控件的移動(dòng)、顯示或隱藏、
32、禁用或可用等操作,也可以重新設(shè)置它們的尺寸和風(fēng)格等屬性。 MFC以類的形式對(duì)標(biāo)準(zhǔn)控件和公共控件進(jìn)行了封裝,這些類大部分是從CWnd類直接派生而來。常用的常用的MFC控件類控件類 MFC類類控控 件件CStatic靜態(tài)文本、圖片控件CEdit編輯框CButton按鈕、復(fù)選框、單選按鈕、組框CComboBox組合框CListBox列表框CScrollBar滾動(dòng)條CSpinButtonCtrl旋轉(zhuǎn)按鈕CProgressCtrl進(jìn)度條CSliderCtrl滑塊CListCtrl列表視控件常用的常用的MFC控件類控件類 MFC類類控控 件件CTreeCtrl樹視控件CTabCtrl標(biāo)簽CAnimateC
33、trl動(dòng)畫控件CRichEditCtrl復(fù)合編輯框CDateTimeCtrl日期時(shí)間選取器CMonthCalCtrl日歷CComboBoxEx擴(kuò)展組合框CStatusBarCtrl狀態(tài)條控件CToolBarCtrl工具條控件CImageList圖像列表控件通知控件通知Notification消息消息: 用戶對(duì)控件的操作將引發(fā)控件事件,Windows產(chǎn)生對(duì)應(yīng)的控件通知Notification消息,消息由其父窗口(如對(duì)話框)接收并處理。 標(biāo)準(zhǔn)控件發(fā)送WM_COMMAND控件通知消息,公共控件一般發(fā)送WM_NOTIFY控件通知消息,有時(shí)也發(fā)送WM_COMMAND消息。 通過WM_COMMAND消息參
34、數(shù)標(biāo)識(shí)發(fā)出消息的控件和具體的事件,消息參數(shù)中包含了控件的ID標(biāo)識(shí)和通知碼(如BN_CLICKED單擊按鈕事件)??丶ㄖa前綴最后一個(gè)字母為N。 程序員不必關(guān)心消息具體的發(fā)送和接收,只需利用ClassWizard將控件映射到成員變量,將控件消息映射到成員函數(shù),然后編寫具體的處理代碼。 控件的創(chuàng)建方法:控件的創(chuàng)建方法: 控件在程序中可作為對(duì)話框控件或獨(dú)立的窗口兩種形式存在,因此,控件的創(chuàng)建方法也有兩種。 一種方法是在對(duì)話框模板資源中指定控件,這樣當(dāng)應(yīng)用程序創(chuàng)建對(duì)話框時(shí),Windows就會(huì)為對(duì)話框創(chuàng)建控件,編程時(shí)我們一般都采用這種方法。 一種方法是通過調(diào)用MFC控件類的成員函數(shù)C r e a t
35、e ( ) 創(chuàng) 建 控 件 , 也 可 以 調(diào) 用 A P I 函 數(shù)CreateWindow()或CreateWindowEx()創(chuàng)建控件。 控件也可以用于其它窗口,如在程序視圖窗口顯示控件。這時(shí),需要首先聲明一個(gè)MFC控件類的對(duì)象,然后調(diào)用Create()函數(shù)創(chuàng)建控件。 6.3.2 控件的組織控件的組織1. 添加或刪除控件添加或刪除控件 打開對(duì)話框編輯器和控件工具欄,在控件工具欄中單擊要添加的控件,此時(shí),當(dāng)光標(biāo)指向?qū)υ捒驎r(shí)將變成十字形狀,在對(duì)話框指定位置處單擊鼠標(biāo)左鍵,則該控件被添加到對(duì)話框中指定的位置。也可以將光標(biāo)指向控件工具欄中的控件,然后按住鼠標(biāo)不放,采用鼠標(biāo)拖曵的方法將控件拖入到對(duì)
36、話框中。 要?jiǎng)h除已添加的控件,先單擊對(duì)話框中的控件,再按Delete鍵即可刪除指定的控件。2. 設(shè)置控件屬性設(shè)置控件屬性 將光標(biāo)指向?qū)υ捒蛑行柙O(shè)置屬性的控件,按回車鍵(或右擊鼠標(biāo),在彈出式菜單中選擇Properties項(xiàng))彈出Properties對(duì)話框,在Properties對(duì)話框中設(shè)置控件屬性??梢詫傩詫?duì)話框始終保持打開,只需要按下屬性對(duì)話框左上角的圖釘按鈕。3. 調(diào)整控件的大小調(diào)整控件的大小 對(duì)于靜態(tài)文本控件,當(dāng)輸入標(biāo)題內(nèi)容時(shí),控件的大小會(huì)自動(dòng)改變。對(duì)于其它控件,先單擊控件,然后利用控件周圍的尺寸調(diào)整點(diǎn)來改變控件的大小。所選對(duì)象的位置和大小將顯示在狀態(tài)欄的右端。 4. 同時(shí)選取多個(gè)控件同
37、時(shí)選取多個(gè)控件 一種方法是在對(duì)話框內(nèi)按住鼠標(biāo)不放,拖曵出一個(gè)大的虛線框,然后釋放鼠標(biāo),則被該虛線框所包圍的控件都將被同時(shí)選??;另一種方法是按住Shift(或Ctrl)鍵不放,然后用鼠標(biāo)連續(xù)選取控件。 5. 移動(dòng)和復(fù)制控件移動(dòng)和復(fù)制控件 當(dāng)單個(gè)或多個(gè)控件被選取后,按方向鍵或用鼠標(biāo)拖動(dòng)選擇的控件可移動(dòng)控件。若在鼠標(biāo)拖動(dòng)過程中按住Ctrl鍵則復(fù)制控件,復(fù)制的控件保持原來控件的大小和屬性。并且,控件能夠通過復(fù)制和粘貼操作而加入到其它對(duì)話框中。 6. 編排控件編排控件 編排控件主要是指同時(shí)調(diào)整對(duì)話框中一組控件的大小或位置。編排控件有兩種方法,一種方法是使用控件布局工具欄,自動(dòng)編排對(duì)話框中同時(shí)選定的多個(gè)控
38、件;另一種方法是使用Layout菜單,當(dāng)打開對(duì)話框編輯器時(shí),Layout菜單將出現(xiàn)在菜單欄上。為了便于用戶在對(duì)話框內(nèi)精確定位各個(gè)控件,系統(tǒng)還提供了網(wǎng)格、標(biāo)尺等輔助功能。 測試對(duì)話框和控件的方法:測試對(duì)話框和控件的方法: 通過按下Ctrl+T組合鍵就能測試對(duì)話框運(yùn)行時(shí)的界面效果。 6.3.3 控件共有屬性控件共有屬性 控件的屬性決定了控件的外觀和功能,我們只有通過控件屬性對(duì)話框才能設(shè)置控件的屬性。 控件屬性對(duì)話框上有若干選項(xiàng)卡,如General(通用屬性)、Style(風(fēng)格)及Extend Styles(擴(kuò)展風(fēng)格)選項(xiàng)卡等,其中General頁用于設(shè)置控件的通用屬性,Styles和Extendc
39、d Styles頁用來設(shè)置控件的外觀和輔助屬性。 不同控件有不同的屬性,但它們都具有通用屬性,如控件標(biāo)識(shí)ID、標(biāo)題Caption等項(xiàng), 控件的控件的General屬性屬性項(xiàng)項(xiàng) 目目說說 明明 ID控件的標(biāo)識(shí),對(duì)話框編輯器會(huì)為每一個(gè)加入的控件分配一個(gè)默認(rèn)的ID Caption控件的標(biāo)題,作為程序執(zhí)行時(shí)在控件位置上顯示的文本 Visible指明顯示對(duì)話框時(shí)該控件是否可見 Group用于指定一個(gè)控件組中的第一個(gè)控件 HelpID表示為該控件建立一個(gè)上下文相關(guān)的幫助標(biāo)識(shí)ID Disabled指定控件初始化時(shí)是否禁用 Tab Stop表示對(duì)話框運(yùn)行后該控件可以通過使用Tab鍵來獲取焦點(diǎn)6.3.4 靜態(tài)控
40、件靜態(tài)控件 靜態(tài)控件靜態(tài)控件(Static control)是用來顯示一個(gè)文本串或圖形信息的控件,它包括靜態(tài)文本控件、圖片控件和組框。 靜態(tài)文本控件用來顯示一般不需要變化的文本;圖片控件用來顯示邊框、矩形、圖標(biāo)或位圖等圖形;組框用來顯示一個(gè)文本標(biāo)題和一個(gè)矩形邊框,通常用來作為一組控件周圍的虛擬邊界,并將一組控件組織在一起。 管理靜態(tài)文本控件和圖片控件的MFC類是CStatic類,而管理組框的MFC類是CButton類。 所有靜態(tài)控件默認(rèn)的ID標(biāo)識(shí)都為IDC_STATIC,如果要為一個(gè)靜態(tài)控件添加成員變量或消息處理函數(shù),必須重新為它指定一個(gè)唯一的ID標(biāo)識(shí)。 編程時(shí)用的最多是靜態(tài)文本控件,它被用來
41、作為其它控件的標(biāo)題。每一個(gè)靜態(tài)文本控件最多可以顯示255個(gè)字符,可以使用“n”換行符,并可以通過Styles頁面設(shè)置控件的風(fēng)格。6.3.5 編輯框編輯框 編輯框編輯框(Edit box)又稱文本框或編輯控件,它一般與靜態(tài)文本控件一起使用,用于數(shù)據(jù)的輸入和輸出。編輯框提供了完整的鍵盤輸入和編輯功能,可以輸入各種文本、數(shù)字或者口令。 編輯框?yàn)橛脩籼峁┝肆己玫妮斎?、輸出功能,能夠?qū)㈡I盤輸入的字符串轉(zhuǎn)化為要求的數(shù)據(jù)類型,并驗(yàn)證它是否符合輸入要求(字符串長度或數(shù)值范圍)。通過前述對(duì)話框內(nèi)容的學(xué)習(xí)我們已經(jīng)知道,完成上述工作是利用了MFC提供的對(duì)話框數(shù)據(jù)交換(DDX)和數(shù)據(jù)驗(yàn)證(DDV)技術(shù)。 編輯框常用屬
42、性: Multiline設(shè)置單行或多行編輯,Align text設(shè)置文本對(duì)齊方式,Number表示只能輸入數(shù)字,Password表示鍵入編輯框的字符都將顯示為“*”,Uppercase或Lowercase表示鍵入編輯框的字符全部轉(zhuǎn)換成大寫或小寫形式,Read-Only表示只能輸出數(shù)據(jù)。 當(dāng)編輯框的文本被修改,會(huì)向父窗口發(fā)送消息,可以利用ClassWizard在對(duì)話框類中添加消息處理函數(shù)。編輯框發(fā)送消息有:EN_CHANGE、EN_KILLFOCUS、EN_SETFOCUS、EN_MAX TEXT、EN_UPDATE等。 例例 編寫一個(gè)SDI應(yīng)用程序Password,程序啟動(dòng)后首先彈出一個(gè)如圖所
43、示的用戶身份確認(rèn)對(duì)話框,當(dāng)用戶鍵入正確的口令后才能進(jìn)入程序的主界面。 6.3.6 按鈕按鈕 按鈕按鈕(Button)包括按鍵按鈕、單選按鈕、復(fù)選框和組框等4種類型。雖然封裝按鈕控件的MFC類都是CButton類,但它們具有不同的功能。按鍵按鈕在被按下時(shí)會(huì)立即執(zhí)行某個(gè)命令,也被稱為命令按鈕;單選按鈕用于在一組互相排斥的選項(xiàng)中選擇其中一項(xiàng);復(fù)選框用于在一組選項(xiàng)中選擇其中一項(xiàng)或多項(xiàng);組框可以使一組控件關(guān)聯(lián)起來。 1. 按鍵按鈕按鍵按鈕 幾乎所有的對(duì)話框都使用簡單的按鍵按鈕,如OK按鈕。通過Properties對(duì)話框可以設(shè)置按鈕的不同風(fēng)格,如通過設(shè)置Default button屬性設(shè)置一個(gè)默認(rèn)按鈕。默
44、認(rèn)按鈕是指當(dāng)對(duì)話框剛顯示時(shí)的命令執(zhí)行按鈕,此時(shí)按下Enter鍵將執(zhí)行該按鈕的命令功能。一個(gè)對(duì)話框只能有一個(gè)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. 單選按鈕單選按鈕 單選按鈕是由一個(gè)圓圈和緊隨其后的文本標(biāo)題組成,當(dāng)它被選中時(shí),圓圈中就標(biāo)上一個(gè)黑點(diǎn)。 單選按鈕設(shè)置Auto自動(dòng)屬性為默認(rèn)屬性,Auto屬性表
45、示用戶若選中同組中的某個(gè)單選按鈕,則自動(dòng)清除其余單選按鈕的選中狀態(tài),保證一組選項(xiàng)中始終只有一項(xiàng)被選中。 一般將一組單選按鈕放在一個(gè)組框中,在一組單選按鈕中,第一個(gè)(Tab鍵順序)按鈕最重要,其ID值可用于在對(duì)話框中為控件建立關(guān)聯(lián)的成員變量。必須為同組中的第一個(gè)單選按鈕設(shè)置Group屬性,而同組的其它單選按鈕不可再設(shè)置Group屬性。 3. 復(fù)選框復(fù)選框 復(fù)選框是由一個(gè)空心方框和緊隨其后的文本組成,當(dāng)它被選中時(shí),空心方框中就加上一個(gè)“”或“”標(biāo)記。 不同于單選按鈕,在一組復(fù)選框中每次可以同時(shí)選擇多項(xiàng)。除了選中和沒選中兩種狀態(tài),復(fù)選框還有第三種狀態(tài),此時(shí)選中標(biāo)記顯示為暗色,它表示該項(xiàng)不可以由用戶選
46、擇。通過設(shè)置Tri-state屬性得到這種三態(tài)復(fù)選框。另外,我們可以通過設(shè)置Push-like屬性使單選按鈕或復(fù)選框具有普通按鈕的外觀。 按鈕控件發(fā)送的消息:按鈕控件發(fā)送的消息: 按鈕控件只能發(fā)送通知碼為BN_CLICKED(單擊按鈕)和BN_DOUBLECLICKED(雙擊按鈕)的WM_COMMAND消息,我們經(jīng)常需要編寫按鈕的BN_CLICKED消息處理函數(shù)。 CButton類提供了一些成員函數(shù)實(shí)現(xiàn)對(duì)按鈕控件對(duì)象的控制和管理,如利用成員函數(shù)GetCheck()或SetCheck()獲取或設(shè)置單選按鈕或復(fù)選框的當(dāng)前狀態(tài),利用成員函數(shù)GetButtonStyle()或SetButtonStyl
47、e()獲取或改變按鈕控件的風(fēng)格。 例例 編寫一個(gè)對(duì)話框應(yīng)用程序ColrButn,對(duì)話框中有兩個(gè)用于選擇顏色模式的單選按鈕和三個(gè)用于選擇具體顏色的復(fù)選框,只有在彩色模式下才能選擇三種不同顏色的組合。當(dāng)用戶單擊“應(yīng)用”按鈕,對(duì)話框右邊的按鍵按鈕將根據(jù)選擇的顏色實(shí)現(xiàn)按鈕的自畫。 6.3.7 列表框列表框 Windows提供了幾個(gè)列表類型控件,如列表框、組合框、列表視控件和樹視控件,其中列表框是一種最簡單的列表類型控件。 列表框列表框(List box)是一個(gè)列出了一些文本項(xiàng)的窗口,常用來顯示類型相同的一系列清單,如文件、字體和用戶等。與復(fù)選框類似,用戶可以選擇其中一項(xiàng)或多項(xiàng),但同時(shí)列表框中選項(xiàng)的數(shù)目和內(nèi)容可以動(dòng)態(tài)變化,用戶可往列表框中添加或刪除某些選項(xiàng)。 列表框有單選Single、多選Multiple、擴(kuò)展多選Extended、不選None四種風(fēng)格,在控件Properties屬性對(duì)話框的Selection下拉框中設(shè)置。 當(dāng)列表框中發(fā)生了某個(gè)事件,列表框就會(huì)向其父窗口發(fā)送一條通知消息。列表框常用的通知消息有:用戶雙擊列表框中的列表項(xiàng)時(shí)發(fā)送消
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版工業(yè)廠房消防安全檢查與維護(hù)服務(wù)合同3篇
- 橋梁隧道工程-試驗(yàn)檢測師《橋梁隧道工程》黑鉆押題1
- 03蠕形住腸線蟲58課件講解
- 2025年大型機(jī)具運(yùn)輸協(xié)議
- 2025年公寓購買協(xié)議
- 2025年加工承攬合同的要素
- 2025年度鋁合金門窗出口貿(mào)易合同范本8篇
- 2025年度私人宅基地買賣轉(zhuǎn)讓及農(nóng)村環(huán)境保護(hù)服務(wù)協(xié)議
- 二零二五年度智能家居門窗安裝服務(wù)協(xié)議
- 二零二五年度2025年度消防報(bào)警系統(tǒng)改造清包工服務(wù)協(xié)議
- 春節(jié)聯(lián)歡晚會(huì)節(jié)目單課件模板
- 中國高血壓防治指南(2024年修訂版)
- 糖尿病眼病患者血糖管理
- 抖音音樂推廣代運(yùn)營合同樣本
- 2024年電信綜合部辦公室主任年度述職報(bào)告(四篇合集)
- 微機(jī)原理與接口技術(shù)考試試題及答案(綜合-必看)
- 濕瘡的中醫(yī)護(hù)理常規(guī)課件
- 初中音樂聽課筆記20篇
- NUDD新獨(dú)難異 失效模式預(yù)防檢查表
- 內(nèi)蒙古匯能煤電集團(tuán)有限公司長灘露天煤礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 排水干管通球試驗(yàn)記錄表
評(píng)論
0/150
提交評(píng)論