可視化編程入門mfc.ppt_第1頁(yè)
可視化編程入門mfc.ppt_第2頁(yè)
可視化編程入門mfc.ppt_第3頁(yè)
可視化編程入門mfc.ppt_第4頁(yè)
可視化編程入門mfc.ppt_第5頁(yè)
已閱讀5頁(yè),還剩87頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1,VC+的可視化編程入 門,馮耀霖,2,本課程簡(jiǎn)要介紹Windows應(yīng)用程序的形式和在VC+集成開(kāi)發(fā)環(huán)境下使用MFC編寫(xiě)Windows應(yīng)用程序的基本方法,以使同學(xué)們對(duì)面向?qū)ο蟮目梢暬╒isual)程序設(shè)計(jì)建立一個(gè)初步的概念并掌握一些基本方法,為深入學(xué)習(xí)和使用VC+和其他可視化編程工具打下基礎(chǔ)。,3,主題,可視化編程概述 使用MFC進(jìn)行可視化編程 常用控件及其應(yīng)用 菜單設(shè)計(jì),4,1 可視化編程概述,可視化編程的基本特點(diǎn) 可視化編程方法 窗口,5,1.1可視化編程的基本特點(diǎn),可視化(Visual)編程有三個(gè)基本特點(diǎn): 可視化的圖形用戶界面設(shè)計(jì) 使用面向?qū)ο蠓椒ň幊?采用事件驅(qū)動(dòng)的程序運(yùn)行方式,

2、6,1.可視化的圖形用戶界面設(shè)計(jì),我們已經(jīng)相當(dāng)熟悉以下小程序: 【例1.1】 #include using namespace std; int main( ) coutVC+是功能強(qiáng)大的編程工具!endl; coutVC+是面向?qū)ο蟮木幊坦ぞ撸ndl; coutVC+是可視化的編程工具!endl; return 0; ,7,【例1.2】 #include using namespace std; int main( ) double r; coutr; cout”圓周長(zhǎng)”2*3.1416*rendl; cout”圓面積”3.1416*r*rendl; return 0; 這是基于控制臺(tái)的文

3、本用戶界面應(yīng)用程序。運(yùn)行這種程序之后,屏幕出現(xiàn)MS-DOS窗口,并且按照程序代碼的流程執(zhí)行,用戶輸入數(shù)據(jù)后即顯示執(zhí)行結(jié)果。,8,9,進(jìn)行可視化編程,同樣可以寫(xiě)出相同功能的程序,程序運(yùn)行出現(xiàn)如圖1和圖2所示的窗口。圖1中的窗口稱為文檔窗口,圖2中的窗口稱為對(duì)話框。顯然,它們比MS-DOS的文本用戶界面更為友好且方便。這種界面稱為 圖形用戶界面(GUI, Graphical User Interface)。 在非可視化環(huán)境下,圖形用戶界面的設(shè)計(jì) 都需通過(guò)編寫(xiě)程序代碼來(lái)實(shí)現(xiàn),且在設(shè)計(jì) 過(guò)程中是看不到界面的實(shí)際顯示效果的。,10,Visual Studio支持可視化的圖形用戶界面設(shè)計(jì)。Windows應(yīng)

4、用程序的每個(gè)圖形界面元素(如對(duì)話框、菜單、命令按鈕、文本框等)都是可視的,即設(shè)計(jì)時(shí)在顯示器屏幕上是可見(jiàn)的,且所見(jiàn)即所得。編程者可根據(jù)具體用戶界面設(shè)計(jì)的要求,直接使用VS系統(tǒng)提供的標(biāo)準(zhǔn)工具在屏幕上“畫(huà)”出各種Windows風(fēng)格的圖形界面元素,而不必為這些界面元素的構(gòu)建設(shè)計(jì)大量代碼,VS會(huì)自動(dòng)生成這些界面元素的設(shè)計(jì)代碼,開(kāi)發(fā)人員只需為每個(gè)圖形界面元素設(shè)置特定的屬性值,代碼編寫(xiě)只針對(duì) 界面元素所要實(shí)現(xiàn)的具體功能。,11,2. 面向?qū)ο缶幊谭绞?由于Windows應(yīng)用程序的復(fù)雜性,從圖形用戶界面到整個(gè)應(yīng)用程序,都是采用面向?qū)ο蟮姆椒ńM織的。Windows中的對(duì)象可以是所有的規(guī)范部件,如窗口、菜單、工具

5、欄、按鈕、文本框、以及程序模塊等。 從用戶的觀點(diǎn)看,Windows應(yīng)用程序有一個(gè)窗口,窗口上有若干菜單、命令按鈕、圖標(biāo)等界面圖形元素; 而窗口背后是一些對(duì)應(yīng)的程序。 從MFC的面向?qū)ο竽P涂?,一個(gè)Windows應(yīng) 用程序可以拆分成許多功能獨(dú)立的對(duì)象,各 自負(fù)責(zé)不同類型的工作,其最基本的構(gòu)成對(duì)象可以分為兩大類:程序?qū)ο蠛痛翱趯?duì)象。,12,一個(gè)應(yīng)用程序的執(zhí)行就像一場(chǎng)舞臺(tái)演出。應(yīng)用程序?qū)ο笫悄缓笕藛T(導(dǎo)演、劇務(wù)等),它們負(fù)責(zé)安排并指揮“演員”(窗口)上場(chǎng),準(zhǔn)備和調(diào)度各種演出“資源”(如菜單、工具欄、圖標(biāo)等)。從操作系統(tǒng)來(lái)看,具有“法人”地位的是應(yīng)用程序?qū)ο蠖谴翱趯?duì)象,應(yīng)用程序可以占有CPU時(shí)間和內(nèi)

6、存空間,還可擁有演出所需的“資源”。,Visual Studio系統(tǒng)給每個(gè)對(duì)象分配一個(gè)句柄(handle),它是一個(gè)4字節(jié)長(zhǎng)的整數(shù)值,是對(duì)象的唯一內(nèi)部編號(hào)。應(yīng)用程序通過(guò)句柄訪問(wèn)相應(yīng)的對(duì)象。每個(gè)對(duì)象除了句柄外,還有一個(gè)對(duì)象標(biāo)識(shí)符ID,可看作是對(duì)象的外部名。ID與句柄的區(qū)別主要在于:ID可以是用戶自行設(shè)定的;而句柄是系統(tǒng)內(nèi)定的,對(duì)用戶是透明的,這能防止應(yīng)用程序直接訪問(wèn)對(duì)象的內(nèi)部信息。,13,3. 事件驅(qū)動(dòng)的程序運(yùn)行機(jī)制,傳統(tǒng)的文字用戶界面的應(yīng)用程序都有一個(gè)起點(diǎn)和終點(diǎn),程序中的各模塊(函數(shù)或?qū)ο螅┑目刂七^(guò)程和執(zhí)行順序是在編寫(xiě)程序時(shí)精心設(shè)置好的,是預(yù)知的、確定的,整個(gè)程序的運(yùn)行過(guò)程是明確的。這種程序運(yùn)

7、行機(jī)制稱為過(guò)程驅(qū)動(dòng)。 可視化應(yīng)用程序則采用的是事件驅(qū)動(dòng)的程序運(yùn)行機(jī)制: 事件發(fā)出消息,消息激活對(duì)象。 即應(yīng)用程序的運(yùn)行沒(méi)有嚴(yán)格的起點(diǎn)和終點(diǎn)以及固 定的流程,各對(duì)象之間沒(méi)有規(guī)定的執(zhí)行順序, 即程序的運(yùn)行過(guò)程是不明確的,而是由事件 及其消息控制著對(duì)象的激活和程序的運(yùn)行過(guò)程。 對(duì)象通常處于循環(huán)休眠狀態(tài),當(dāng)發(fā)生了某個(gè)事件并有相應(yīng)消息傳遞給對(duì)象,才會(huì)按照消息的指示執(zhí)行程序代碼,一次消息的處理工作完畢后又恢復(fù)休眠狀態(tài)以等待下一個(gè)事件的發(fā)生及其消息的到來(lái)。,14,事件(event)是什么?事件的含義很廣泛,簡(jiǎn)單地說(shuō),事件就是激活對(duì)象執(zhí)行程序代碼的一種動(dòng)作。 在Windows的操作環(huán)境中,無(wú)論系統(tǒng)產(chǎn)生的動(dòng)作還

8、是運(yùn)行程序時(shí)用戶產(chǎn)生的動(dòng)作都稱為事件。最常見(jiàn)的用戶事件是鼠標(biāo)事件和鍵盤(pán)事件。實(shí)際上,任何一個(gè)擁有設(shè)備驅(qū)動(dòng)程序的系統(tǒng)輸入設(shè)備(包括端口)都可以產(chǎn)生各種事件,發(fā)送自己的消息。,消息(message)是Visual Studio定義(WinUser.h頭文件)的一種特殊的數(shù)據(jù)結(jié)構(gòu)(MSG),它打包了“事件”發(fā)生的相關(guān)信息,例如:消息接收者的句柄、事件的類型和來(lái)源、消息參數(shù)等。,15,Windows系統(tǒng)有各種各樣的消息,消息的傳遞無(wú)時(shí)不在發(fā)生,即使電腦閑置時(shí),還會(huì)有系統(tǒng)時(shí)間的消息傳遞出來(lái)。任何一個(gè)看似十分簡(jiǎn)單的動(dòng)作都會(huì)引發(fā)窗口之間許多消息的交換。在Visual C+中, 什么對(duì)象可以產(chǎn)生或接收什么事件

9、,是由MFC規(guī)定的。 例如,命令按鈕有鼠標(biāo)單擊(BN_CLICKED)和雙擊(BN_DOUBLECLICKED)事件; 文本編輯框有改變文本(EN_CHANGE) 、接受輸入焦點(diǎn)(EN_SETFOCUS)、 失去輸入焦點(diǎn)(EN_KILLFOCUS)、 單擊垂直滾動(dòng)條(EN_VSCROLL)等事件。,16,當(dāng)在對(duì)象上發(fā)生了某個(gè)事件并發(fā)出了相應(yīng)的消息后,接收者對(duì)象就要響應(yīng)并處理該消息。每個(gè)需要響應(yīng)的消息要求對(duì)應(yīng)一個(gè)處理該消息的程序事件驅(qū)動(dòng)程序。響應(yīng)消息就是啟動(dòng)相應(yīng)的事件驅(qū)動(dòng)程序。Visual Studio中將響應(yīng)消息的過(guò)程稱為消息映射。,17,1.2 可視化編程方法,使用VC+進(jìn)行可視化編程有兩種

10、方法: 基于Windows API函數(shù)的編程方法 基于Microsoft MFC的編程方法,18,1. 基于Windows API函數(shù)的編程方法,API是應(yīng)用程序編程接口(Application Programming Interface)的縮寫(xiě),是Windows操作系統(tǒng)與Windows應(yīng)用程序之間的標(biāo)準(zhǔn)接口。作為Windows操作系統(tǒng)的組成部分(shell),API提供了1000多個(gè)可供應(yīng)用程序直接調(diào)用的C函數(shù)(在Windows API參考手冊(cè)中有詳細(xì)介紹),這些函數(shù)大致可分為三類: 窗口管理函數(shù):實(shí)現(xiàn)窗口的創(chuàng)建、移動(dòng)和修改功能。 圖形設(shè)備接口函數(shù):實(shí)現(xiàn)與具體顯示設(shè)備無(wú)關(guān)的圖形操作。 系統(tǒng)服

11、務(wù)函數(shù):實(shí)現(xiàn)操作系統(tǒng)提供的各種實(shí)用服務(wù)功能。,19,使用API設(shè)計(jì)Windows應(yīng)用程序,對(duì)于理解和掌握面向?qū)ο蟪绦蛟O(shè)計(jì)的思想和方法是相當(dāng)關(guān)鍵的,是想成為Windows編程高手的必經(jīng)之路。但它要求編程者必須熟知Windows應(yīng)用程序的架構(gòu)、事件驅(qū)動(dòng)以及消息傳遞等內(nèi)部機(jī)制,并且仍然必須編寫(xiě)大量代碼,即它要求編程者具備較高的專業(yè)素質(zhì),這對(duì)初學(xué)者來(lái)說(shuō)無(wú)疑是比較困難的。當(dāng)然,使用API編程更具靈活性和個(gè)性化。 API支持所有Windows應(yīng)用程序的開(kāi)發(fā)系統(tǒng), 如VC+、VB、Java等。,20,2. 基于Microsoft MFC的編程方法,MFC是微軟基礎(chǔ)類庫(kù)(Microsoft Foundatio

12、n Class)的縮寫(xiě)。與API不同,MFC不是Windows操作系統(tǒng)的組成部分,而是微軟公司專為VC+開(kāi)發(fā)的配套軟件包。與VC6配套的是MFC6.0。 MFC充分使用了面向?qū)ο蠓椒ㄖ械睦^承和多態(tài)性技術(shù),以類的方式封裝了Windows應(yīng)用程序所涉及的幾 乎所有的標(biāo)準(zhǔn)部件,如Windows應(yīng)用程序的 架構(gòu)、各種標(biāo)準(zhǔn)的圖形界面元素、其核心是 它以C+的形式封裝了Windows API的大部分函數(shù)。,21,MFC是一個(gè)很大的類層次體系(MFC6.0中包含了200多個(gè)類),它由一個(gè)稱為CObject的類作為根基類,其他類大部分從該類派生而來(lái),其整個(gè)類體系可大致劃分為: 基類 應(yīng)用程序框架類。包括:應(yīng)用

13、程序類、命令類、文檔/視窗類、框架窗口類、文檔模板類等 可視對(duì)象類。包括:窗口類、對(duì)話框類、控件類等 繪圖類。包括:繪圖工具類、設(shè)備描述表類等。 簡(jiǎn)單數(shù)據(jù)類型類 通用類包括:數(shù)組類、類表類、映像類 文件和數(shù)據(jù)庫(kù)類包括:文件I/O類、ODBC類、ADO類 Internet和網(wǎng)絡(luò)工作類包括:Win32 Internet類、Windows Socket類等 對(duì)象鏈接和嵌入(OLE, Object Lingking and Embedding)類 調(diào)試和異常類,22,事實(shí)上,MFC封裝了一個(gè)Windows應(yīng)用程序操作的每一方面,因此使用MFC編程,編程者可以把注意力集中于自己程序所特有的部分,不需要事

14、事親自動(dòng)手。與直接調(diào)用API函數(shù)相比,這將大大減少編程者編寫(xiě)的代碼數(shù)量,使編程工作變得更容易;同時(shí),程序標(biāo)準(zhǔn)部分由MFC的類來(lái)提供,可使程序變得更規(guī)范,更具可讀性,效率也更高。 對(duì)編程新手來(lái)說(shuō),MFC的最大優(yōu)點(diǎn)是它以高效簡(jiǎn)潔的方式為編程者做了所有標(biāo)準(zhǔn)部分的工作,特別是編程者可以在不需要寫(xiě)一行代碼的情況下完成一個(gè)完整的應(yīng)用 程序架構(gòu)(約需千行代碼)。MFC中包含了成 千上萬(wàn)行功能強(qiáng)大的、經(jīng)過(guò)優(yōu)化的Windows 程序代碼。編程者只要定義了某個(gè)MFC類的對(duì)象,就可以調(diào)用該類的成員函數(shù),輕輕松松完成本該由你自己一行行編寫(xiě)的程序代碼。從這點(diǎn)上說(shuō),MFC極大地降低了程序開(kāi)發(fā)難度。,23,1.3 窗 口,

15、窗口是Windows圖形用戶界面的最基本和最重要的部件,每一個(gè)Windows程序至少有一個(gè)窗口。故Windows圖形用戶界面也稱窗口界面。,24,1. 框架窗口,框架窗口是應(yīng)用程序的主窗口,負(fù)責(zé)管理其包容的其他窗口。一個(gè)應(yīng)用程序的最頂層的框架窗口是應(yīng)用程序啟動(dòng)時(shí)創(chuàng)建的第一個(gè)窗口。 MFC提供了由基類CWnd(窗口類)派生的4個(gè)框架窗口類: CFrameWnd CMDIFrameWnd CMDIChildWnd Cdialog 用于支持三種標(biāo)準(zhǔn)框架窗口:,25,單文檔(Single document)窗口 由CframeWnd類支持。文檔窗口主要由邊框、標(biāo)題欄、菜單欄、工具欄、編輯區(qū)等組成。 多

16、文檔(Multiple documents,MDI)窗口 由多個(gè)文檔窗口組成,其中第一個(gè)打開(kāi)的是主框架窗口,由CMDIFrameWnd類支持,其他為子框架窗口,由CMDIChildWnd類支持。子框架窗口沒(méi)有菜單欄 和工具欄,它們共享主窗口的菜單欄和工具欄。 對(duì)話框(Dialog) 對(duì)話框是一種特殊類型的窗口,它沒(méi)有菜單欄和工具欄,且一般不能改變窗口的大小。對(duì)話框由Cdialog類支持。,26,2.對(duì)話框與控件,對(duì)話框是應(yīng)用程序用于顯示或提示,并且等待用戶輸入信息的彈出式窗口。對(duì)對(duì)話框的操作一般是通過(guò)在對(duì)話框上添加控件來(lái)實(shí)現(xiàn)的。對(duì)話框與控件密不可分,在每個(gè)對(duì)話框內(nèi)都有一些控件,對(duì)話框依靠這些控

17、件與用戶交互。可以說(shuō),對(duì)話框是Windows應(yīng)用程序中最重要的用戶界面元素,是應(yīng)用程序與用戶進(jìn)行交互的主要部件。 控件Visual Studio把主要設(shè)置在對(duì)話框上的 一些標(biāo)準(zhǔn)的圖形界面元素定義為控件(Control) ,如文本框、列表框、命令按鈕、復(fù)選框等,它們中的大多數(shù)可以捕獲事件并向?qū)υ捒虬l(fā)送消息??丶?shí)際上也都是窗口,所有的控件類都是CWnd類的派生類??丶ǔJ亲鳛閷?duì)話框的子窗口而創(chuàng)建的。,Over,27,2 使用MFC進(jìn)行可視化編程,建立項(xiàng)目架構(gòu) 設(shè)計(jì)圖形用戶界面 設(shè)計(jì)對(duì)象的事件驅(qū)動(dòng)程序,編寫(xiě)相關(guān)代碼 項(xiàng)目的編譯、鏈接和運(yùn)行,28,Visual Studio把開(kāi)發(fā)一個(gè)應(yīng)用程序的過(guò)程

18、稱之為“項(xiàng)目”(Project,很多人把它翻譯成“工程”)。開(kāi)發(fā)一個(gè)Windows應(yīng)用程序的項(xiàng)目遠(yuǎn)比開(kāi)發(fā)一個(gè)控制臺(tái)應(yīng)用程序項(xiàng)目要復(fù)雜得多,工作量也要浩大得多。好在Visual Studio提供了一組強(qiáng)大的MFC項(xiàng)目的開(kāi)發(fā)工具。 開(kāi)發(fā)一個(gè)MFC項(xiàng)目通常有四個(gè)步驟: Step.1建立項(xiàng)目架構(gòu) Step.2設(shè)計(jì)圖形用戶界面 Step.3設(shè)計(jì)對(duì)象的事件驅(qū)動(dòng)程序 Step.4項(xiàng)目的編譯、鏈接和運(yùn)行 下面結(jié)合一個(gè)簡(jiǎn)單的編程實(shí)例(Case1)“計(jì)算圓的周長(zhǎng)和面積”來(lái)介紹這四個(gè)步驟。,29,2.1 建立項(xiàng)目架構(gòu),建立項(xiàng)目架構(gòu)(skeleton),類似于一個(gè)項(xiàng)目的總體設(shè)計(jì),它需要確定項(xiàng)目的類型,根據(jù)項(xiàng)目類型創(chuàng)建

19、并組織各種基本組件,包括:所有的類、一些基本對(duì)象、項(xiàng)目所需的必要資源等。從而為項(xiàng)目搭建起一個(gè)完整的架構(gòu)。,30,所謂項(xiàng)目類型,是以項(xiàng)目采用什么框架窗口作為主窗口來(lái)界定的。MFC支持三種標(biāo)準(zhǔn)項(xiàng)目類型: 單文檔(Single document)項(xiàng)目 以單文檔窗口作為項(xiàng)目主窗口。 多文檔(Multiple documents)項(xiàng)目 以多文檔窗口作為項(xiàng)目的主窗口。 對(duì)話框(Dialog based)項(xiàng)目 以對(duì)話框作為項(xiàng)目主窗口。這是最緊湊、 最簡(jiǎn)單的一種標(biāo)準(zhǔn)項(xiàng)目架構(gòu)。,31,VC+為用戶建立項(xiàng)目架構(gòu)提供了一個(gè)強(qiáng)大的工具 MFC AppWizard (MFC應(yīng)用程序向?qū)В?本實(shí)例采用的是對(duì)話框架構(gòu)。,

20、32,操作步驟,1. 選擇VC6主窗口菜單欄中的“文件新建”菜單項(xiàng),彈出一個(gè)如圖3所示的“新建”對(duì)話框。 2. 在對(duì)話框中選擇“項(xiàng)目”(project)選項(xiàng)卡。選擇MFC AppWizardexe(即MFC應(yīng)用程序)項(xiàng),在對(duì)話框右部輸入項(xiàng)目的路徑和項(xiàng)目名,然后單擊“確定”按鈕。 VC+以文件夾方式管理項(xiàng)目,如圖3所示,case1是D:CPPMFC_PRJ下的一個(gè)文件夾,該項(xiàng)目的 各種文件都將存放在這個(gè)文件夾中。 3. 在系統(tǒng)彈出如圖4所示的“MFC應(yīng)用程序向?qū)Р襟E1”對(duì)話框中進(jìn)行項(xiàng)目類型選擇。先選擇單選按鈕“Dialog based”(對(duì)話框項(xiàng)目),再單擊“下一個(gè)”按鈕。,33,4. 依次選擇

21、系統(tǒng)彈出的圖5至圖7(步驟2至步驟4)中對(duì)話框的選項(xiàng),用戶可以先全部采用默認(rèn)選擇,然后在編程過(guò)程中再按需要修改。單擊圖7中的“完成”按鈕,或者在出現(xiàn)其中任一個(gè)對(duì)話框時(shí)單擊“完成”按鈕,表示默認(rèn)其他選項(xiàng),系統(tǒng)就不再?gòu)棾銎渌麑?duì)話框。 5. 系統(tǒng)彈出如圖8所示的“新建項(xiàng)目信息”對(duì)話框,其中列出前面所做的選擇內(nèi)容,單擊“確定”按鈕。 至此,項(xiàng)目架構(gòu)創(chuàng)建完成,系統(tǒng)回到VC6的 集成開(kāi)發(fā)環(huán)境,如圖9所示。 從該窗口的左窗格的各選項(xiàng)卡中可以觀察到MFC AppWizard為一個(gè)對(duì)話框項(xiàng)目的架構(gòu)創(chuàng)建的所有組件:,34,CCase1Dlg等三個(gè)類 其中最主要的是CCase1Dlg類(項(xiàng)目case1的對(duì)話框類),

22、它由Cdialog類派生。,35,case1Dlg.h等四個(gè)頭文件 case1Dlg.h是最主要的一個(gè)頭文件,它包含了CCase1Dlg類的聲明。,36,case1Dlg.cpp等四個(gè)C+源程序文件 case1Dlg.cpp是CCase1Dlg類的實(shí)現(xiàn),它不僅是最重要的源程序文件,而且是整個(gè)項(xiàng)目的核心。用戶的編程工作主要是在這個(gè)文件上完成,它將包含實(shí)現(xiàn)具體應(yīng)用功能的全部代碼。 case1.cpp是項(xiàng)目的 啟動(dòng)程序,類似于非 Windows應(yīng)用程序中 的main函數(shù)。,37,另外,MFC AppWizard為項(xiàng)目生成了一個(gè)對(duì)話框窗體、一個(gè)項(xiàng)目圖標(biāo)、項(xiàng)目版本等資源。,38,至此,雖然一行代碼都沒(méi)有

23、編寫(xiě),但這個(gè)應(yīng)用程序架構(gòu)是可以運(yùn)行的程序。進(jìn)行編譯鏈接后,其運(yùn)行結(jié)果如圖10所示。以這種方式建立的應(yīng)用程序,其主窗口即是對(duì)話框。,圖10. 對(duì)話框項(xiàng)目架構(gòu)的運(yùn)行結(jié)果,39,2.2 設(shè)計(jì)圖形用戶界面,設(shè)計(jì)工具與設(shè)計(jì)方案 操作步驟,40,1.設(shè)計(jì)工具和設(shè)計(jì)方案,在完成了對(duì)話框項(xiàng)目架構(gòu)的創(chuàng)建后,VC6窗口上彈出了MFC的對(duì)話框編輯器(圖11)。 對(duì)話框編輯器主要用于創(chuàng)建、編輯對(duì)話框窗口,向?qū)υ捒虼绑w上添加控件和調(diào)整布局。對(duì)話框編輯器主要包括如下組件:對(duì)話框窗體、控件箱、調(diào)整(布局)工具欄以及對(duì)話框和控件的屬性對(duì)話框。 對(duì)話框窗體是MFC給每個(gè)工程默認(rèn)生成的一 個(gè)圖形資源,它是CCase1Dlg類的圖

24、形化。 所謂窗體即窗口毛坯,是還未完全成形的初 始窗口,它如同一塊“畫(huà)布”,在它上面可以畫(huà)上各種 控件來(lái)構(gòu)成項(xiàng)目所需的實(shí)際窗口。窗體的標(biāo)題欄上顯示的是本項(xiàng)目的名字,窗體上可設(shè)置網(wǎng)格,用于安排控件的位置和大小。在程序運(yùn)行時(shí),網(wǎng)格會(huì)自動(dòng)消失。,41,控件箱,MFC設(shè)計(jì)有20多個(gè)標(biāo)準(zhǔn)控件類,每個(gè)控件類就是制作控件的工具,控件工具箱,簡(jiǎn)稱控件箱(圖12)是存放控件類的容器,這些控件類都以圖標(biāo)式按鈕表示。開(kāi)發(fā)人員可利用控件箱在對(duì)話框上創(chuàng)建各種所需的控件。 將控件箱中的控件工具復(fù)制到對(duì)話框窗體中,即在對(duì)話框中創(chuàng)建了相應(yīng)的控件對(duì)象,這可通過(guò)可視化操作實(shí)現(xiàn): 方法1:用鼠標(biāo)按住控件箱上所選中的控件圖標(biāo),拖到對(duì)

25、話框中合適的位置?;?方法2:先單擊控件箱上所選中的控件圖標(biāo), 然后移動(dòng)鼠標(biāo)到對(duì)話框中合適的位置。 復(fù)制到對(duì)話框上的控件,可以移動(dòng)、復(fù)制、調(diào)整 或刪除,也可拖動(dòng)鼠標(biāo)縮放控件的大小。,42,對(duì)于本實(shí)例,可在對(duì)話框上建立如下控件: 1個(gè)編輯框:用于用戶輸入半徑值; 5個(gè)靜態(tài)文本框(靜態(tài)文本框只能顯示文本而不能輸入文本),其中: 2個(gè)靜態(tài)文本框分別用于顯示圓周長(zhǎng)和圓面積, 其余3個(gè)靜態(tài)文本框分別用于對(duì)上述三個(gè)文本框進(jìn)行文字說(shuō)明。 2個(gè)命令按鈕,“確定”和“退出”: 前者用于 確定輸入值,計(jì)算圓周長(zhǎng)和圓面積,然后把 結(jié)果顯示在對(duì)應(yīng)的輸出框上;后者用于結(jié)束 程序的執(zhí)行。 效果如圖2。,43,2. 操作步

26、驟,(1)設(shè)置主窗口的屬性值 單擊對(duì)話框窗體,使其成為當(dāng)前窗口(周圍出現(xiàn)8個(gè)小方塊)。 從VC6窗口的菜單欄上的“查看”菜單中選擇“屬性”選項(xiàng),或者用鼠標(biāo)右擊窗體,從彈出的快捷菜單中選擇“屬性”,都將彈出圖13所示的“對(duì)話框?qū)傩浴睂?duì)話框。 在“常規(guī)”(General)選項(xiàng)卡下: 該對(duì)話框?qū)ο蟮腎D默認(rèn)為:IDD_CASE1_DIALOG 將標(biāo)題值設(shè)置為:計(jì)算圓周長(zhǎng)和圓面積 單擊“字體”按鈕,進(jìn)行字體屬性的設(shè)置 其余屬性采用默認(rèn)值。 關(guān)閉屬性對(duì)話框。 上述設(shè)置在CCase1Dlg類的代碼中立即被反映。,44,(2)添加編輯框控件 用鼠標(biāo)把控件工具箱上的編輯框拖到對(duì)話框窗體的合適位置,就建立了一個(gè)

27、編輯框控件。 用鼠標(biāo)右擊該編輯框,從彈出的快捷菜單中選擇“屬性”,彈出如圖14所示的編輯框?qū)傩詫?duì)話框。 該編輯框?qū)ο蟮腎D默認(rèn)為:IDC_EDIT1 在“樣式”(Styles)選項(xiàng)卡中設(shè)置相關(guān)屬性值為:“靠左”(Left)和“垂直居中”(Center)。 其余屬性采用默認(rèn)值。 關(guān)閉屬性對(duì)話框。,45,(3)添加靜態(tài)文本框控件 用鼠標(biāo)把控件工具箱上的靜態(tài)文本框拖到對(duì)話框窗體的合適位置,就建立了一個(gè)靜態(tài)文本框控件。用同樣的操作(或復(fù)制)建立其他四個(gè)靜態(tài)文本框。 用鼠標(biāo)右擊靜態(tài)文本框,從彈出的快捷菜單中選擇“屬性”,彈出如圖15所示的靜態(tài)文本框?qū)傩詫?duì)話框。,可對(duì)這5個(gè)靜態(tài)文本框的屬性值設(shè)置如下: I

28、D標(biāo)題其他屬性 - IDC_STATIC1 輸入半徑: 居中,垂直居中 IDC_STATIC2圓周長(zhǎng) 居中,垂直居中 IDC_STATIC3圓面積 居中,垂直居中 IDC_STATIC4默認(rèn) 靠左,垂直居中,Client edge IDC_STATIC5默認(rèn) 靠左,垂直居中,Client edge,其中,IDC_STATIC45作為結(jié)果輸出框,分別顯示圓周長(zhǎng)和圓面積; IDC_STATIC13分別作為輸入框和輸出框的文字說(shuō)明。,46,(4)建立命令按鈕控件 建立2個(gè)命令按鈕,它們的屬性值設(shè)置如下: ID 標(biāo)題 - IDC_BUTTON1 確定 IDC_BUTTON2退出 - 至此,控件在窗體上

29、“擺放”完畢,可以用鼠標(biāo) 調(diào)整它們的大小和位置,也可以用調(diào)整工具 欄調(diào)整控件之間的對(duì)齊方式、分布、大小規(guī)格,以及測(cè)試效果,設(shè)計(jì)好的圖形用戶界面如圖16所示。,47,2.3 設(shè)計(jì)對(duì)象的事件驅(qū)動(dòng)程序,設(shè)計(jì)的工作和方法 設(shè)計(jì)工具與設(shè)計(jì)方案 操作步驟,48,1.設(shè)計(jì)的工作和方法,對(duì)象的事件驅(qū)動(dòng)程序在VC+中稱為消息處理成員函數(shù)。對(duì)于對(duì)話框工程,作為工程的主界面,對(duì)話框?qū)ο笮枰憫?yīng)并處理所有的控件消息。設(shè)計(jì)對(duì)話框的消息處理成員函數(shù)的工作主要包括: 確定各個(gè)控件要傳遞的數(shù)據(jù); 確定對(duì)象的消息映射,即接收什么消息,建立 什么消息處理函數(shù); 在消息處理函數(shù)的函數(shù)體內(nèi)添加代碼。,49,在實(shí)際應(yīng)用中,讀取或更新控

30、件上的數(shù)據(jù)是對(duì)話框的非常重要的工作。MFC為此提供了一套標(biāo)準(zhǔn)方法:DDX(Data Exchange,數(shù)據(jù)交換)和DDV(Data Validation,數(shù)據(jù)校驗(yàn))技術(shù)。 DDX通過(guò)成員變量(member variable)的方式實(shí)現(xiàn)對(duì)話框與控件之間的數(shù)據(jù)傳遞。如果要在對(duì)話框的消息處理函數(shù)中訪問(wèn)控件上的數(shù)據(jù),就必須先在對(duì)話框類(CCase1Dlg類)中分別為這些控件添加 (聲明)一個(gè)成員變量,每一個(gè)成員變量 綁定一個(gè)控件。在消息處理函數(shù)中是通過(guò) 成員變量訪問(wèn)控件的。,50,成員變量是對(duì)話框的public數(shù)據(jù)成員。有兩類成員變量: Value類成員變量:表示該變量的值為控件的數(shù)據(jù)。 Contro

31、l類成員變量:表示該成員變量就代表控件本身,即它是控件的一個(gè)對(duì)象,其值實(shí)際上就是控件的句柄。 DDV用于數(shù)據(jù)的校驗(yàn),例如自動(dòng)校驗(yàn)字符串的長(zhǎng)度和取值范圍。,51,使用MFC DDX/DDV的流程是: 首先定義用于接收控件數(shù)據(jù)的成員變量。例如,為編輯框IDC_EDIT1定義一個(gè)Value類的double型的成員變量,用于接收用戶輸入的半徑值。定義變量的同時(shí)可以設(shè)定數(shù)據(jù)取值范圍,提供校驗(yàn)。 然后,在對(duì)應(yīng)的消息處理成員函數(shù)中調(diào)用MFC函數(shù)傳遞數(shù)據(jù)。最簡(jiǎn)單的相關(guān)MFC函數(shù)有: UpdateData() /更新成員變量,將控件上的數(shù)據(jù)傳遞給成員變量 UpdateData(FALSE) /更新控件,將成員變

32、量的值傳遞給控件,52,2. 設(shè)計(jì)工具和設(shè)計(jì)方案,完成上述工作可使用VC+提供的一個(gè)強(qiáng)大工具 MFC Class Wizard (類向?qū)В?它主要是用來(lái)管理項(xiàng)目中的對(duì)象和消息及其消息處理函數(shù)的,是MFC編程必不可少的重要工具。,53,對(duì)于本實(shí)例,可設(shè)計(jì)如下成員變量和消息處理函數(shù): 為編輯框IDC_EDIT1定義一個(gè)double型的成員變量m_r,用于接收用戶在編輯框中輸入的半徑值; 為靜態(tài)文本框IDC_STATIC4和IDC_STATIC5分別定義一個(gè)Cstring型成員變量m_girth和m_area用于向靜態(tài)文本框傳遞計(jì)算結(jié)果。靜態(tài)文本框只能處理Cstring(字符串)型數(shù)據(jù)。 注意:成員

33、變量名的前綴“m_”是MFC的風(fēng)格。MFC也有自己的數(shù)據(jù)類型,不過(guò)與C+很相似,容易理解。 為“確定”按鈕建立一個(gè)“單擊” (BN_CLICKED)消息處理函數(shù),用于 計(jì)算圓周長(zhǎng)和圓面積,并顯示計(jì)算結(jié)果。 為“退出”按鈕建立一個(gè)“單擊”消息處理函數(shù),用于結(jié)束程序的運(yùn)行。 建立一個(gè)對(duì)話框的初始化函數(shù),對(duì)成員變量m_r、m_girth、m_area進(jìn)行初始化。,54,2. 操作步驟,(1)添加成員變量 打開(kāi)“MFC Class Wizard”(類向?qū)В?duì)話框,如圖17所示。方法可以是:從VC6窗口的菜單欄上的“查看”菜單中選擇“建立類向?qū)А边x項(xiàng),或者用鼠標(biāo)右擊窗體,從彈出的快捷菜單中選擇“建立類向

34、導(dǎo)”,或者按快捷鍵Ctrl+W。 選擇“Member Variables”(成員變量)選項(xiàng)卡。從“Control IDs”(控件ID)列表框中,可以看到 已經(jīng)建立的各控件對(duì)象的ID。 為編輯框添加成員變量:選擇IDC_EDIT1,單擊 右邊的“Add Variable”(添加變量)按鈕,彈出如圖18所示的“添加成員變量”對(duì)話框,55,在第一個(gè)文本框(Member variable name)中輸入成員變量名,如m_r; 在第二個(gè)下拉框(Category)中選擇成員變量的種類,Value; 在第三個(gè)下拉框(Variable Type)中選擇成員變量的數(shù)據(jù)類型,double。 單擊OK按鈕?;氐健?/p>

35、Member Variables”選項(xiàng)卡,設(shè)置變量m_r的取值范圍,如最小值為0,最大值為1000.0。 用同樣的方法為靜態(tài)文本框IDC_STATIC4 和IDC_STATIC5添加Cstring型成員變量m_girth 和m_area,最大字符個(gè)數(shù)為10(圖19)。,56,(2)編寫(xiě)消息處理成員函數(shù) 主窗口的初始化函數(shù) 切換到類向?qū)У摹癕essage Map”(消息映射)選項(xiàng)卡,如圖20所示。 在“Object IDs”(對(duì)象名)列表框中選擇主窗口的對(duì)象名CCase1Dlg; 在“Messages”(消息)列表框中選擇消息 WM_INITDIALOG; 此時(shí)在“Member function

36、s”(成員函數(shù)) 列表框中會(huì)自動(dòng)指出相應(yīng)的MFC已定義的 虛函數(shù)OnInitDialog。(主窗口對(duì)象是由MFC默認(rèn)生成的),57, 單擊“Edit Code”(編輯代碼)按鈕,彈出Case1Dlg.cpp文件的編輯窗口,并顯示OnInitDialog()函數(shù)的代碼清單,找到注釋提示處: / TODO: Add extra initialization here (在此下邊添加你初始化的代碼) 對(duì)于本實(shí)例,可添加如下代碼: m_r =0.0; m_girth=m_area=0.000; UpdateData(FALSE); /將數(shù)據(jù)傳給控件并顯示,58,BOOL CCase1Dlg:OnIni

37、tDialog() CDialog:OnInitDialog(); / TODO: Add extra initialization here m_r =0.0; m_girth=m_area=0.000; UpdateData(FALSE); /將數(shù)據(jù)傳給控件并顯示 return TRUE; / return TRUE unless you set the focus to a control ,59,“確定”按鈕的消息處理函數(shù) 類似上述方法, 在“Object IDs”列表框中選擇IDC_BUTTON1; 在“Messages”列表框中選擇消息BN_CLICKED; 單擊“Add Func

38、tion”(添加函數(shù))按鈕,此時(shí)在“Member functions”列表框中會(huì)出現(xiàn)一個(gè)新的函數(shù)名OnButton1,表示系統(tǒng)為該對(duì)話框生成了一個(gè)新成員函數(shù)(圖21); 單擊“Edit Code”(編輯代碼)按鈕,彈出 Case1Dlg.cpp文件的編輯窗口, 并顯示OnButton1()函數(shù)的代碼清單, 找到注釋提示處: / TODO: Add your control notification handler code here (在此下邊添加控件消息的處理代碼),60,對(duì)于本實(shí)例,可添加如下代碼: UpdateData();/將編輯框的數(shù)據(jù)傳遞給成員變量 double girth=2*3.1416*m_r;/計(jì)算圓周長(zhǎng) double area=3.1416*m_r*m_r;/計(jì)算圓面積 m_girth.Format(“%10.3f”,girth);/按格式寫(xiě)入成員變量 m_area.Format(%10.3f,area); UpdateDtata(FALSE);/將數(shù)據(jù)傳給控件并顯示 注:函數(shù)Fornat()是CString類的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論