




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、12 對(duì)話(huà)框?qū)υ?huà)框是Windows應(yīng)用程序中一種常用的資源,其主要功能是輸出信息和接收用戶(hù)的輸入數(shù)據(jù)。 控件控件是嵌入在對(duì)話(huà)框中或其它父窗口中的一個(gè)特殊的小 窗口,它用于完成不同的輸入、輸出功能。 對(duì)話(huà)框與控件關(guān)系密切,在每個(gè)對(duì)話(huà)框上一般都有一些控件,對(duì)話(huà)框依靠這些控件與用戶(hù)進(jìn)行信息的交互。本章主要介紹對(duì)話(huà)框的工作原理和編程方法,并通過(guò)實(shí)例學(xué)習(xí)一些標(biāo)準(zhǔn)控件和公共控件的使用方法。311.1 對(duì)話(huà)框概述對(duì)話(huà)框概述l對(duì)話(huà)框的一個(gè)典型應(yīng)用是通過(guò)菜單命令或工具欄按鈕打開(kāi)一個(gè)對(duì)話(huà)框,l對(duì)話(huà)框作為一個(gè)程序的主界面。411.1.1 基于對(duì)話(huà)框的應(yīng)用程序基于對(duì)話(huà)框的應(yīng)用程序n可以直接利用MFC AppWizar
2、d向?qū)?chuàng)建一個(gè)基于對(duì)話(huà)框的應(yīng)用程序,這種程序運(yùn)行后首先出現(xiàn)一個(gè)對(duì)話(huà)框。在向?qū)У牡谝徊竭x擇Dialog Based項(xiàng)。此時(shí),應(yīng)用程序向?qū)⒊霈F(xiàn)與單文檔和多文檔程序向?qū)Р煌牟僮鞑襟E,因?yàn)閷?duì)話(huà)框應(yīng)用程序一般不包含文檔,故不支持?jǐn)?shù)據(jù)庫(kù)和復(fù)合文檔。5例例 編寫(xiě)一個(gè)對(duì)話(huà)框應(yīng)用程序MyDialog,程序運(yùn)行后顯示一個(gè)對(duì)話(huà)框,并在對(duì)話(huà)框上顯示文本串。1執(zhí)行File|New命令出現(xiàn)New對(duì)話(huà)框,選擇MFC AppWizardexe項(xiàng),輸入程序名MyDialog,單擊OK按鈕。在隨后出現(xiàn)的MFC AppWizard-Step 1對(duì)話(huà)框窗口中選擇Dialog Based選項(xiàng),單擊Finish按鈕就創(chuàng)建了應(yīng)用程序項(xiàng)
3、目,并在Developer Studio中打開(kāi)了對(duì)話(huà)框編輯器和控件工具欄。2去掉對(duì)話(huà)框中標(biāo)題為“TODO: 在這里設(shè)置對(duì)話(huà)控制”的靜態(tài)文本控件,調(diào)整對(duì)話(huà)框大小,在成員函數(shù)CMyDialogDlg:OnPaint()中添加代碼。 6 void CMyDialogDlg:OnPaint() . . . . . . else CPaintDC dc(this); dc.SetBkMode(TRANSPARENT); dc.TextOut(20, 50, 這是一個(gè)對(duì)話(huà)框應(yīng)用程序!); CDialog:OnPaint(); 711.1.2 對(duì)話(huà)框類(lèi)對(duì)話(huà)框類(lèi)CDialog MFC提供了一系列對(duì)話(huà)框類(lèi),并實(shí)
4、現(xiàn)了對(duì)話(huà)框消息響應(yīng)和處理機(jī)制。CDialog類(lèi)是對(duì)話(huà)框類(lèi)中最重要的類(lèi),我們?cè)诔绦蛑袆?chuàng)建的對(duì)話(huà)框類(lèi)一般都是CDialog類(lèi)的派生類(lèi)。CDialog類(lèi)還是其它所有對(duì)話(huà)框類(lèi)的基類(lèi),其派生關(guān)系如下所示:CObject CCmdTarget CWnd CDialog8 對(duì)話(huà)框類(lèi)為程序員提供了管理對(duì)話(huà)框的編程接口。 CDialog類(lèi)從CWnd類(lèi)派生而來(lái),所以它繼承了CWnd類(lèi)的成員函數(shù),具有CWnd類(lèi)的基本功能,可以編寫(xiě)代碼移動(dòng)、顯示或隱藏對(duì)話(huà)框,并能根據(jù)對(duì)話(huà)框的特點(diǎn)增加新的成員函數(shù),擴(kuò)展它的功能。在你的CDialog類(lèi)的派生類(lèi)中可以直接調(diào)用CDialog類(lèi)的成員函數(shù)。大部分的成員函數(shù)是虛函數(shù),可以在你的
5、派生類(lèi)中重載,以實(shí)現(xiàn)特定的目的。除了CDialog類(lèi)成員函數(shù),類(lèi)CWnd和CWinApp也提供了一些成員函數(shù)用于對(duì)話(huà)框的管理。911.2 使用對(duì)話(huà)框使用對(duì)話(huà)框 為了在屏幕上顯示對(duì)話(huà)框: (1)首先需要建立對(duì)話(huà)框資源及其與資源相關(guān)的對(duì)話(huà)框類(lèi); (2)然后添加控件、與控件關(guān)聯(lián)的成員變量和消息處理函數(shù); (3)最后在程序中顯示對(duì)話(huà)框并訪(fǎng)問(wèn)與控件關(guān)聯(lián)的成員變量。 在Visual C+中可以利用集成工具如對(duì)話(huà)框編輯器和ClassWizard類(lèi)向?qū)Ш芊奖愕貏?chuàng)建對(duì)話(huà)框,不需要程序員手工編寫(xiě)太多的源代碼。1011.2.1 一般對(duì)話(huà)框工作流程一般對(duì)話(huà)框工作流程 n當(dāng)定義了一個(gè)對(duì)話(huà)框類(lèi)后,就可以利用這個(gè)對(duì)話(huà)框類(lèi)聲
6、明一個(gè)對(duì)話(huà)框?qū)ο?,即一個(gè)能夠在屏幕上顯示的對(duì)話(huà)框。 n聲明了一個(gè)對(duì)話(huà)框?qū)ο蠛?,可以調(diào)用對(duì)話(huà)框類(lèi)的成員函數(shù)DoModal()建立對(duì)話(huà)框窗口并顯示對(duì)話(huà)框。例如,假設(shè)定義了一個(gè)名為CMyDialog的對(duì)話(huà)框類(lèi),為了在屏幕上顯示一個(gè)對(duì)話(huà)框,可以編寫(xiě)如下代碼: CMyDialog myDlg; myDlg.DoModal(); 11函數(shù)函數(shù)OnOK()、 OnCancel()與與DoModal()的關(guān)系:的關(guān)系: 對(duì)話(huà)框中一般都有OK和Cancel按鈕,單擊OK按鈕時(shí)調(diào)用CDialog:OnOK()函數(shù),單擊Cancel按鈕時(shí)調(diào)用CDialog:OnCancel()函數(shù)。OnOK()函數(shù)和OnCanca
7、l()函數(shù)都將結(jié)束DoModal()函數(shù)調(diào)用,但令DoModal()返回不同的值。OnOK()函數(shù)令DoModal()返回IDOK,OnCancel()函數(shù)令DoModal()返回IDCANCAL。用戶(hù)可以根據(jù)DoModal()的返回值做出不同的選擇。如: if (myDlg.DoModal() = = IDOK ) 1211.2.2 創(chuàng)建對(duì)話(huà)框創(chuàng)建對(duì)話(huà)框 在Windows中對(duì)話(huà)框是作為一種資源被使用,在程序中要?jiǎng)?chuàng)建一個(gè)對(duì)話(huà)框,首先要?jiǎng)?chuàng)建一個(gè)對(duì)話(huà)框模板資源,然后創(chuàng)建一個(gè)基于該對(duì)話(huà)框模板資源的對(duì)話(huà)框類(lèi)。對(duì)話(huà)框模板資源指定了對(duì)話(huà)框本身的屬性(如大小、位置、風(fēng)格、類(lèi)型等)和對(duì)話(huà)框中的控件及屬性,而對(duì)
8、話(huà)框類(lèi)規(guī)定了對(duì)話(huà)框和對(duì)話(huà)框中每個(gè)控件的行為。通過(guò)對(duì)話(huà)框模板資源才能創(chuàng)建對(duì)話(huà)框類(lèi)和對(duì)象。13 為了向應(yīng)用程序項(xiàng)目中添加一個(gè)對(duì)話(huà)框資源,執(zhí)行Insert| |Resource命令或直接按Ctrl+R鍵,彈出Insert Resource資源列表框。一般要加入通用對(duì)話(huà)框資源,所以在Insert Resource框中直接選擇Dialog項(xiàng),然后單擊New按鈕。系統(tǒng)將給對(duì)話(huà)框資源設(shè)置一個(gè)默認(rèn)的ID標(biāo)識(shí),對(duì)話(huà)框的默認(rèn)標(biāo)題Caption為Dialog,對(duì)話(huà)框有OK和Cancel兩個(gè)按鈕。對(duì)話(huà)框資源的添加:對(duì)話(huà)框資源的添加:14 對(duì)話(huà)框是在對(duì)話(huà)框模板資源和對(duì)話(huà)框類(lèi)的基礎(chǔ)上形成的,在完成了對(duì)話(huà)框的屬性和外觀設(shè)計(jì)
9、后,再來(lái)設(shè)計(jì)對(duì)話(huà)框的行為。我們需要利用ClassWizard類(lèi)向?qū)?chuàng)建一個(gè)對(duì)話(huà)框類(lèi),并將這個(gè)類(lèi)同先前創(chuàng)建的對(duì)話(huà)框資源連接起來(lái)。在創(chuàng)建對(duì)話(huà)框類(lèi)之前或之后,都可以為對(duì)話(huà)框資源添加控件控件。而在創(chuàng)建對(duì)話(huà)框類(lèi)之后,還可以為對(duì)話(huà)框資源添加與對(duì)話(huà)框控件相關(guān)聯(lián)的成員變量成員變量和消息消息處理函數(shù)處理函數(shù)。15創(chuàng)建對(duì)話(huà)框類(lèi):創(chuàng)建對(duì)話(huà)框類(lèi): 如果按Ctrl+W鍵或在對(duì)話(huà)框資源的非控件區(qū)域雙擊鼠標(biāo),ClassWizard類(lèi)向?qū)l(fā)現(xiàn)已添加了一個(gè)對(duì)話(huà)框模板資源,卻沒(méi)有設(shè)計(jì)其對(duì)應(yīng)的類(lèi),因此將彈出Adding a Class對(duì)話(huà)框,詢(xún)問(wèn)用戶(hù)是否需要利用該對(duì)話(huà)框資源創(chuàng)建一個(gè)對(duì)話(huà)框類(lèi)。16nName框:用于輸入對(duì)話(huà)框類(lèi)的名
10、稱(chēng);nFile Name框:列出類(lèi)的文件名,單擊Change按鈕可改變文件名;nBase class下拉框:列出可選擇的基類(lèi);nDialog ID下拉框:列出可選擇對(duì)話(huà)框資源的ID。 例例 假設(shè)已利用MFC AppWizard應(yīng)用程序向?qū)Ы⒘艘粋€(gè)名為Mysdi的單文檔應(yīng)用程序,請(qǐng)向應(yīng)用程序中添加對(duì)話(huà)框資源和對(duì)話(huà)框類(lèi)。 在Adding a Class對(duì)話(huà)框單擊OK按鈕,彈出New Class對(duì)話(huà)框:171首先向應(yīng)用程序項(xiàng)目添加一個(gè)對(duì)話(huà)框資源,在項(xiàng)目工作區(qū)鼠標(biāo)右擊資源項(xiàng)Dialog,從彈出式菜單中執(zhí)行Insert Dialog命令,插入一個(gè)對(duì)話(huà)框資源。2設(shè)置對(duì)話(huà)框的屬性,將光標(biāo)指向?qū)υ?huà)框的空白位
11、置,單擊鼠標(biāo)右鍵,從彈出式菜單中選擇Properties項(xiàng),或直接按Enter鍵,彈出Dialog Properties屬性對(duì)話(huà)框。該對(duì)話(huà)框包括General、Styles、More Styles、Extended Styles、More Extended Styles等頁(yè)面,用于設(shè)置對(duì)話(huà)框多種不同的屬性。3創(chuàng)建對(duì)話(huà)框類(lèi),鼠標(biāo)雙擊對(duì)話(huà)框資源的非控件區(qū)域。1811.2.3 添加控件及關(guān)聯(lián)的成員變量添加控件及關(guān)聯(lián)的成員變量n如果沒(méi)有控件控件,對(duì)話(huà)框完成不了什么具體功能,對(duì)話(huà)框與控件有著密不可分的關(guān)系。結(jié)合對(duì)話(huà)框編輯器,利用Controls控件工具欄可給當(dāng)前正在編輯的對(duì)話(huà)框模板資源添加控件。n若Vi
12、sual C+窗口中沒(méi)有出現(xiàn)Controls工具欄,只需將光標(biāo)指向菜單欄并單擊鼠標(biāo)右鍵,從彈出式菜單中選擇Controls項(xiàng)。n控件工具欄上的每一個(gè)圖標(biāo)都代表了一種控件,如果不能確定控件的類(lèi)型,只要將光標(biāo)在該控件圖標(biāo)上停留片刻,就會(huì)顯示該控件類(lèi)型的提示。19 向?qū)υ?huà)框添加控件時(shí),先在Controls工具欄單擊要添加的控件,再將光標(biāo)指向?qū)υ?huà)框空白區(qū)域并單擊鼠標(biāo)。20添加與控件關(guān)聯(lián)的成員變量添加與控件關(guān)聯(lián)的成員變量 在生成自己的對(duì)話(huà)框類(lèi)并添加需要的控件后,可以利用ClassWizard類(lèi)向?qū)г趯?duì)話(huà)框類(lèi)的定義中為對(duì)話(huà)框資源上的每一個(gè)控件添加一個(gè)或多個(gè)對(duì)應(yīng)的成員變量。ClassWizard類(lèi)向?qū)У腗e
13、mber Variables頁(yè)面主要用來(lái)為對(duì)話(huà)框類(lèi)添加和刪除與對(duì)話(huà)框控件關(guān)聯(lián)的成員變量,我們?cè)诰帉?xiě)對(duì)話(huà)框程序時(shí)經(jīng)常同該頁(yè)面打交道。2122nClass name下拉框:選擇要添加成員變量的對(duì)話(huà) 框類(lèi);nControl IDs欄:選擇控件,因?yàn)橐砑拥某蓡T變量總是與一個(gè)對(duì)話(huà)框控件ID聯(lián)系在一起,它們代表控件對(duì)象本身或控件的某項(xiàng)屬性;nAdd Variable按鈕:添加與控件關(guān)聯(lián)的成員變量;nDelete Variable按鈕:刪除控件的某個(gè)成員變量。nControl IDs欄:列出對(duì)話(huà)框資源上已有的控件,第1列Control IDs表示控件的ID,第2列Type表示變量的類(lèi)型,第3列Member
14、表示成員變量名。在在Member Variables頁(yè)面:頁(yè)面:23Add Member Variable對(duì)話(huà)框?qū)υ?huà)框nMember variable name框:輸入成員變量名;nCategory下拉框:選擇成員變量的類(lèi)別,可為Control或 Value;nVariable type下拉框:選擇成員變量的類(lèi)型。24n如果在Category下拉框選擇Value項(xiàng),表示要為該控件的某項(xiàng)屬性定義一個(gè)變量,這意味著程序關(guān)心的是控件中的值,而不是控件對(duì)象本身。這時(shí),還可以通過(guò)Variable type下拉框?yàn)樽兞窟x擇不同的類(lèi)型,可以選擇一般的C+數(shù)據(jù)類(lèi)型或Visual C+自定義的數(shù)據(jù)類(lèi)型。n例如,
15、對(duì)于編輯框控件,此時(shí)成員變量的類(lèi)型可以是int、float、long、BOOL等C+一般數(shù)據(jù)類(lèi)型或者是UINT、CString等Visual C+自定義數(shù)據(jù)類(lèi)型。25n如果在Category下拉框中選擇Control項(xiàng),則表示定義的變量代表控件對(duì)象本身, Control類(lèi)別的變量實(shí)質(zhì)是一個(gè)控件對(duì)象,其類(lèi)型是MFC控件類(lèi)。n例如,對(duì)于編輯框控件,此時(shí)成員變量的類(lèi)型為CEdit。因此,可以通過(guò)添加的控件對(duì)象訪(fǎng)問(wèn)控件類(lèi)的成員變量和調(diào)用控件類(lèi)的成員函數(shù),實(shí)現(xiàn)對(duì)控件行為的控制和管理。l可以為一個(gè)控件同時(shí)定義一個(gè)Control類(lèi)別的變量和一個(gè)Value類(lèi)別的變量。這些變量都是作為對(duì)話(huà)框派生類(lèi)的成員變量,為
16、了在程序其它地方能夠直接訪(fǎng)問(wèn)添加的成員變量,它們都被聲明為public屬性。2611.2.4 對(duì)話(huà)框數(shù)據(jù)交換對(duì)話(huà)框數(shù)據(jù)交換DDX和驗(yàn)證和驗(yàn)證DDVn在對(duì)話(huà)框中實(shí)現(xiàn)用戶(hù)數(shù)據(jù)輸入和輸出的一般方法是通過(guò)ClassWizard類(lèi)向?qū)?duì)話(huà)框控件與成員變量相關(guān)聯(lián),利用對(duì)話(huà)框數(shù)據(jù)交換DDX(Dialog Data Exchange)和驗(yàn)證DDV(Dialog Data Validation)機(jī)制實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出。n當(dāng)利用ClassWizard類(lèi)向?qū)砑映蓡T變量時(shí),用戶(hù)如果在窗口的左下角輸入數(shù)據(jù)的范圍,ClassWizard將自動(dòng)加入函數(shù)DDV的調(diào)用代碼。27 例 如 , 當(dāng) 添 加 一 個(gè) U I N
17、 T 型 的 成 員 變 量m_nInput時(shí)指定它的最小值和最大值分別為0和100,則 C l a s s W i z a r d 類(lèi) 向 導(dǎo) 將 在 成 員 函 數(shù)DoDataExchange()中添加以下DDV函數(shù)的調(diào)用語(yǔ)句:DDV_MinMaxUInt(pDX, m_nInput, 0, 100); 程序運(yùn)行后,如果用戶(hù)的輸入數(shù)據(jù)超出0100的范圍,DDV將顯示一個(gè)提示信息對(duì)話(huà)框,提示用戶(hù)有效的輸入范圍。28UpdateData()的用法的用法: 當(dāng)調(diào)用UpdateData(TRUE)時(shí),MFC通過(guò)調(diào)用DDX函數(shù)將數(shù)據(jù)從控件傳遞到關(guān)聯(lián)的成員變量;當(dāng)調(diào)用UpdateData(FALSE)
18、時(shí),MFC通過(guò)調(diào)用DDX函數(shù)將數(shù)據(jù)從成員變量傳遞到關(guān)聯(lián)的的控件。利用UpdateData()函數(shù)實(shí)現(xiàn)了在刷新后重新獲取成員變量。29例例 完善Mysdi程序,向?qū)υ?huà)框資源添加需要使用的控件,并添加與控件關(guān)聯(lián)的成員變量。1向?qū)υ?huà)框資源添加控件。添加一個(gè)靜態(tài)文本控件,其Caption為“請(qǐng)輸入半徑”。添加一個(gè)Edit Box編輯框控件,其ID標(biāo)識(shí)為IDC_EDIT_ RADIUS,該控件用于接收用戶(hù)的輸入數(shù)據(jù)。2添加與控件關(guān)聯(lián)的成員變量。按Ctrl + W 鍵啟動(dòng)ClassWizard類(lèi)向?qū)?,單擊Member Variables標(biāo)簽。在Class name下拉框選擇類(lèi)CRadiusDialog,在
19、Control IDs欄選擇編輯框IDC_EDIT_RADIUS,單擊Add Variable按鈕。通過(guò)Add Member Variable對(duì)話(huà)框添加成員變量m_nRadius,其數(shù)據(jù)類(lèi)型為UINT。3使用對(duì)話(huà)框數(shù)據(jù)驗(yàn)證DDV功能,在該頁(yè)面的左下角輸入成員變量m_nRadius的最小值5和最大值250。30 例例 通過(guò)“編輯”菜單中的“輸入半徑(I)”命令打開(kāi)上述標(biāo)題為“輸入半徑”的對(duì)話(huà)框,并根據(jù)輸入的半徑畫(huà)一個(gè)圓。1為了在視圖對(duì)象中接收并存儲(chǔ)對(duì)話(huà)框編輯控件的值,在視圖類(lèi)CMysdiView中手工定義一個(gè)UINT類(lèi)型的成員變量m_nCViewRadius。2利用菜單編輯器在“編輯”菜單增加一
20、個(gè)菜單項(xiàng)“輸入半徑(I)”,其ID標(biāo)識(shí)為ID_EDIT_INPUTRADIUS,Caption為“輸入半徑(&I).”。按Ctrl+W鍵啟動(dòng)ClassWzard類(lèi)向?qū)?,在視圖類(lèi)中為ID_EDIT_INPUTRADIUS菜單項(xiàng)添加消息COMMAND的處理函數(shù),在函數(shù)中添加代碼。在程序中使用創(chuàng)建的對(duì)話(huà)框在程序中使用創(chuàng)建的對(duì)話(huà)框31 void CMysdiView:OnEditInputradius() / TODO: Add your command handler code here CRadiusDialog dlg; / 定義一個(gè)對(duì)話(huà)框?qū)ο?dlg.m_nRadius=100;/ 設(shè)
21、置編輯框顯示的初始值 if (dlg.DoModal()=IDOK) / 顯示對(duì)話(huà)框 m_nCViewRadius=dlg.m_nRadius; / 接收并存儲(chǔ)編輯框數(shù)據(jù) Invalidate(); / 刷新視圖 32 3在視圖類(lèi)構(gòu)造函數(shù)CMysdiView:CMysdiView()中將成員變量m_nCViewRadius初始化為0。在函數(shù)CMysdiView:OnDraw()中添加如下畫(huà)圓的語(yǔ)句:pDC-Ellipse(0, 0, 2*m_nCViewRadius, 2*m_nCViewRadius); 在視圖類(lèi)實(shí)現(xiàn)文件MysdiView.cpp的開(kāi)始位置加入包含對(duì)話(huà)框類(lèi)頭文件的語(yǔ)句: #i
22、nclude RadiusDialog.h”33注意:注意: 表面上看程序并沒(méi)有調(diào)用UpdateData(),但是,當(dāng)程序調(diào)用CDialog:DoModal()創(chuàng)建并顯示對(duì)話(huà)框時(shí),將自動(dòng)調(diào)用CDialog:OnInitDialog()完成初始化的工作。在OnInitDialog()中調(diào)用了UpdateData(FALSE),將數(shù)據(jù)從成員變量傳遞到關(guān)聯(lián)的控件,從而顯示在控件中。而單擊OK按鈕將調(diào)用C D i a l o g : : O n O k ( ) 函 數(shù) , 在 O n O K ( ) 中 調(diào) 用 了UpdateData(TRUE),將數(shù)據(jù)從控件傳遞到關(guān)聯(lián)的成員變量。 由此看來(lái),不管MF
23、C將DDX技術(shù)如何復(fù)雜化,我們只需知道,DDX就如同一條雙向通道,而方向控制開(kāi)關(guān)就是UpdateData()函數(shù)中的BOOL類(lèi)型參數(shù)是TRUE還是FALSE。34例11_2設(shè)計(jì)一個(gè)應(yīng)用程序,當(dāng)用戶(hù)在程序窗口上單擊鼠標(biāo)左鍵時(shí),會(huì)出現(xiàn)一個(gè)對(duì)話(huà)框,用戶(hù)可在輸入編輯框中輸入文字,當(dāng)按下”輸入”按鈕時(shí),該輸入可以存入對(duì)話(huà)框中與輸入編輯框?qū)?yīng)的成員變量;當(dāng)按下”顯示”按鈕時(shí),該數(shù)據(jù)將復(fù)制在與顯示編輯框?qū)?yīng)的成員變量中,并會(huì)在顯示編輯框中出現(xiàn);當(dāng)按下ok按鈕,對(duì)話(huà)框關(guān)閉,并把兩個(gè)成員變量的數(shù)據(jù)顯示在應(yīng)用程序的窗口上.3511.2.7 通用對(duì)話(huà)框通用對(duì)話(huà)框 在Windows程序設(shè)計(jì)中,經(jīng)常用到一些具有專(zhuān)門(mén)用途
24、的對(duì)話(huà)框,例如打開(kāi)文件對(duì)話(huà)框,保存文件對(duì)話(huà)框,顏色選擇對(duì)話(huà)框,字體選擇對(duì)話(huà)框等.MFC專(zhuān)門(mén)為用戶(hù)設(shè)計(jì)了能創(chuàng)建這類(lèi)對(duì)話(huà)框的類(lèi),這些類(lèi)的聲明均在頭文件afxdlgs.h中,在使用通用對(duì)話(huà)框時(shí),要包含該文件.公用對(duì)話(huà)框公用對(duì)話(huà)框 MFC公用對(duì)話(huà)框類(lèi)公用對(duì)話(huà)框類(lèi) CColorDialog CFileDialogCFindReplaceDialog CFontDialogCPagesSetupDialog CPrintDialog COleDialog說(shuō)說(shuō) 明明顏色設(shè)定對(duì)話(huà)框,選擇不同的顏色文件存取對(duì)話(huà)框,打開(kāi)或保存文件查找和替換對(duì)話(huà)框,查找和替換文本串字體設(shè)定對(duì)話(huà)框,選擇不同的字體。頁(yè)面設(shè)置對(duì)話(huà)框,設(shè)
25、置頁(yè)碼、頁(yè)眉等標(biāo)準(zhǔn)的打印對(duì)話(huà)框,用于打印和打印設(shè)置該類(lèi)及其派生類(lèi)用于生成OLE對(duì)話(huà)框371.文件對(duì)話(huà)框n一般的Windows應(yīng)用程序都應(yīng)該有打開(kāi)和保存文件的功能,MFC提供的文件對(duì)話(huà)框類(lèi)CFileDialog就是支持應(yīng)用程序的這個(gè)功能nCFileDialog類(lèi)的構(gòu)造函數(shù):38CFileDialog(BOOL bOpenFileDialog, /指定是Open還是Save對(duì)話(huà)框LPCTSTR lpszDefExt=NULL, /添加到?jīng)]擴(kuò)展名文件上的擴(kuò)展名PCTSTR lpszFileName=NULL,/應(yīng)該初始選定的文件名DWORD dwFlags=OFN_HIDEREADONLY|OFN_
26、OVERWRITEPROMPT, /自定義標(biāo)志LPCTSTR lpszFilter=NULL,/ /File of Type中的過(guò)濾參數(shù)CWnd* pParentWnd=NULL); /對(duì)話(huà)框父窗口的指針39n每一個(gè)過(guò)濾參數(shù)由兩項(xiàng)組成:第一項(xiàng)指明在文件類(lèi)型框中需要顯示的文本,第二項(xiàng)指明文件的類(lèi)型.一個(gè)完整的文件過(guò)濾參數(shù)如下: Word文檔(*.doc)|*.doc可以使用多個(gè)過(guò)濾參數(shù),用OR符號(hào)(|)連接起來(lái):Word文檔(*.doc)|*.doc|位圖(*.bmp)|*.bmp|全部文件(*.*)|*.*40如果要?jiǎng)?chuàng)建帶有提示框的保存對(duì)話(huà)框,構(gòu)造函數(shù)的第四個(gè)參數(shù)dwFlags應(yīng)該設(shè)為OFN_
27、HIDEREADONLY|OFN_OVERWRITEPROMPT.使用CFileDialog類(lèi)的構(gòu)造函數(shù)創(chuàng)建了打開(kāi)文件對(duì)話(huà)框或者保存文件對(duì)話(huà)框后,就可以使用DoModal來(lái)顯示對(duì)話(huà)框.例11_4 用鼠標(biāo)左鍵單擊窗口會(huì)出現(xiàn)一個(gè)打開(kāi)文件對(duì)話(huà)框,而用鼠標(biāo)右擊窗口會(huì)出現(xiàn)一個(gè)保存文件對(duì)話(huà)框.41void CMFCexp11_4View:OnLButtonDown(UINT nFlags, CPoint point) char*filters=Word文檔(*.doc)|*.doc|位圖(*.bmp)|*.bmp|全部文件(*.*)|*.*;CFileDialog fileDlg(TRUE,NULL,*.
28、doc,NULL,filters);int result=fileDlg.DoModal();if(result=IDOK)m_openfileName=fileDlg.GetPathName();AfxMessageBox(m_openfileName);CView:OnLButtonDown(nFlags, point);42void CMFCexp11_4View:OnRButtonDown(UINT nFlags, CPoint point) char*filters=Word文檔(*.doc)|*.doc|位圖(*.bmp)|*.bmp|全部文件(*.*)|*.*;CFileDial
29、og fileDlg(FALSE,NULL,*.doc,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,filters);int result=fileDlg.DoModal();if(result=IDOK)m_saveFileName = fileDlg.GetFileName();CView:OnRButtonDown(nFlags, point);43class CMFCexp11_4View : public CViewprotected: CString m_openfileName,m_saveFileName;afx_msg void OnLButto
30、nDown(UINT nFlags, CPoint point);afx_msg void OnRButtonDown(UINT nFlags, CPoint point);442.字體選擇對(duì)話(huà)框CFontDialog類(lèi)的構(gòu)造函數(shù)CFontDialog(LPLOGFONT lplfInitial=NULL,DWORDdwflags=CF_EFFECTS|CF_SCREENFONTS,CDC* pdcPrinter=NULL,CWND* pParentWnd=NULL);45一般只使用一個(gè)參數(shù):LOGFONT m_logFont;CFontDialog fontDialog(&m_log
31、Font);Int result=fontDialog.DoModal();當(dāng)用戶(hù)單擊Ok按鈕退出對(duì)話(huà)框,函數(shù)DoModal()將返回IDOK.在這種情況下,可通過(guò)GetCurrentFont獲得所選字體.GetCurrent函數(shù)原型為:Void GetCurrentFont(LPLOGFONT lplf);該函數(shù)將所選字體的值保存在參數(shù)中.46在獲取了LOGFONT結(jié)構(gòu)之后,應(yīng)該創(chuàng)建一個(gè)CFont類(lèi)的對(duì)象并調(diào)用該對(duì)象的成員函數(shù)CreateFontIndirect來(lái)創(chuàng)建該字體,例如:LOGFONT logFont;fontDialog.GetCurrentFont(&logFont);
32、CFont font;Font.CreateFontIndirect(&logFont);創(chuàng)建字體后就可以把字體選入設(shè)備描述環(huán)境.例11_5當(dāng)用戶(hù)左鍵單擊會(huì)出現(xiàn)一個(gè)字體選擇對(duì)話(huà)框,如果選擇了某種字體,當(dāng)按下對(duì)話(huà)框的確認(rèn)鍵后,窗口上的文本的字體會(huì)發(fā)生相應(yīng)的變化.47class CMFCexp11_5View : public CViewprotected:LOGFONT m_logFont; /定義一個(gè)LOGFONT類(lèi)型的數(shù)據(jù)成員CFont* m_pFont; /定義一個(gè)字體對(duì)象指針COLORREF m_fontColor; /定義存放字體顏色的成員變量48CMFCexp11_5View:CMFCexp11_5View() m_fontColor=RGB(0,0,0);/設(shè)置字體顏色/給結(jié)構(gòu)m_logFont各成員賦值,以描述默認(rèn)字體m_logFont.lfHeight = 48;m_logFont.lfWidth = 0;m_logFont
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45590-2025向日葵黑莖病菌檢疫鑒定方法
- GB/T 45519-2025紡織品纖維定量分析顯微鏡智能識(shí)別法
- 材料力學(xué)與智能材料性能控制重點(diǎn)基礎(chǔ)知識(shí)點(diǎn)
- 材料疲勞斷裂機(jī)理實(shí)驗(yàn)驗(yàn)證重點(diǎn)基礎(chǔ)知識(shí)點(diǎn)
- 經(jīng)濟(jì)學(xué)理論與現(xiàn)實(shí)的沖突試題及答案
- 銀行發(fā)生火災(zāi)的應(yīng)急預(yù)案(3篇)
- 船上發(fā)生火災(zāi)應(yīng)急預(yù)案(3篇)
- 火災(zāi)觸電踩踏事故專(zhuān)項(xiàng)應(yīng)急預(yù)案(3篇)
- 鐵路超大火災(zāi)應(yīng)急預(yù)案(3篇)
- 高考數(shù)學(xué)間接法探究及試題及答案
- 高血壓和心血管疾病的預(yù)防與管理
- 小學(xué)數(shù)學(xué)-水中浸物問(wèn)題-完整版題型訓(xùn)練30題-帶答案
- 中國(guó)大學(xué)生積極心理品質(zhì)量表
- 2023充電樁停車(chē)場(chǎng)租賃合同 充電樁租地合同正規(guī)范本(通用版)
- JCT908-2013 人造石的標(biāo)準(zhǔn)
- 淺談屢查屢犯問(wèn)題的成因及對(duì)策
- 八年級(jí)下冊(cè)Unit-4復(fù)習(xí)課
- 神經(jīng)病學(xué)人衛(wèi)版習(xí)題集+期末試卷
- 車(chē)輛違章處理委托書(shū)委托書(shū)
- 氮化爐安全操作規(guī)程
- 初中物理電功率高低溫檔專(zhuān)題解析課件
評(píng)論
0/150
提交評(píng)論