




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第五講 MFC編程基礎(chǔ)知識(shí),中國地質(zhì)大學(xué)(武漢) 計(jì)算機(jī)學(xué)院,計(jì)算機(jī)高級(jí)語言(VC+),本章內(nèi)容主要包括利用面向?qū)ο蟮挠^點(diǎn)理解MFC,利用繼承思想講解MFC中的具有層次關(guān)系的類、應(yīng)用程序架構(gòu)與軟件復(fù)用,建立最簡單的具有圖形用戶界面的MFC應(yīng)用程序。 要求了解工作區(qū)的ClassView視圖中的各個(gè)菜單的含義、一些可視對象中的可視成分在圖形界面中的表現(xiàn),能夠利用MSDN查看各個(gè)類之間的繼承圖,掌握MFC中類的抽象性、封裝性和繼承性,熟練掌握建立最簡單的具有圖形用戶界面的MFC應(yīng)用程序的方法。,教學(xué)要點(diǎn),5.1 MFC 概述 5.2 MFC的層次結(jié)構(gòu)及其子類功能簡介 5.3 MFC應(yīng)用程序架構(gòu),概述
2、,VC開發(fā)應(yīng)用程序的最常用的模式就是利用MFC進(jìn)行Win32應(yīng)用程序的設(shè)計(jì)。 MFC就是利用面向?qū)ο蟮乃枷?,將Windows大部分API函數(shù)封裝起來的一個(gè)浩瀚的類庫,利用MFC編寫程序本質(zhì)上就是選擇該類庫中合適的類,并調(diào)用其下相應(yīng)成員函數(shù)來完成某個(gè)功能。雖然MFC編程相對于API編程簡單了,但掌握卻并不容易。,學(xué)習(xí)MFC入門困難的原因 (1)MFC采用的是C+語言,對C+本身的技術(shù)沒有掌握。因此想學(xué)好MFC,必須把C+的基礎(chǔ)內(nèi)容搞清楚; (2)MFC龐大的類庫中類的命名及成員變量或成員函數(shù)的命名沒有清楚,其實(shí)很簡單,MFC中的類及其成員的命名都采用的是匈牙利命名法,把這些名字的英文直接翻譯過來
3、,就知道它是什么意思。 (3)MFC編程,首先生成的是一個(gè)應(yīng)用程序架構(gòu),對這個(gè)架構(gòu)的不了解導(dǎo)致生成的代碼不知其為何如此。本章就是要給大家一個(gè)架構(gòu)的概貌;,(4)傳統(tǒng)的API編程的步驟統(tǒng)統(tǒng)不見了, 使人們不知道編寫的Windows程序什么時(shí)候建立起來 、什么時(shí)候消亡. 事實(shí)上,MFC的應(yīng)用程序架構(gòu)把類似于API編程所要求的步驟都隱藏了,都封裝到架構(gòu)中了對于初學(xué)者,只需要清楚自己的代碼往什么地方添加就可以 (5)缺乏面向?qū)ο蠓治瞿芰?。面向?qū)ο蟮姆治鲆蟾闱宄粋€(gè)系統(tǒng)中有哪些類、各個(gè)類之間有哪些聯(lián)系,尤其是在編寫基于文檔/視圖結(jié)構(gòu)的應(yīng)用程序時(shí)。該方面能力的培養(yǎng)要靠多分析一些程序中類之間的關(guān)系,并要參
4、考相關(guān)方面的書籍介紹。,本章把MFC類庫中的主要類以層次結(jié)構(gòu)做了一個(gè)簡單的介紹,并對MFC應(yīng)用程序的架構(gòu)做了描述。對于MFC應(yīng)用程序的學(xué)習(xí),剛開始要“不求甚解”,懂得代碼的放置以及原理就可以了,隨著學(xué)習(xí)的深入,在查看MFC源代碼后,就能逐漸了解到該類型應(yīng)用程序的執(zhí)行流程,從而最終掌握MFC應(yīng)用程序的開發(fā)。,5.1MFC概述,5.1.1 什么是MFC 5.1.2 MFC的設(shè)計(jì)原理 5.1.3 MFC的目標(biāo) *5.1.4 MFC的發(fā)展 *5.1.5 使用C+和MFC的好處,5.1.1 什么是MFC,MFC是Microsoft Foundation Class(微軟基礎(chǔ)類庫)的縮寫。 從物理角度看,
5、它是一個(gè)龐大的類庫、包含可控制計(jì)算機(jī)系統(tǒng)方方面面的類庫,它對應(yīng)的是Windows系統(tǒng)目錄下的一系列mfc*.dll文件;從邏輯角度看,它是一個(gè)面向?qū)ο蟮膽?yīng)用程序框架,程序員可以使用這一框架創(chuàng)建Windows應(yīng)用程序。 MFC的組織是以C+類的層次形式組織在一起,幾個(gè)高層類提供一般功能,而低層類實(shí)現(xiàn)更具體的功能,每一個(gè)低層類都是從高層類派生而來,因此繼承了高層類的功能。,MFC處理很多與Windows相關(guān)的常見任務(wù),例如在后臺(tái)做消息處理以及對消息進(jìn)行路由選擇,無需程序員在每一個(gè)開發(fā)的Windows應(yīng)用程序中編寫相同的消息處理循環(huán),MFC已經(jīng)實(shí)現(xiàn)了這一消息循環(huán),并對大多數(shù)常見的消息提供了易學(xué)易用的
6、消息響應(yīng)函數(shù)。例如OnPain()就是CWnd類的一個(gè)成員函數(shù),是對WM_PAINT消息進(jìn)行響應(yīng)的一個(gè)虛成員函數(shù)。 除了類的層次外,MFC也提供了一個(gè)應(yīng)用程序開發(fā)框架,此框架被稱為文檔/視圖架構(gòu)。,5.1.2 MFC的設(shè)計(jì)原理,MFC向軟件開發(fā)者提供一組服務(wù),來協(xié)調(diào)應(yīng)用程序。在很多情況下,MFC在幕后執(zhí)行一系列復(fù)雜的操作,它向程序員提供了更加簡單的編程界面,并可掩蓋Windows API的一些缺點(diǎn)(MFC類的許多成員函數(shù),如MessageBox()中提供了缺省參數(shù),這減輕了程序員編程的負(fù)擔(dān))。 MFC采用面向?qū)ο蟮脑O(shè)計(jì)方法,將Windows API中的相關(guān)部分組合到C+類或?qū)ο笾小@鏑Wnd
7、類封裝了大部分有關(guān)窗口處理的API函數(shù)。作為編程人員,不必記憶大量API函數(shù),需要作的只是實(shí)例化CWnd類的一個(gè)實(shí)例,并調(diào)用相應(yīng)的成員函數(shù)即可。,5.1.3 MFC的目標(biāo),建立MFC庫的目的是為了簡化Windows應(yīng)用程序的編制,MFC開發(fā)小組的工作是將此目的和程序設(shè)計(jì)原理結(jié)合起來。Microsoft在建立MFC庫遵循了一些基本原則,也是他們的設(shè)計(jì)目標(biāo): (1) 有效簡化編寫Windows應(yīng)用程序的難度,使用C+創(chuàng)建Windows應(yīng)用程序的過程容易和直觀。 (2) 合并已有的Windows的模型和概念。,(3) 確保類庫有足夠的擴(kuò)展性,以便于加入Windows后續(xù)版本的特性和功能。 (4) 更
8、容易使用Windows API特性。同時(shí)采用Windows API的概念、編程風(fēng)格和函數(shù)名稱。 (5) 用類來封裝Windows API和Windows對象,并按照API的指引完成工作。 (6) 更容易使用一些強(qiáng)大、復(fù)雜功能的抽象概念,如ActiveX、數(shù)據(jù)庫支持、打印等。,*5.1.4 MFC的發(fā)展,微軟于1989年成立了Application Framework開發(fā)小組,開始設(shè)計(jì)一個(gè)用于建立圖形界面的可移植的C+類庫。AFX(Applicatin Framework的縮寫)面向?qū)ο蟮募夹g(shù)建立一個(gè)易于使用并可移植的GUI。然而一年以后,AFX計(jì)劃失敗了,其主要原因是AFX開發(fā)小組過于信任面向
9、對象程序設(shè)計(jì)方法的能力,一個(gè)純粹抽象的類往往并不實(shí)用。,因此,AFX開發(fā)小組轉(zhuǎn)向開發(fā)MFC庫,并將其實(shí)現(xiàn)目標(biāo)從多目標(biāo)平臺(tái)轉(zhuǎn)向?qū)indows API的封裝;他們也不再試圖建立高度抽象的類,而重點(diǎn)在于建立實(shí)際可用的類;他們還避開使用復(fù)雜的C+的結(jié)構(gòu)(例如,多重繼承和模板),而)的目的是建立一個(gè)單一的類庫,用來簡化Windows、OS/2 Presentation Manager和Apple Macintosh 應(yīng)用程序的開發(fā), 當(dāng)時(shí),開發(fā)小組希望利用只是使用了一個(gè)C+的子集;,另外,他們不再使用抽象的類來隱藏Windows本身 API的細(xì)節(jié),而是使用戶能夠很方便地存取Windows原有的API。
10、這樣做有兩個(gè)原因:首先,可以簡化已有的Win16代碼到 MFC庫的轉(zhuǎn)換;其次,確保原有API的所有功能對應(yīng)用程序都是可以使用的,這意味著可以繞過類庫而直接調(diào)用這些 Windows原有的API函數(shù)。,AFX和MFC的另一個(gè)區(qū)別是所使用的開發(fā)方法不同,AFX采用是自頂向下的設(shè)計(jì)方法,逐步將對象抽象出來并施加到 Windows上;而 MFC庫采用的則是自底向上的設(shè)計(jì)方法,也就是說,從MFC的第一個(gè)版本開始,它的類就是建立在已有的Windows API 對象基礎(chǔ)上的,這樣就避免了AFX中代碼的超支與浪費(fèi)。,當(dāng)讀者使用MFC進(jìn)行編程時(shí),將會(huì)發(fā)現(xiàn)在MFC源程序中有很多包含“AFX”的字符串,如函數(shù)名Afx
11、GetApp(),常量名AFX_IDS_APP_TITLE,數(shù)據(jù)結(jié)構(gòu)名AFX_MSGMAP_ENTRY等等。這些名稱在Windows API函數(shù)中是不存在的,它們是AFX開發(fā)小組遺留的痕跡,而MFC的基本框架正是建筑于這些東西之上,所以MFC多多少少保留了該開發(fā)小組的標(biāo)志AFX。可見MFC封裝了SDK(軟件開發(fā)工具包)結(jié)構(gòu)、功能及應(yīng)用程序框架內(nèi)部技術(shù)。該應(yīng)用程序框架隱藏過去Windows程序員不得不處理的許多重復(fù)性工作。,*5.1.5 使用C+和MFC的好處,從本書的第一篇,我們已經(jīng)看出了面向?qū)ο蟪绦蛟O(shè)計(jì)的好處,如可復(fù)用性、代碼和數(shù)據(jù)緊密地綁定等。類是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心概念,程序中不僅可以
12、使用自己建立的類,還可以使用系統(tǒng)所提供的類,一個(gè)好的類庫可以大大減少編碼的數(shù)量。MFC成功之處在于,它是一個(gè)類庫、一個(gè)包羅計(jì)算機(jī)系統(tǒng)方方面面的類庫、一個(gè)集MicroSoft各路軟件高手之大成的類庫。通過從MFC繼承自己所需要的類,可以充分利用基類所具有的各種功能。 MFC將類、類的繼承、動(dòng)態(tài)約束、類的關(guān)系和相互作用等應(yīng)用程序概念封裝起來,可以使開發(fā)者高效、輕松地建立Windows應(yīng)用程序,而不受設(shè)備限制并且由事件進(jìn)行驅(qū)動(dòng)。 MFC具有良好的通用性和可移植性,它定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的工作就是通過VC所提供的各種工具來完成這個(gè)工作。,5.2MFC的層次
13、結(jié)構(gòu)及其子類功能簡介,5.2.1 MFC中類的層次結(jié)構(gòu) 5.2.2 根類CObject 5.2.3 應(yīng)用程序體系結(jié)構(gòu)類 5.2.4 可視對象類 *5.2.5 預(yù)定義的宏,5.2.1 MFC中類的層次結(jié)構(gòu),MFC是一個(gè)包含了超過200個(gè)不同類的很龐大的類庫。利用他們,開發(fā)者可以完成許多標(biāo)準(zhǔn)的Windows編程任務(wù),并且可以在應(yīng)用程序中加入許多復(fù)雜的特性。在設(shè)計(jì)思想上,MFC將面向?qū)ο蟮姆椒ㄅc事件驅(qū)動(dòng)結(jié)合得很好,因此要理解龐大的MFC類庫中的常用類的功能,要利用面向?qū)ο蟮乃枷脒M(jìn)行理解和分析。類的抽象性、封裝性、繼承性和多態(tài)度在你碰到的類中是如何體現(xiàn)的。它封裝了窗口的哪些數(shù)據(jù)成員和方法,哪些類是從這
14、個(gè)類中派生出來的,該類中可超載的虛函數(shù)都有哪些(只有搞清虛擬函數(shù)才能搞清多態(tài)性)。 打開MSDN,選中窗口左半部分的“搜索”選項(xiàng)卡,在待搜索的編輯框中輸入“hierarchy chart”后按回車,MSDN就把MFC的層次結(jié)構(gòu)圖顯示在窗口的右半部分。,5.2.2 根類CObject,CObject類是MFC的抽象基類(不能派生對象),是MFC中多數(shù)類和用戶自定義類的根類,它為程序員提供了許多公共操作和基本服務(wù)。主要包括:對象的動(dòng)態(tài)建立與刪除、序列化(即串行化)的支持、對象診斷輸出、運(yùn)行時(shí)信息以及集合類的兼容等。它的作用是,使得MFC以及基于MFC的應(yīng)用程序更加穩(wěn)固和易于調(diào)試。,5.2.3應(yīng)用程
15、序體系結(jié)構(gòu)類,1消息映射類CCmdTarget 該類是CObject的子類,是MFC類庫中所有具有消息映射屬性的基類,消息映射規(guī)定了當(dāng)對象接到命令消息時(shí),應(yīng)調(diào)用哪一個(gè)函數(shù)對該消息進(jìn)行處理。命令消息是來自菜單項(xiàng)、命令按鈕和加速鍵的信息,由CCmdTarget派生出的主框架類包括CView、CWinApp、CDocument、CWnd和CframeWnd都可處理命令消息。程序員若需要一個(gè)新類來處理消息時(shí),可以從CCmdTarget派生出一個(gè)新類。一般程序員很少從CCmdTarget類中直接派生出新類,而是從其子類CView、CWinApp來派生,2窗口應(yīng)用程序類CWinApp 每一個(gè)使用MFC的應(yīng)
16、用程序只能包含一個(gè)從CWndApp派生的應(yīng)用程序?qū)ο?,?dāng)VC的其它全局對象被構(gòu)造時(shí),這個(gè)對象也同時(shí)被構(gòu)造,當(dāng)Windows調(diào)用WinMain()函數(shù)時(shí),產(chǎn)生的對象已經(jīng)有效了。從CWinApp實(shí)例化的應(yīng)用程序?qū)ο笫且粋€(gè)全局變量,在程序運(yùn)行中該對象可以與其它對象相互協(xié)調(diào)。 (1)訪問CWinApp對象以及全局函數(shù)。 AfxGetApp:獲得一指向CWinApp對象的指針 AfxGetResourceHabdle: 獲得一應(yīng)用程序資源的句柄。 AfxGetAppName:獲得一指針,它指向一個(gè)包含應(yīng)用程序名的字符串。相反,如果有一個(gè)指向CWinApp對象的指針,使用m_pszExename可以取得應(yīng)
17、用程序的名稱。,(2)CWinApp的公共數(shù)據(jù)成員 m_pszAppName:指定應(yīng)用程序的名稱。 m_nCmdShow:指定窗口最初將如何顯示。 m_pMainWnd:包含一個(gè)指針,它指向一個(gè)應(yīng)用程序的主窗口。 (3)CWinApp的公共成員函數(shù) LoadCursor:調(diào)取光標(biāo)資源。 LoadStandardCursor:調(diào)取Windows預(yù)定義光標(biāo),在windows.h中指定IDC常量。 LoadIcon:調(diào)取一個(gè)圖標(biāo)資源。 LoadStandardIcon:調(diào)取Windows預(yù)定義的圖標(biāo),在windows.h中 指定IDI常量。 OpenDocumentFile:框架調(diào)用此函數(shù)打開一個(gè)指
18、定的文檔。,(4)CWinApp的可超載的函數(shù) InitApplication:重載以執(zhí)行任何應(yīng)用程序?qū)哟紊系某跏蓟?InitInstance:重載以執(zhí)行Windows對象實(shí)例的初始化,諸如建立用戶窗 口對象等。 Run:運(yùn)行缺省的消息循環(huán),重載該函數(shù)以自定義消息循環(huán)。 OnIdle:重載以執(zhí)行任何應(yīng)用程序指定的空閑時(shí)間處理。 PreTranslateMessage:在窗口消息被TranslateMessage()和DispatchMessage()處理之前過濾它們。 (5)CWinApp的保護(hù)成員函數(shù) SetDialogBkColor:為對話框和消息框設(shè)置缺省的背景顏色。 Enable3d
19、Conrtols:允許具有三維外觀的控件。,3應(yīng)用程序線程類CWinThread 該類為線程的基類,CWinApp是從CWinThread派生而來。該對象描述程序線程的執(zhí)行,主線程的執(zhí)行通常由一個(gè)CWinApp的派生對象提供。 (1)CWinThread的公共數(shù)據(jù)成員 m_hThread:當(dāng)前線程的句柄。 m_nThreadID:當(dāng)前線程的ID值。 m_pMainWnd:指向程序主窗口指針。 (2)CWinThread的公共成員函數(shù) GetMainWnd:獲取一個(gè)指向此線程的的主窗口指針。 GetThreadPriority:獲取當(dāng)前線程的優(yōu)先權(quán)。 ResumeThread:減小一個(gè)線程的掛起
20、計(jì)數(shù)。,4.文檔/視圖類 文檔對象由文檔模板對象創(chuàng)建,管理應(yīng)用程序的數(shù)據(jù)。視圖對象表示一個(gè)窗口的客戶區(qū),它顯示文檔數(shù)據(jù)并允許用戶與之交互。 CDocTemplate類:文檔模板的基類。它負(fù)責(zé)協(xié)調(diào)文檔、視窗和框架窗口的創(chuàng)建。 CMultiDocTemplate類:多文檔界面(MDI)的文檔模板。 CSingleDocTemplate類:單文檔界面(SDI)的文檔模板。 CDocument:應(yīng)用程序所用文檔的基類。 CView:顯示文檔數(shù)據(jù)的應(yīng)用程序?qū)S靡晥D的基類。,5.2.4 可視對象類,1. 窗口類CWnd CWnd類提供了MFC中所有窗口類的基類。CWnd與Windows窗口有所不同,但他們
21、又是緊密相連的。CWnd對象是由CWnd的構(gòu)造函數(shù)和析構(gòu)函數(shù)建立和取消的,而Windows窗口與此不同,它是Windows的一個(gè)結(jié)構(gòu),是由create成員函數(shù)建立的,DestroyWindow函數(shù)破壞Windows窗口而不是破壞對象。 (1)CWnd類的公共數(shù)據(jù)成員 m_hWnd:標(biāo)識(shí)連接到該CWnd對象上的HWND。 (2)CWnd類的初始化函數(shù) Create:創(chuàng)建并初始化與該CWnd對象相聯(lián)系的子窗口。 PreCreateWindow:在建立連接到這個(gè)CWnd對象的Windows窗口之前調(diào)用此函數(shù)。,GetStyle:返回當(dāng)前窗口的風(fēng)格。 SubclassWindow:將一個(gè)窗口連接給一個(gè)
22、CWnd對象并使其通過該CWnd的消息映射傳遞消息。 FromHandle:給出一個(gè)窗口句柄時(shí),返回一個(gè)CWnd對象的指針。 GetSafeHand:返回m_hWnd;若此指針為NULL,則返回NULL。 (3)CWnd類的窗口狀態(tài)函數(shù) EnableWindow:允許或禁止鼠標(biāo)和鍵盤輸入。 GetActiveWindow:獲取活動(dòng)的窗口。 SetActiveWindow:激活窗口。 SetFocus:要求輸入焦點(diǎn)。 GetFocus:獲取當(dāng)前具有輸入焦點(diǎn)的CWnd。,(4) 窗口的大小和位置函數(shù) GetWindowPlacement:獲取一個(gè)窗口顯示狀態(tài)及正常、最小化的和最大化的窗口位置 Se
23、tWindowPlacement:設(shè)置一個(gè)窗口顯示狀態(tài)及正常、最小化的和最大化的窗口位置。 MoveWindow:改變CWnd的位置和大小。 SetWindowPos:改變子窗口、彈出式窗口和頂層窗口的大小、位置和次序。 GetWindowRect:獲取CWnd的屏幕坐標(biāo)。 GetClientRect:獲取CWnd客戶區(qū)的大小。,(5)訪問窗口函數(shù) FindWindow:返回由窗口類和窗口名標(biāo)識(shí)的窗口句柄。 GetTopWindow:返回屬于CWnd的第一個(gè)子窗口。 GetParent:獲取CWnd的父窗口。 GetDlgItem:由指定的對話框獲取具有指定ID的控件。 GetDescenda
24、ntWindow:查詢所有的派生窗口,并返回具有指定ID的窗口。 CenterWindow:將一窗口相對于其父窗口中心定位。,(6)更新/繪制函數(shù) GetDC:獲取一個(gè)客戶區(qū)的設(shè)備描述表。 GetWindowDC:獲取整個(gè)窗口的,包括標(biāo)題欄,菜單和滾動(dòng)條的設(shè)備描述表。 ReleaseDC:釋放客戶區(qū)和窗口的設(shè)備描述表。 Invalidate:使整個(gè)客戶區(qū)無效。 ShowWindow:顯示或隱藏窗口。 (7)窗口文本函數(shù) SetWindowText:將窗口的標(biāo)題設(shè)置為指定的文本。 GetWindowText:返回窗口的標(biāo)題。 SetFont:設(shè)置當(dāng)前的字體。 GetFont:獲取當(dāng)前的字體。,(
25、8)滾動(dòng)函數(shù) GetScrollPos:獲取滾動(dòng)條的當(dāng)前位置。 ScrollWindow:卷滾客戶區(qū)的內(nèi)容。 SetScrollPos:設(shè)置一個(gè)滾動(dòng)框的當(dāng)前位置,若指定新位置,則重畫滾動(dòng)條。 (9)菜單函數(shù) GetMen:獲取指向指定菜單的指針。 SetMenu:將菜單設(shè)置為指定的菜單。 HiliteMenuItem:在一頂層菜單上高亮度顯示或除去高亮度顯示。 (10)剪貼板函數(shù) OpenClipboard:打開剪貼板。 GetClipboardOwner:獲取指向剪貼板的當(dāng)前擁有者的指針。 GetOpenCilpboardWindow:獲取指向當(dāng)前剪貼板窗口的指針。,2CFrameWnd類
26、(1)CFrameWnd:SDI應(yīng)用程序的主框架窗口的基類,它是其它框架窗口類的基類。 (2)CMDIFrameWnd:MDI應(yīng)用程序的主框架窗口的基類。 (3)CMDIChildWnd:MDI應(yīng)用程序的文檔框架窗口的基類。 3視圖類 (1)CView:查看文檔數(shù)據(jù)的應(yīng)用程序視圖的基類。 (2)CScrollView:具有滾動(dòng)功能的視圖的基類。從其派生的視圖類可以自動(dòng)實(shí)現(xiàn)滾動(dòng)。 (3)CFormView:從其派生的類用于實(shí)現(xiàn)基于對話模板資源的用戶界面。 (4)CRecordView:提供直接鏈接到ODBC記錄集的表單視圖。 (5)CEditView:包含Windows標(biāo)準(zhǔn)編輯控件的視圖。,4對
27、話框類 由于對話框是一個(gè)特殊窗口,所以該類是從CWnd類中派生出來的。對話框子 層次結(jié)構(gòu)包括通用對話框類CDialog以及支持字體選擇、打印、替換文本等公共對話框子類。 (1)CDialog:所有對話框(模態(tài)或者非模態(tài))的基類。 (2)CCommonDialog:所有通用對話框類的基類。 (3)CFileDialog:打開或保存文件的標(biāo)準(zhǔn)對話框。 (4)CColorDialog:用于選擇顏色的的標(biāo)準(zhǔn)對話框。 (5)CFontDialog:選擇字體的標(biāo)準(zhǔn)對話框。 (6)CPrintDialog:用于打印文件的標(biāo)準(zhǔn)對話框。,5控件類 控件子層次包含若干個(gè)可視控件,使用這些類可建立靜態(tài)文本、命令按鈕
28、、位圖按鈕、列表框、組合框、滾動(dòng)條和編輯框等,這些可視控件為Windows應(yīng)用程序提供了各種輸入和顯示界面。 (1) CStatic:靜態(tài)文本控件窗口。用于標(biāo)注、分隔對話框和窗口中的其他控件。 (2) CButton:按鈕控件窗口。該類為對話框或窗口中的按鈕、檢查框或單選按鈕提供一個(gè)總的接口。 (3)CEdit:編輯控件窗口。編輯控制用于接收用戶的文字輸入。 (4)CScrollBar:滾動(dòng)條控件窗口。該類提供控制條的功能,用做對話框或窗口中的一個(gè)控件,可通過它在某一范圍內(nèi)定位。,(5)CSliderCtrl:滑動(dòng)條控件窗口,包含一個(gè)可移動(dòng)的滑標(biāo),用戶可以移動(dòng)滑標(biāo)選擇一個(gè)值或一個(gè)范圍。 (6)
29、CListBox:列表框控件窗口。列表框用于顯示一組列表項(xiàng),用戶可以進(jìn)行觀察和選擇。 (7)CComboBoxl:組合框控件窗口,它由一個(gè)編輯控制和一個(gè)列表框組成。 (8)CBitmapButton:以位圖而非文字作為標(biāo)題的按鈕。 (9)CAnimateCtrl:動(dòng)畫顯示控件,以Windows標(biāo)準(zhǔn)視頻/音頻格式顯示AVI剪輯。 (10)CTreeCtrl:樹形查看控件,顯示項(xiàng)的層次列表結(jié)構(gòu)。 (11)CListCtrl:管理由圖標(biāo)和標(biāo)簽組成的列表項(xiàng),可以4種方式(圖標(biāo)、小圖標(biāo)、列表和詳細(xì)資料)顯示列表項(xiàng)內(nèi)容。,6.控件欄類 控件欄類為工具條、狀態(tài)條、對話條和分割窗口建立模型,它負(fù)責(zé)管理工具條、
30、狀態(tài)條、對話條的一些成員函數(shù)??刂茥l指的是連接在窗口框架頂部或底部的小窗口。 (1)CControlBox:MFC控件欄的基類。 (2)CToolBar:包含位圖按鈕的工具欄控件窗口。 (3)CStatusBar:狀態(tài)欄控件窗口的基類。 (4)CDialogBar:基于對話框模板資源的控件欄。 (5)CStatusBarCtrl:分成多個(gè)面板的水平窗口,用于顯示應(yīng)用程序和狀態(tài)信息。 (6)CToolBarCtrl:Windows工具欄控件,包含按鈕和可選空間的窗口。,*5.2.5 預(yù)定義的宏,Windows庫中包含了大量支持CObject類及其子類的宏,下面一一講解。 1消息映射宏 Windo
31、ws是一個(gè)消息驅(qū)動(dòng)的操作系統(tǒng),VC提供了與消息有關(guān)的宏,它們是: (1)DECLARE_MESSAGE_MAP(初始化消息映射表); (2)BEGIN_MESSAGE_MAP(開始用戶消息映射); (3)END_MESSAGE_MAP(結(jié)束用戶消息映射)。,2確定對象所屬類的信息的宏 每一個(gè)從CObject派生的類都和一個(gè)對應(yīng)的CRuntimeClass結(jié)構(gòu)相聯(lián)系,在程序運(yùn)行時(shí),用戶可以根據(jù)該結(jié)構(gòu)掌握對象的信息以及該類的基類的信息。另外,通過CObject中的成員函數(shù)IsKindOf可確定某對象是否屬于一個(gè)指定的類或由指定的類派生。 為了使從CObject派生的類的對象能夠在程序運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建
32、, VC匯總提供了動(dòng)態(tài)創(chuàng)建對象的宏,它們是: (1)DECLARE_DYNCREATE (放在類的聲明文件中,聲明動(dòng)態(tài)創(chuàng)建對象); (2)IMPLEMENT_DYNCREATE(放在類的實(shí)現(xiàn)文件中,表明實(shí)現(xiàn)對象的動(dòng)態(tài)創(chuàng)建)。,3實(shí)時(shí)運(yùn)行類結(jié)構(gòu)信息宏 該宏的結(jié)構(gòu)是RUNTIME_CLASS(),在應(yīng)用程序使用該宏,可以在運(yùn)行時(shí)由類“名稱”獲得有關(guān)類結(jié)構(gòu)的信息。方法為通過CObject的成員函數(shù)IsKindOf()來確定。,串行化宏 從一個(gè)文件中讀出或向某一文件中寫入某對象的過程叫串行化。若想使從CObject派生的類可串行化,應(yīng)該按下列步驟使用宏: (1)在從CObject派生的類的定義中使用D
33、ECLARE_SERIAL宏; (2)在從CObject派生的類的實(shí)現(xiàn)文件中使用IMPLEMENT_SERIAL 宏; (3)在從CObject派生類中重載Serialize成員函數(shù)。 MFC 中還包含了許多完成其它功能的宏,如:可用于診斷服務(wù)、異常處理、應(yīng)用信息與管理等,感興趣的讀者可參閱MSDN的說明。,5.3MFC應(yīng)用程序架構(gòu),5.3.1 應(yīng)用程序架構(gòu)的概念 5.3.2 軟件復(fù)用 5.3.3 使用應(yīng)用程序架構(gòu)的好處 5.3.4 一個(gè)基于框架的MFC應(yīng)用程序 *5.3.5 VC程序ClassView的使用方法,5.3.1應(yīng)用程序架構(gòu)的概念,應(yīng)用程序架構(gòu)就是在特定的領(lǐng)域中程序之間的共同結(jié)構(gòu),
34、它是某領(lǐng)域中的程序員,依照共同結(jié)構(gòu)來開發(fā)程序,使得程序之間具有一致性,增加了程序的清晰度,以此來降低程序的設(shè)計(jì)和維護(hù)費(fèi)用。 從應(yīng)用方面講,架構(gòu)就是整個(gè)或部分系統(tǒng)的可復(fù)用設(shè)計(jì),表現(xiàn)為一組抽象組件及其實(shí)例間交互的方法;從目的方面講架構(gòu)就是可被應(yīng)用程序開發(fā)者定制的應(yīng)用骨架。 可以說,一個(gè)應(yīng)用程序架構(gòu)就是一個(gè)可復(fù)用的設(shè)計(jì)組件。它規(guī)定了應(yīng)用程序的體系結(jié)構(gòu),闡明了整個(gè)設(shè)計(jì)、協(xié)作組件之間的依賴關(guān)系、責(zé)任分配和控制流程。應(yīng)用程序架構(gòu)包括應(yīng)用程序的總體組織和全局控制、通訊協(xié)議、同步、數(shù)據(jù)存取,給設(shè)計(jì)元素分配特定功能,設(shè)計(jì)元素的組織,規(guī)模和性能,以及在各個(gè)設(shè)計(jì)方案間進(jìn)行選擇。 MFC就是一種應(yīng)用程序架構(gòu)。,5.3
35、.2 軟件復(fù)用,軟件復(fù)用是指在兩次或多次不同的軟件開發(fā)過程中重復(fù)使用相同或相近軟件元素的過程。軟件元素包括程序代碼、測試用例、設(shè)計(jì)文檔、設(shè)計(jì)過程、需求分析文檔甚至領(lǐng)域知識(shí)。通常,把這種可復(fù)用的元素稱作軟構(gòu)件,可復(fù)用的軟件元素越大,復(fù)用的粒度越大。不管是多大粒度的復(fù)用,它們都是軟件復(fù)用。 根據(jù)復(fù)用的程度,可以將軟件復(fù)用分為以下幾類: (1)源代碼復(fù)用。該方式是應(yīng)用最為廣泛的復(fù)用方式,它不僅表現(xiàn)在復(fù)用現(xiàn)有 的代碼,例如已經(jīng)開發(fā)完的類、源文件、LIB庫,還表現(xiàn)在每一代碼的實(shí)現(xiàn)過程中。 (2)模塊復(fù)用。典型的例子是Windows下的動(dòng)態(tài)鏈接庫程序DLL當(dāng)前模塊復(fù)用比較活躍的技術(shù)有COM組件技術(shù),每個(gè)C
36、OM組件有自己的屬性和操作,是一個(gè)相對獨(dú)立運(yùn)行的實(shí)體,使用該技術(shù)構(gòu)造應(yīng)用程序就像是搭積木一樣,搞清楚每個(gè)程序這個(gè)“建筑”有哪些積木塊組成。,(3)接口復(fù)用。在一個(gè)程序定義好一套接口,而另一個(gè)應(yīng)用程序可以依據(jù)這套接口來詳細(xì)設(shè)計(jì),接口復(fù)用在VC下表現(xiàn)為一些類的虛函數(shù)。微軟的Visual Studio的IDE編程、IE擴(kuò)展編程、屏幕保護(hù)程序等都是接口復(fù)用的例子。接口的定義使得軟件的開發(fā)可以擴(kuò)展到用戶一級(jí),由用戶進(jìn)行軟件功能的深化或定制。 (4)應(yīng)用程序復(fù)用。在一個(gè)應(yīng)用程序中調(diào)用另一個(gè)程序,創(chuàng)建一個(gè)新的進(jìn)程就是應(yīng)用程序復(fù)用的典型例子。在Win32平臺(tái)下,一般通過CreateProcess這個(gè)API函數(shù)
37、和SHELL方面的API函數(shù)ShellExecute來創(chuàng)建新的進(jìn)程。 (5)應(yīng)用程序架構(gòu)復(fù)用。 MFC就是實(shí)現(xiàn)了一種應(yīng)用程序架構(gòu)復(fù)用的類庫。,5.3.3使用應(yīng)用程序架構(gòu)的好處,應(yīng)用程序架構(gòu)本質(zhì)上是一種軟件高層次復(fù)用,它可以在具有相似需求的多個(gè)系統(tǒng)中得到復(fù)用,這比代碼級(jí)的復(fù)用具有更大的意義。 通過對應(yīng)用程序架構(gòu)抽象可以使設(shè)計(jì)者能夠?qū)σ恍┙?jīng)過時(shí)間證明是非常有效的體系結(jié)構(gòu)進(jìn)行復(fù)用,從而保證新的軟件開發(fā)能夠成功,提高軟件開發(fā)的效率。在軟件設(shè)計(jì)過程中,我們常常會(huì)發(fā)現(xiàn),對一個(gè)體系結(jié)構(gòu)部件進(jìn)行抽象就可以將它應(yīng)用到其它的設(shè)計(jì)中,從而降低設(shè)計(jì)的復(fù)雜度。 應(yīng)用程序架構(gòu)有利于形成完整的軟件生產(chǎn)線和軟件工廠,并共享公
38、共的架構(gòu),應(yīng)用程序架構(gòu)的可復(fù)用性使得我們可以使用第三方應(yīng)用程序架構(gòu)。,5.3.4一個(gè)基于框架的MFC應(yīng)用程序,【例5-1】利用MFC編寫基于框架結(jié)構(gòu)的應(yīng)用程序。 1生成程序框架 在VC的集成開發(fā)環(huán)境下選擇“File|New.”,并在“Projects”選項(xiàng)卡中選擇“Win32 Application”,在項(xiàng)目名稱Project Name編輯框中輸入“MfcHello”,路徑Location編輯框中輸入一個(gè)工程所存放的路徑(如e:vcpp)后,單擊“OK”按鈕后,出現(xiàn)“Win32 Application-Step 1 of 1”對話框。選擇生成一個(gè)空工程后(An Empty project)并按
39、下“Finish”按鈕。 2在工程MfcHello添加hello.h頭文件,再次使用“File|New.”,并在“Files”選項(xiàng)卡中選擇“C/C+ Header File”,在文件名File編輯框中輸入“Hello”,路徑Location使用缺省路徑,完后按“OK”按鈕,就在當(dāng)前的工程MfcHello中添加了一個(gè)頭文件hello.h。 編輯該頭文件的內(nèi)容如下: class CMyApp : public CWinApp public: virtual BOOL InitInstance (); /超載的虛擬函數(shù) ; class CMainWindow : public CFrameWnd p
40、ublic: CMainWindow (); /構(gòu)造函數(shù) protected: afx_msg void OnPaint (); /WM_PAINT的消息響應(yīng)函數(shù) DECLARE_MESSAGE_MAP () /聲明消息映射;,3在工程MfcHello添加實(shí)現(xiàn)文件hello.cpp 再次使用“File|New.”,并在“Files”選項(xiàng)卡中選擇“C+ Source File”,在文件名File編輯框中輸入“Hello”,路徑Location使用缺省路徑,完后按“OK”按鈕,就在當(dāng)前的工程MfcHello中添加了一個(gè)C+實(shí)現(xiàn)文件hello.cpp。 編輯該實(shí)現(xiàn)文件的內(nèi)容如下: #include #include Hello.h CMyApp TheApp; /由應(yīng)用程序類實(shí)例化一個(gè)對象 BOOL CMyApp:InitInstance () m_pMainWnd = new CMainWindow; /m_pMain
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高職院校內(nèi)部督導(dǎo)體系建設(shè)中的師生互動(dòng)與溝通機(jī)制
- 電動(dòng)交通與綠色能源轉(zhuǎn)型的融合發(fā)展路徑
- 創(chuàng)新性融資方式對非遺傳承的推動(dòng)作用
- 廣東省寶塔實(shí)驗(yàn)2025屆八上物理期末質(zhì)量檢測試題含解析
- 云南省蒙自市2024-2025學(xué)年八年級(jí)物理第一學(xué)期期末達(dá)標(biāo)檢測模擬試題含解析
- 九江市重點(diǎn)中學(xué)2025屆數(shù)學(xué)七上期末聯(lián)考模擬試題含解析
- 餐飲店轉(zhuǎn)讓及員工激勵(lì)機(jī)制合同范本
- 中國鐵路運(yùn)輸行業(yè)噪聲控制標(biāo)準(zhǔn)化建設(shè)實(shí)踐經(jīng)驗(yàn)分享
- 電信行業(yè)服務(wù)質(zhì)量提升策略研究
- 中國信息通信研究院-算力中心服務(wù)商分析報(bào)告(2025年)
- 眼科醫(yī)院感染制度與規(guī)程
- 透析病人營養(yǎng)不良的護(hù)理
- 充電樁項(xiàng)目實(shí)施過程中的質(zhì)量保證措施
- T-CPUMT 025-2024 工業(yè)互聯(lián)網(wǎng)平臺(tái) 服務(wù)通.用要求
- 2025年度地質(zhì)勘探監(jiān)理服務(wù)合同范本
- 保山隆陽區(qū)小升初數(shù)學(xué)試卷
- 2025年上半年北京市西城區(qū)教委事業(yè)單位公開招聘考試筆試易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- RoHS知識(shí)培訓(xùn)課件
- 2024-2025學(xué)年北京西城區(qū)高一(上)期末語文試卷(含答案)
- 2025年貴州貴旅集團(tuán)雷山文化旅游產(chǎn)業(yè)發(fā)展有限責(zé)任公司招聘筆試參考題庫附帶答案詳解
- 2024年初升高數(shù)學(xué)銜接教材講義
評(píng)論
0/150
提交評(píng)論