第八講應(yīng)用程序設(shè)計基礎(chǔ)v_第1頁
第八講應(yīng)用程序設(shè)計基礎(chǔ)v_第2頁
第八講應(yīng)用程序設(shè)計基礎(chǔ)v_第3頁
第八講應(yīng)用程序設(shè)計基礎(chǔ)v_第4頁
第八講應(yīng)用程序設(shè)計基礎(chǔ)v_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、MFC編程基礎(chǔ)知識l 本章內(nèi)容主要包括利用面向?qū)ο蟮挠^點理解MFC,利用繼承思想講解MFC中的具有層次關(guān)系的類、應(yīng)用程序架構(gòu)與軟件復(fù)用,建立最簡單的具有圖形用戶界面的MFC應(yīng)用程序。l 要求了解工作區(qū)的ClassView視圖中的各個菜單的含義、一些可視對象中的可視成分在圖形界面中的表現(xiàn),能夠利用MSDN查看各個類之間的繼承圖,掌握MFC中類的抽象性、封裝性和繼承性,熟練掌握建立最簡單的具有圖形用戶界面的MFC應(yīng)用程序的方法。教學要點l 引子:一個簡單的MFC示例l 1 MFC 概述 l 2 MFC的層次結(jié)構(gòu)及其子類功能簡介 l 3 MFC應(yīng)用程序架構(gòu) 概述 VC開發(fā)應(yīng)用程序的最常用的模式就是利

2、用MFC進行Win32應(yīng)用程序的設(shè)計。 MFC就是利用面向?qū)ο蟮乃枷?,將Windows大部分API函數(shù)封裝起來的一個浩瀚的類庫,利用MFC編寫程序本質(zhì)上就是選擇該類庫中合適的類,并調(diào)用其下相應(yīng)成員函數(shù)來完成某個功能。雖然MFC編程相對于API編程簡單了,但掌握卻并不容易。 學習MFC入門困難的原因(1)MFC采用的是C+語言,對C+本身的技術(shù)沒有掌握。因此想學好MFC,必須把C+的基礎(chǔ)內(nèi)容搞清楚;(2)MFC龐大的類庫中類的命名及成員變量或成員函數(shù)的命名沒有清楚,其實很簡單,MFC中的類及其成員的命名都采用的是匈牙利命名法,把這些名字的英文直接翻譯過來,就知道它是什么意思。(3)MFC編程,首

3、先生成的是一個應(yīng)用程序架構(gòu),對這個架構(gòu)的不了解導(dǎo)致生成的代碼不知其為何如此。本章就是要給大家一個架構(gòu)的概貌;(4)傳統(tǒng)的API編程的步驟統(tǒng)統(tǒng)不見了, 使人們不知道編寫的Windows程序什么時候建立起來 、什么時候消亡. 事實上,MFC的應(yīng)用程序架構(gòu)把類似于API編程所要求的步驟都隱藏了,都封裝到架構(gòu)中了對于初學者,只需要清楚自己的代碼往什么地方添加就可以(5)缺乏面向?qū)ο蠓治瞿芰?。面向?qū)ο蟮姆治鲆蟾闱宄粋€系統(tǒng)中有哪些類、各個類之間有哪些聯(lián)系,尤其是在編寫基于文檔/視圖結(jié)構(gòu)的應(yīng)用程序時。該方面能力的培養(yǎng)要靠多分析一些程序中類之間的關(guān)系,并要參考相關(guān)方面的書籍介紹。 本章把MFC類庫中的主要

4、類以層次結(jié)構(gòu)做了一個簡單的介紹,并對MFC應(yīng)用程序的架構(gòu)做了描述。對于MFC應(yīng)用程序的學習,剛開始要“不求甚解”,懂得代碼的放置以及原理就可以了,隨著學習的深入,在查看MFC源代碼后,就能逐漸了解到該類型應(yīng)用程序的執(zhí)行流程,從而最終掌握MFC應(yīng)用程序的開發(fā)。建立直觀的映像:一個MFC示例類視圖類視圖資源視圖資源視圖文件視圖文件視圖l 例子8-2-1 采用MFC框架 采用CDC 繪制圖形 繪制圖像1MFC概述l 1.1 什么是MFCl 1.2 MFC的設(shè)計原理l 1.3 MFC的目標l *1.4 MFC的發(fā)展l *1.5 使用C+和MFC的好處1.1 什么是MFC MFC是Microsoft F

5、oundation Class(微軟基礎(chǔ)類庫)的縮寫。 從物理角度看,它是一個龐大的類庫、包含可控制計算機系統(tǒng)方方面面的類庫,它對應(yīng)的是Windows系統(tǒng)目錄下的一系列mfc*.dll文件;從邏輯角度看,它是一個面向?qū)ο蟮膽?yīng)用程序框架,程序員可以使用這一框架創(chuàng)建Windows應(yīng)用程序。 MFC的組織是以C+類的層次形式組織在一起,幾個高層類提供一般功能,而低層類實現(xiàn)更具體的功能,每一個低層類都是從高層類派生而來,因此繼承了高層類的功能。 MFC處理很多與Windows相關(guān)的常見任務(wù),例如在后臺做消息處理以及對消息進行路由選擇,無需程序員在每一個開發(fā)的Windows應(yīng)用程序中編寫相同的消息處理循

6、環(huán),MFC已經(jīng)實現(xiàn)了這一消息循環(huán),并對大多數(shù)常見的消息提供了易學易用的消息響應(yīng)函數(shù)。例如OnPain()就是CWnd類的一個成員函數(shù),是對WM_PAINT消息進行響應(yīng)的一個虛成員函數(shù)。 除了類的層次外,MFC也提供了一個應(yīng)用程序開發(fā)框架,此框架被稱為文檔/視圖架構(gòu)。1.2 MFC的設(shè)計原理 MFC向軟件開發(fā)者提供一組服務(wù),來協(xié)調(diào)應(yīng)用程序。在很多情況下,MFC在幕后執(zhí)行一系列復(fù)雜的操作,它向程序員提供了更加簡單的編程界面,并可掩蓋Windows API的一些缺點(MFC類的許多成員函數(shù),如MessageBox()中提供了缺省參數(shù),這減輕了程序員編程的負擔)。 MFC采用面向?qū)ο蟮脑O(shè)計方法,將Wi

7、ndows API中的相關(guān)部分組合到C+類或?qū)ο笾?。例如CWnd類封裝了大部分有關(guān)窗口處理的API 函數(shù)。作為編程人員,不必記憶大量API 函數(shù),需要作的只是實例化CWnd類的一個實例,并調(diào)用相應(yīng)的成員函數(shù)即可。1.3 MFC的目標 建立MFC庫的目的是為了簡化Windows應(yīng)用程序的編制,MFC開發(fā)小組的工作是將此目的和程序設(shè)計原理結(jié)合起來。Microsoft在建立MFC庫遵循了一些基本原則,也是他們的設(shè)計目標: (1) 有效簡化編寫Windows應(yīng)用程序的難度,使用C+創(chuàng)建Windows應(yīng)用程序的過程容易和直觀。 (2) 合并已有的Windows的模型和概念。 (3) 確保類庫有足夠的擴展

8、性,以便于加入Windows后續(xù)版本的特性和功能。 (4) 更容易使用Windows API特性。同時采用Windows API的概念、編程風格和函數(shù)名稱。 (5) 用類來封裝Windows API和Windows對象,并按照API的指引完成工作。 (6) 更容易使用一些強大、復(fù)雜功能的抽象概念,如ActiveX、數(shù)據(jù)庫支持、打印等。*1.4 MFC的發(fā)展 微軟于1989年成立了Application Framework開發(fā)小組,開始設(shè)計一個用于建立圖形界面的可移植的C+類庫。AFX(Applicatin Framework的縮寫)面向?qū)ο蟮募夹g(shù)建立一個易于使用并可移植的GUI。然而一年以后,

9、AFX計劃失敗了,其主要原因是AFX開發(fā)小組過于信任面向?qū)ο蟪绦蛟O(shè)計方法的能力,一個純粹抽象的類往往并不實用。 因此,AFX開發(fā)小組轉(zhuǎn)向開發(fā)MFC庫,并將其實現(xiàn)目標從多目標平臺轉(zhuǎn)向?qū)indows API的封裝;他們也不再試圖建立高度抽象的類,而重點在于建立實際可用的類;他們還避開使用復(fù)雜的C+的結(jié)構(gòu)(例如,多重繼承和模板),而)的目的是建立一個單一的類庫,用來簡化Windows、OS/2 Presentation Manager和Apple Macintosh 應(yīng)用程序的開發(fā), 當時,開發(fā)小組希望利用只是使用了一個C+的子集; 另外,他們不再使用抽象的類來隱藏Windows本身 API的細節(jié)

10、,而是使用戶能夠很方便地存取Windows原有的API。這樣做有兩個原因:首先,可以簡化已有的Win16代碼到 MFC庫的轉(zhuǎn)換;其次,確保原有API的所有功能對應(yīng)用程序都是可以使用的,這意味著可以繞過類庫而直接調(diào)用這些 Windows原有的API函數(shù)。 AFX和MFC的另一個區(qū)別是所使用的開發(fā)方法不同,AFX采用是自頂向下的設(shè)計方法,逐步將對象抽象出來并施加到 Windows上;而 MFC庫采用的則是自底向上的設(shè)計方法,也就是說,從MFC的第一個版本開始,它的類就是建立在已有的Windows API 對象基礎(chǔ)上的,這樣就避免了AFX中代碼的超支與浪費。 當讀者使用MFC進行編程時,將會發(fā)現(xiàn)在M

11、FC源程序中有很多包含“AFX”的字符串,如函數(shù)名AfxGetApp(),常量名AFX_IDS_APP_TITLE,數(shù)據(jù)結(jié)構(gòu)名AFX_MSGMAP_ENTRY等等。這些名稱在Windows API函數(shù)中是不存在的,它們是AFX開發(fā)小組遺留的痕跡,而MFC的基本框架正是建筑于這些東西之上,所以MFC多多少少保留了該開發(fā)小組的標志AFX。可見MFC封裝了SDK(軟件開發(fā)工具包)結(jié)構(gòu)、功能及應(yīng)用程序框架內(nèi)部技術(shù)。該應(yīng)用程序框架隱藏過去Windows程序員不得不處理的許多重復(fù)性工作。*1.5 使用C+和MFC的好處 從本書的第一篇,我們已經(jīng)看出了面向?qū)ο蟪绦蛟O(shè)計的好處,如可復(fù)用性、代碼和數(shù)據(jù)緊密地綁定

12、等。類是面向?qū)ο蟪绦蛟O(shè)計的核心概念,程序中不僅可以使用自己建立的類,還可以使用系統(tǒng)所提供的類,一個好的類庫可以大大減少編碼的數(shù)量。MFC成功之處在于,它是一個類庫、一個包羅計算機系統(tǒng)方方面面的類庫、一個集MicroSoft各路軟件高手之大成的類庫。通過從MFC繼承自己所需要的類,可以充分利用基類所具有的各種功能。 MFC將類、類的繼承、動態(tài)約束、類的關(guān)系和相互作用等應(yīng)用程序概念封裝起來,可以使開發(fā)者高效、輕松地建立Windows應(yīng)用程序,而不受設(shè)備限制并且由事件進行驅(qū)動。 MFC具有良好的通用性和可移植性,它定義了應(yīng)用程序的輪廓,并提供了用戶接口的標準實現(xiàn)方法,程序員所要做的工作就是通過VC所

13、提供的各種工具來完成這個工作。2MFC的層次結(jié)構(gòu)及其子類功能簡介 2.1 MFC中類的層次結(jié)構(gòu) 2.2 根類CObject 2.3 應(yīng)用程序體系結(jié)構(gòu)類 2.4 可視對象類 *2.5 預(yù)定義的宏2.1 MFC中類的層次結(jié)構(gòu) MFC是一個包含了超過200個不同類的很龐大的類庫。利用他們,開發(fā)者可以完成許多標準的Windows編程任務(wù),并且可以在應(yīng)用程序中加入許多復(fù)雜的特性。在設(shè)計思想上,MFC將面向?qū)ο蟮姆椒ㄅc事件驅(qū)動結(jié)合得很好,因此要理解龐大的MFC類庫中的常用類的功能,要利用面向?qū)ο蟮乃枷脒M行理解和分析。類的抽象性、封裝性、繼承性和多態(tài)度在你碰到的類中是如何體現(xiàn)的。它封裝了窗口的哪些數(shù)據(jù)成員和

14、方法,哪些類是從這個類中派生出來的,該類中可超載的虛函數(shù)都有哪些(只有搞清虛擬函數(shù)才能搞清多態(tài)性)。 打開MSDN,選中窗口左半部分的“搜索”選項卡,在待搜索的編輯框中輸入“hierarchy chart”后按回車,MSDN就把MFC的層次結(jié)構(gòu)圖顯示在窗口的右半部分。 2.2 根類CObject CObject類是MFC的抽象基類(不能派生對象),是MFC中多數(shù)類和用戶自定義類的根類,它為程序員提供了許多公共操作和基本服務(wù)。主要包括:對象的動態(tài)建立與刪除、序列化(即串行化)的支持、對象診斷輸出、運行時信息以及集合類的兼容等。它的作用是,使得MFC以及基于MFC的應(yīng)用程序更加穩(wěn)固和易于調(diào)試。 2

15、.3應(yīng)用程序體系結(jié)構(gòu)類 1消息映射類CCmdTarget 該類是CObject的子類,是MFC類庫中所有具有消息映射屬性的基類,消息映射規(guī)定了當對象接到命令消息時,應(yīng)調(diào)用哪一個函數(shù)對該消息進行處理。命令消息是來自菜單項、命令按鈕和加速鍵的信息,由CCmdTarget派生出的主框架類包括CView、CWinApp、CDocument、CWnd和CframeWnd都可處理命令消息。程序員若需要一個新類來處理消息時,可以從CCmdTarget派生出一個新類。一般程序員很少從CCmdTarget類中直接派生出新類,而是從其子類CView、CWinApp來派生 2窗口應(yīng)用程序類CWinApp 每一個使用

16、MFC的應(yīng)用程序只能包含一個從CWndApp派生的應(yīng)用程序?qū)ο?,當VC的其它全局對象被構(gòu)造時,這個對象也同時被構(gòu)造,當Windows調(diào)用WinMain()函數(shù)時,產(chǎn)生的對象已經(jīng)有效了。從CWinApp實例化的應(yīng)用程序?qū)ο笫且粋€全局變量,在程序運行中該對象可以與其它對象相互協(xié)調(diào)。 (1)訪問CWinApp對象以及全局函數(shù)。 AfxGetApp:獲得一指向CWinApp對象的指針 AfxGetResourceHabdle: 獲得一應(yīng)用程序資源的句柄。 AfxGetAppName:獲得一指針,它指向一個包含應(yīng)用程序名的字符串。相反,如果有一個指向CWinApp對象的指針,使用m_pszExename

17、可以取得應(yīng)用程序的名稱。(2)CWinApp的公共數(shù)據(jù)成員 m_pszAppName:指定應(yīng)用程序的名稱。 m_nCmdShow:指定窗口最初將如何顯示。 m_pMainWnd:包含一個指針,它指向一個應(yīng)用程序的主窗口。(3)CWinApp的公共成員函數(shù) LoadCursor:調(diào)取光標資源。 LoadStandardCursor:調(diào)取Windows預(yù)定義光標,在windows.h中指定IDC常量。 LoadIcon:調(diào)取一個圖標資源。 LoadStandardIcon:調(diào)取Windows預(yù)定義的圖標,在windows.h中 指定IDI常量。 OpenDocumentFile:框架調(diào)用此函數(shù)打開

18、一個指定的文檔。 (4)CWinApp的可超載的函數(shù) InitApplication:重載以執(zhí)行任何應(yīng)用程序?qū)哟紊系某跏蓟?InitInstance:重載以執(zhí)行Windows對象實例的初始化,諸如建立用戶窗 口對象等。 Run:運行缺省的消息循環(huán),重載該函數(shù)以自定義消息循環(huán)。 OnIdle:重載以執(zhí)行任何應(yīng)用程序指定的空閑時間處理。 PreTranslateMessage:在窗口消息被TranslateMessage()和DispatchMessage()處理之前過濾它們。 (5)CWinApp的保護成員函數(shù) SetDialogBkColor:為對話框和消息框設(shè)置缺省的背景顏色。 Enabl

19、e3dConrtols:允許具有三維外觀的控件。 3應(yīng)用程序線程類CWinThread 該類為線程的基類,CWinApp是從CWinThread派生而來。該對象描述程序線程的執(zhí)行,主線程的執(zhí)行通常由一個CWinApp的派生對象提供。 (1)CWinThread的公共數(shù)據(jù)成員 m_hThread:當前線程的句柄。 m_nThreadID:當前線程的ID值。 m_pMainWnd:指向程序主窗口指針。 (2)CWinThread的公共成員函數(shù) GetMainWnd:獲取一個指向此線程的的主窗口指針。 GetThreadPriority:獲取當前線程的優(yōu)先權(quán)。 ResumeThread:減小一個線程

20、的掛起計數(shù)。 4.文檔/視圖類 文檔對象由文檔模板對象創(chuàng)建,管理應(yīng)用程序的數(shù)據(jù)。視圖對象表示一個窗口的客戶區(qū),它顯示文檔數(shù)據(jù)并允許用戶與之交互。 CDocTemplate類:文檔模板的基類。它負責協(xié)調(diào)文檔、視窗和框架窗口的創(chuàng)建。 CMultiDocTemplate類:多文檔界面(MDI)的文檔模板。 CSingleDocTemplate類:單文檔界面(SDI)的文檔模板。 CDocument:應(yīng)用程序所用文檔的基類。 CView:顯示文檔數(shù)據(jù)的應(yīng)用程序?qū)S靡晥D的基類。2.4 可視對象類 1. 窗口類CWnd CWnd類提供了MFC中所有窗口類的基類。CWnd與Windows窗口有所不同,但他們

21、又是緊密相連的。CWnd對象是由CWnd的構(gòu)造函數(shù)和析構(gòu)函數(shù)建立和取消的,而Windows窗口與此不同,它是Windows的一個結(jié)構(gòu),是由create成員函數(shù)建立的,DestroyWindow函數(shù)破壞Windows窗口而不是破壞對象。 (1)CWnd類的公共數(shù)據(jù)成員 m_hWnd:標識連接到該CWnd對象上的HWND。 (2)CWnd類的初始化函數(shù) Create:創(chuàng)建并初始化與該CWnd對象相聯(lián)系的子窗口。 PreCreateWindow:在建立連接到這個CWnd對象的Windows窗口之前調(diào)用此函數(shù)。GetStyle:返回當前窗口的風格。SubclassWindow:將一個窗口連接給一個CW

22、nd對象并使其通過該CWnd的消息映射傳遞消息。FromHandle:給出一個窗口句柄時,返回一個CWnd對象的指針。GetSafeHand:返回m_hWnd;若此指針為NULL,則返回NULL。(3)CWnd類的窗口狀態(tài)函數(shù)EnableWindow:允許或禁止鼠標和鍵盤輸入。GetActiveWindow:獲取活動的窗口。SetActiveWindow:激活窗口。SetFocus:要求輸入焦點。GetFocus:獲取當前具有輸入焦點的CWnd。(4) 窗口的大小和位置函數(shù)GetWindowPlacement:獲取一個窗口顯示狀態(tài)及正常、最小化的和最大化的窗口位置SetWindowPlacem

23、ent:設(shè)置一個窗口顯示狀態(tài)及正常、最小化的和最大化的窗口位置。MoveWindow:改變CWnd的位置和大小。SetWindowPos:改變子窗口、彈出式窗口和頂層窗口的大小、位置和次序。GetWindowRect:獲取CWnd的屏幕坐標。GetClientRect:獲取CWnd客戶區(qū)的大小。(5)訪問窗口函數(shù)FindWindow:返回由窗口類和窗口名標識的窗口句柄。GetTopWindow:返回屬于CWnd的第一個子窗口。GetParent:獲取CWnd的父窗口。GetDlgItem:由指定的對話框獲取具有指定ID的控件。GetDescendantWindow:查詢所有的派生窗口,并返回具

24、有指定ID的窗口。CenterWindow:將一窗口相對于其父窗口中心定位。(6)更新/繪制函數(shù)GetDC:獲取一個客戶區(qū)的設(shè)備描述表。GetWindowDC:獲取整個窗口的,包括標題欄,菜單和滾動條的設(shè)備描述表。ReleaseDC:釋放客戶區(qū)和窗口的設(shè)備描述表。Invalidate:使整個客戶區(qū)無效。ShowWindow:顯示或隱藏窗口。(7)窗口文本函數(shù)SetWindowText:將窗口的標題設(shè)置為指定的文本。GetWindowText:返回窗口的標題。SetFont:設(shè)置當前的字體。GetFont:獲取當前的字體。(8)滾動函數(shù)GetScrollPos:獲取滾動條的當前位置。Scroll

25、Window:卷滾客戶區(qū)的內(nèi)容。SetScrollPos:設(shè)置一個滾動框的當前位置,若指定新位置,則重畫滾動條。(9)菜單函數(shù)GetMen:獲取指向指定菜單的指針。SetMenu:將菜單設(shè)置為指定的菜單。 HiliteMenuItem:在一頂層菜單上高亮度顯示或除去高亮度顯示。(10)剪貼板函數(shù)OpenClipboard:打開剪貼板。GetClipboardOwner:獲取指向剪貼板的當前擁有者的指針。GetOpenCilpboardWindow:獲取指向當前剪貼板窗口的指針。 2CFrameWnd類 (1)CFrameWnd:SDI應(yīng)用程序的主框架窗口的基類,它是其它框架窗口類的基類。 (2

26、)CMDIFrameWnd:MDI應(yīng)用程序的主框架窗口的基類。 (3)CMDIChildWnd:MDI應(yīng)用程序的文檔框架窗口的基類。 3視圖類 (1)CView:查看文檔數(shù)據(jù)的應(yīng)用程序視圖的基類。 (2)CScrollView:具有滾動功能的視圖的基類。從其派生的視圖類可以自動實現(xiàn)滾動。 (3)CFormView:從其派生的類用于實現(xiàn)基于對話模板資源的用戶界面。 (4)CRecordView:提供直接鏈接到ODBC記錄集的表單視圖。 (5)CEditView:包含Windows標準編輯控件的視圖。 4對話框類 由于對話框是一個特殊窗口,所以該類是從CWnd類中派生出來的。對話框子 層次結(jié)構(gòu)包括

27、通用對話框類CDialog以及支持字體選擇、打印、替換文本等公共對話框子類。(1)CDialog:所有對話框(模態(tài)或者非模態(tài))的基類。(2)CCommonDialog:所有通用對話框類的基類。(3)CFileDialog:打開或保存文件的標準對話框。(4)CColorDialog:用于選擇顏色的的標準對話框。(5)CFontDialog:選擇字體的標準對話框。(6)CPrintDialog:用于打印文件的標準對話框。5控件類 控件子層次包含若干個可視控件,使用這些類可建立靜態(tài)文本、命令按鈕、位圖按鈕、列表框、組合框、滾動條和編輯框等,這些可視控件為Windows應(yīng)用程序提供了各種輸入和顯示界面

28、。 (1) CStatic:靜態(tài)文本控件窗口。用于標注、分隔對話框和窗口中的其他控件。 (2) CButton:按鈕控件窗口。該類為對話框或窗口中的按鈕、檢查框或單選按鈕提供一個總的接口。 (3)CEdit:編輯控件窗口。編輯控制用于接收用戶的文字輸入。 (4)CScrollBar:滾動條控件窗口。該類提供控制條的功能,用做對話框或窗口中的一個控件,可通過它在某一范圍內(nèi)定位。 (5)CSliderCtrl:滑動條控件窗口,包含一個可移動的滑標,用戶可以移動滑標選擇一個值或一個范圍。 (6)CListBox:列表框控件窗口。列表框用于顯示一組列表項,用戶可以進行觀察和選擇。 (7)CComboB

29、oxl:組合框控件窗口,它由一個編輯控制和一個列表框組成。 (8)CBitmapButton:以位圖而非文字作為標題的按鈕。 (9)CAnimateCtrl:動畫顯示控件,以Windows標準視頻/音頻格式顯示AVI剪輯。 (10) CTreeCtrl:樹形查看控件,顯示項的層次列表結(jié)構(gòu)。 (11)CListCtrl:管理由圖標和標簽組成的列表項,可以4種方式(圖標、小圖標、列表和詳細資料)顯示列表項內(nèi)容。6.控件欄類 控件欄類為工具條、狀態(tài)條、對話條和分割窗口建立模型,它負責管理工具條、狀態(tài)條、對話條的一些成員函數(shù)。控制條指的是連接在窗口框架頂部或底部的小窗口。(1)CControlBox:

30、MFC控件欄的基類。(2) CToolBar:包含位圖按鈕的工具欄控件窗口。(3) CStatusBar:狀態(tài)欄控件窗口的基類。(4) CDialogBar:基于對話框模板資源的控件欄。(5)CStatusBarCtrl:分成多個面板的水平窗口,用于顯示應(yīng)用程序和狀態(tài)信息。(6) CToolBarCtrl:Windows工具欄控件,包含按鈕和可選空間的窗口。*2.5 預(yù)定義的宏 Windows庫中包含了大量支持CObject類及其子類的宏,下面一一講解。 1消息映射宏 Windows是一個消息驅(qū)動的操作系統(tǒng),VC提供了與消息有關(guān)的宏,它們是:(1)DECLARE_MESSAGE_MAP(初始化

31、消息映射表);(2)BEGIN_MESSAGE_MAP(開始用戶消息映射);(3)END_MESSAGE_MAP(結(jié)束用戶消息映射)。 2確定對象所屬類的信息的宏 每一個從CObject派生的類都和一個對應(yīng)的CRuntimeClass結(jié)構(gòu)相聯(lián)系,在程序運行時,用戶可以根據(jù)該結(jié)構(gòu)掌握對象的信息以及該類的基類的信息。另外,通過CObject中的成員函數(shù)IsKindOf可確定某對象是否屬于一個指定的類或由指定的類派生。 為了使從CObject派生的類的對象能夠在程序運行時動態(tài)創(chuàng)建, VC匯總提供了動態(tài)創(chuàng)建對象的宏,它們是: (1)DECLARE_DYNCREATE (放在類的聲明文件中,聲明動態(tài)創(chuàng)建

32、對象); (2)IMPLEMENT_DYNCREATE(放在類的實現(xiàn)文件中,表明實現(xiàn)對象的動態(tài)創(chuàng)建)。 3實時運行類結(jié)構(gòu)信息宏 該宏的結(jié)構(gòu)是RUNTIME_CLASS(),在應(yīng)用程序使用該宏,可以在運行時由類“名稱”獲得有關(guān)類結(jié)構(gòu)的信息。方法為通過CObject的成員函數(shù)IsKindOf()來確定。 串行化宏 從一個文件中讀出或向某一文件中寫入某對象的過程叫串行化。若想使從CObject派生的類可串行化,應(yīng)該按下列步驟使用宏:(1)在從CObject派生的類的定義中使用DECLARE_SERIAL宏;(2)在從CObject派生的類的實現(xiàn)文件中使用IMPLEMENT_SERIAL 宏;(3)在

33、從CObject派生類中重載Serialize成員函數(shù)。 MFC 中還包含了許多完成其它功能的宏,如:可用于診斷服務(wù)、異常處理、應(yīng)用信息與管理等,感興趣的讀者可參閱MSDN的說明。3MFC應(yīng)用程序架構(gòu) 3.1 應(yīng)用程序架構(gòu)的概念 3.2 軟件復(fù)用 3.3 使用應(yīng)用程序架構(gòu)的好處 3.4 一個基于框架的MFC應(yīng)用程序 *3.5 VC程序ClassView的使用方法 3.1應(yīng)用程序架構(gòu)的概念 應(yīng)用程序架構(gòu)就是在特定的領(lǐng)域中程序之間的共同結(jié)構(gòu),它是某領(lǐng)域中的程序員,依照共同結(jié)構(gòu)來開發(fā)程序,使得程序之間具有一致性,增加了程序的清晰度,以此來降低程序的設(shè)計和維護費用。 從應(yīng)用方面講,架構(gòu)就是整個或部分系

34、統(tǒng)的可復(fù)用設(shè)計,表現(xiàn)為一組抽象組件及其實例間交互的方法;從目的方面講架構(gòu)就是可被應(yīng)用程序開發(fā)者定制的應(yīng)用骨架。 可以說,一個應(yīng)用程序架構(gòu)就是一個可復(fù)用的設(shè)計組件。它規(guī)定了應(yīng)用程序的體系結(jié)構(gòu),闡明了整個設(shè)計、協(xié)作組件之間的依賴關(guān)系、責任分配和控制流程。應(yīng)用程序架構(gòu)包括應(yīng)用程序的總體組織和全局控制、通訊協(xié)議、同步、數(shù)據(jù)存取,給設(shè)計元素分配特定功能,設(shè)計元素的組織,規(guī)模和性能,以及在各個設(shè)計方案間進行選擇。 MFC就是一種應(yīng)用程序架構(gòu)。3.2 軟件復(fù)用 軟件復(fù)用是指在兩次或多次不同的軟件開發(fā)過程中重復(fù)使用相同或相近軟件元素的過程。軟件元素包括程序代碼、測試用例、設(shè)計文檔、設(shè)計過程、需求分析文檔甚至領(lǐng)

35、域知識。通常,把這種可復(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)在每一代碼的實現(xiàn)過程中。(2)模塊復(fù)用。典型的例子是Windows下的動態(tài)鏈接庫程序DLL當前模塊復(fù)用比較活躍的技術(shù)有COM組件技術(shù),每個COM組件有自己的屬性和操作,是一個相對獨立運行的實體,使用該技術(shù)構(gòu)造應(yīng)用程序就像是搭積木一樣,搞清楚每個程序這個“建筑”有哪些積木塊組成。 (3)接口復(fù)用。在一個程序定

36、義好一套接口,而另一個應(yīng)用程序可以依據(jù)這套接口來詳細設(shè)計,接口復(fù)用在VC下表現(xiàn)為一些類的虛函數(shù)。微軟的Visual Studio的IDE編程、IE擴展編程、屏幕保護程序等都是接口復(fù)用的例子。接口的定義使得軟件的開發(fā)可以擴展到用戶一級,由用戶進行軟件功能的深化或定制。 (4)應(yīng)用程序復(fù)用。在一個應(yīng)用程序中調(diào)用另一個程序,創(chuàng)建一個新的進程就是應(yīng)用程序復(fù)用的典型例子。在Win32平臺下,一般通過CreateProcess這個API函數(shù)和SHELL方面的API函數(shù)ShellExecute來創(chuàng)建新的進程。 (5)應(yīng)用程序架構(gòu)復(fù)用。 MFC就是實現(xiàn)了一種應(yīng)用程序架構(gòu)復(fù)用的類庫。3.3使用應(yīng)用程序架構(gòu)的好處

37、 應(yīng)用程序架構(gòu)本質(zhì)上是一種軟件高層次復(fù)用,它可以在具有相似需求的多個系統(tǒng)中得到復(fù)用,這比代碼級的復(fù)用具有更大的意義。 通過對應(yīng)用程序架構(gòu)抽象可以使設(shè)計者能夠?qū)σ恍┙?jīng)過時間證明是非常有效的體系結(jié)構(gòu)進行復(fù)用,從而保證新的軟件開發(fā)能夠成功,提高軟件開發(fā)的效率。在軟件設(shè)計過程中,我們常常會發(fā)現(xiàn),對一個體系結(jié)構(gòu)部件進行抽象就可以將它應(yīng)用到其它的設(shè)計中,從而降低設(shè)計的復(fù)雜度。 應(yīng)用程序架構(gòu)有利于形成完整的軟件生產(chǎn)線和軟件工廠,并共享公共的架構(gòu),應(yīng)用程序架構(gòu)的可復(fù)用性使得我們可以使用第三方應(yīng)用程序架構(gòu)。3.4一個基于框架的MFC應(yīng)用程序【例8-1】利用MFC編寫基于框架結(jié)構(gòu)的應(yīng)用程序。1生成程序框架 在VC

38、的集成開發(fā)環(huán)境下選擇“File|New.”,并在“Projects”選項卡中選擇“Win32 Application”,在項目名稱Project Name編輯框中輸入“MfcHello”,路徑Location編輯框中輸入一個工程所存放的路徑(如e:vcpp)后,單擊“OK”按鈕后,出現(xiàn)“Win32 Application-Step 1 of 1”對話框。選擇生成一個空工程后(An Empty project)并按下“Finish”按鈕。2在工程MfcHello添加hello.h頭文件 再次使用“File|New.”,并在“Files”選項卡中選擇“C/C+ Header File”,在文件名F

39、ile編輯框中輸入“Hello”,路徑Location使用缺省路徑,完后按“OK”按鈕,就在當前的工程MfcHello中添加了一個頭文件hello.h。 編輯該頭文件的內(nèi)容如下: class CMyApp : public CWinApp public: virtual BOOL InitInstance (); /超載的虛擬函數(shù) ; class CMainWindow : public CFrameWnd public: CMainWindow (); /構(gòu)造函數(shù) protected: afx_msg void OnPaint (); /WM_PAINT的消息響應(yīng)函數(shù) DECLARE_MES

40、SAGE_MAP () /聲明消息映射; 3在工程MfcHello添加實現(xiàn)文件hello.cpp 再次使用“File|New.”,并在“Files”選項卡中選擇“C+ Source File”,在文件名File編輯框中輸入“Hello”,路徑Location使用缺省路徑,完后按“OK”按鈕,就在當前的工程MfcHello中添加了一個C+實現(xiàn)文件hello.cpp。 編輯該實現(xiàn)文件的內(nèi)容如下: #include #include Hello.h CMyApp TheApp; /由應(yīng)用程序類實例化一個對象 BOOL CMyApp:InitInstance () m_pMainWnd = new C

41、MainWindow; /m_pMainWnd是CMyApp的公有數(shù)據(jù)成員,它從類CWinApp繼承而來,存放主窗口的指針 m_pMainWnd-ShowWindow (m_nCmdShow); m_pMainWnd-UpdateWindow (); return TRUE;BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) /開始消息映射 ON_WM_PAINT ()END_MESSAGE_MAP () /結(jié)束消息映射CMainWindow:CMainWindow () /框架窗口的構(gòu)造函數(shù) Create(NULL, The First MFC Applic

42、ation); /創(chuàng)建窗口void CMainWindow:OnPaint () CPaintDC dc (this); CRect rect; GetClientRect (&rect); dc.DrawText (您好!,這是利用MFC開發(fā)的第一個程序, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);4設(shè)置動態(tài)鏈接到MFC類庫 在VC的集成開發(fā)環(huán)境下選擇“Project|Setting.”,彈出“Project Setting” 對話框。在該對話框左方的“General”選項卡中通過組合框 “Microsoft Fou

43、ndation Class”選擇使用MFC類庫的方法為“Use MFC in a Shared DLL(以動態(tài)鏈接庫方式使用MFC)”,該種方式依賴于Windows操作系統(tǒng)目錄下存放的mfc*.dll庫文件。選項“Not Using MFC”代表程序中不使用MFC,“Use MFC in a Static DLL”代表以靜態(tài)方式鏈接到MFC,該方式的優(yōu)點是程序的運行不依賴mfc*.dll文件,但它的代價是可執(zhí)行文件的長度大,而且對內(nèi)存的利用不夠充分。5運行程序 編譯、鏈接并運行該程序,在屏幕上出現(xiàn)了一個顯示信息的具有Windows界面的窗口。它具有可以移動、最大化、最小化等常見的窗口功能。3.5 VC程序ClassView的使用方法 WorkSpac

溫馨提示

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

評論

0/150

提交評論