- Visual C++數(shù)字圖像模式識(shí)別技術(shù)詳解
- 馮偉興 唐墨 賀波等編著
- 9019字
- 2018-12-31 15:10:04
2.1 Visual C++編程方法
面向?qū)ο笫且环N重要的程序設(shè)計(jì)方法,采用這一思想的C++是當(dāng)今世界上應(yīng)用最廣泛的編程語(yǔ)言。Windows平臺(tái)下的C++編程工具首推Microsoft的Visual C++。但是,編寫Windows應(yīng)用程序只熟悉C++的語(yǔ)法還是遠(yuǎn)遠(yuǎn)不夠的,還必須掌握MFC(Microsoft Foundation Class,微軟基礎(chǔ)類庫(kù))。
面向?qū)ο蟮木幊淌钱?dāng)前程序設(shè)計(jì)中的熱門話題,這里將介紹使用Visual C++進(jìn)行面向?qū)ο缶幊虝r(shí)用到的一些關(guān)鍵概念,這些概念是進(jìn)一步學(xué)習(xí)和應(yīng)用Visual C++的必備知識(shí)。
2.1.1 面向?qū)ο缶幊?/h3>
面向?qū)ο蟮某绦蛟O(shè)計(jì)的根本目的就是使程序員更好地理解和管理龐大而復(fù)雜的程序。為此,面向?qū)ο蟮某绦蛟O(shè)計(jì)圍繞真實(shí)世界的概念來(lái)組織模型,它采用對(duì)象來(lái)描述問(wèn)題空間實(shí)體。一般認(rèn)為,對(duì)象是包含現(xiàn)實(shí)世界物體特征的抽象實(shí)體,反映了系統(tǒng)為之保存信息和與之交互的能力,是一些屬性和服務(wù)的封裝體,在程序設(shè)計(jì)領(lǐng)域,可以用“對(duì)象=數(shù)據(jù)+作用于這些數(shù)據(jù)上的操作”這一公式來(lái)表達(dá)。
對(duì)于面向?qū)ο蟮某绦蛟O(shè)計(jì),一個(gè)對(duì)象具有“狀態(tài)”、“行為”和“標(biāo)識(shí)”。
■對(duì)象的狀態(tài)包括它的屬性和這些屬性的當(dāng)前值。
■對(duì)象的行為包括可以進(jìn)行的操作以及伴隨著的狀態(tài)的變化。
■對(duì)象的標(biāo)識(shí)用來(lái)區(qū)別于其他對(duì)象。
1.面向?qū)ο?/span>
面向?qū)ο蟮暮诵母拍罹褪峭ǔKf(shuō)的“抽象”、“封裝”、“繼承”和“多態(tài)”。
(1)抽象
抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便將注意力更充分地放在與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問(wèn)題,而只是選擇其中的一部分。抽象包括兩個(gè)方面,一是過(guò)程抽象,二是數(shù)據(jù)抽象。過(guò)程抽象是指任何一個(gè)明確定義功能的操作都可被使用者簡(jiǎn)單地看作單個(gè)實(shí)體,盡管該操作可能由一系列更低級(jí)的操作來(lái)完成。數(shù)據(jù)抽象定義了數(shù)據(jù)類型以及施加于該類型對(duì)象上的操作,并限定對(duì)象的值只能通過(guò)使用這些操作來(lái)查看和修改。
(2)封裝
封裝是面向?qū)ο蟮奶卣髦唬菍?duì)象和類概念的主要特性。所謂封裝是指隱藏類(class)為支持和實(shí)施抽象所作的內(nèi)部工作的過(guò)程,把過(guò)程和數(shù)據(jù)包圍起來(lái),對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的接口。類的接口是公有的,它定義了一個(gè)類所能完成的功能,而這些接口的實(shí)現(xiàn)是私有的或受保護(hù)的,它定義了類完成這些功能所作的具體操作。對(duì)于使用這些類的編程者來(lái)說(shuō),只需要知道類所能完成的功能,而不需要知道這些功能具體是如何實(shí)現(xiàn)的。
封裝保證了模塊具有較好的獨(dú)立性,使得程序維護(hù)修改較為容易。對(duì)應(yīng)用程序的修改僅限于類的內(nèi)部,因而可以將應(yīng)用程序修改帶來(lái)的影響減少到最低限度。
(3)繼承
對(duì)象的一個(gè)新類可以從現(xiàn)有的類中派生,這個(gè)過(guò)程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類或者子類,而原始類稱為新類的基類或者父類。派生類可以從它的基類那里繼承方法和實(shí)例變量,并且它可以修改或增加新的方法使之更適合特殊的需要。繼承性很好地解決了軟件的可重用性問(wèn)題。比如,所有的Windows應(yīng)用程序都有一個(gè)窗口,它們可以看作都是從一個(gè)窗口類派生出來(lái)的。但是有的應(yīng)用程序用于文字處理,有的應(yīng)用程序卻用于繪圖,這就是因?yàn)榛惻缮隽瞬煌淖宇悾鱾€(gè)子類增加了不同的特性。
下面,舉一個(gè)使用Visual C++編程的例子,考慮MFC中的CView類,它封裝了Windows中的自定義視窗控件。圖2-1顯示了CView類的繼承結(jié)構(gòu)。

圖2-1 Cview類在MFC中的繼承層次
圖中,類CObject是所有的MFC類的根類,其功能包括:串行化支持,運(yùn)行庫(kù)信息,對(duì)象診斷輸出以及與集合類的兼容等。類CCmdTarget從類CObject直接派生,它是Microsoft基礎(chǔ)類庫(kù)的消息映射結(jié)構(gòu)的基類,消息映射將命令和消息傳遞給所編寫的處理成員函數(shù)。這里,命令指來(lái)自菜單項(xiàng),命令按鈕和加速鍵的信息。類CWnd提供了MFC中所有窗口類的基本功能,它封裝了Windows中的窗口句柄hWnd。類CView從CWnd直接派生,它提供用戶自定義視窗的能力,用于用戶和應(yīng)用程序間的信息交互。
事實(shí)上,類CView本身僅提供了特定于編輯控件的32個(gè)成員函數(shù),但是,用戶可以通過(guò)類CView進(jìn)行調(diào)用的成員函數(shù)卻多達(dá)300多個(gè)。這300多個(gè)成員函數(shù)中的絕大部分由其基類所提供,其中CWnd就為CView提供了多達(dá)304個(gè)成員函數(shù)。由于CView類繼承了其他基類的數(shù)據(jù)和方法,因此,可以通過(guò)CView類調(diào)用CWnd類中提供的方法來(lái)實(shí)現(xiàn)對(duì)標(biāo)準(zhǔn)Windows窗口的操作。
(4)多態(tài)性
多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特性之一。它與前面講過(guò)的封裝性和繼承性構(gòu)成了面向?qū)ο蟪绦蛟O(shè)計(jì)的三大特性。這三大特性是相互關(guān)聯(lián)的。封裝性是基礎(chǔ),繼承性是關(guān)鍵,多態(tài)性是補(bǔ)充,并且多態(tài)性必須存在于繼承的環(huán)境中。
多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出相應(yīng),發(fā)出同樣的消息被不同類型的對(duì)象接收時(shí)導(dǎo)致完全不同的行為。這里所說(shuō)的消息主要是指對(duì)類的成員函數(shù)的調(diào)用,而不同行為是指不同的實(shí)現(xiàn)。比如同樣的加法,把兩個(gè)時(shí)間加在一起和把兩個(gè)整數(shù)加在一起是完全不同的。多態(tài)性語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好地解決了應(yīng)用程序中不同類間函數(shù)同名的問(wèn)題。用戶只需發(fā)送一般形式的消息,而將所有的實(shí)現(xiàn)交給接收消息的對(duì)象。對(duì)象根據(jù)接收到的消息進(jìn)行相應(yīng)的操作。
2.類定義
類是Visual C++中面向?qū)ο缶幊痰囊粋€(gè)具體實(shí)現(xiàn)方式。它集中體現(xiàn)了面向?qū)ο缶幊痰母鞣N特性。
類的定義格式分為說(shuō)明部分和實(shí)現(xiàn)部分。說(shuō)明部分是用來(lái)說(shuō)明該類的成員,包括數(shù)據(jù)成員說(shuō)明和成員函數(shù)說(shuō)明。成員函數(shù)是用來(lái)對(duì)數(shù)據(jù)成員進(jìn)行操作的。實(shí)現(xiàn)部分是對(duì)成員函數(shù)的定義。概括說(shuō)來(lái),說(shuō)明部分將告訴使用者“做什么”,而實(shí)現(xiàn)部分告訴使用者“怎么做”。
類的一般定義格式如下。
代碼2-1 類的定義
Class <類名> { private: <私有數(shù)據(jù)成員或成員函數(shù)的說(shuō)明(默認(rèn)時(shí)為私有)> protected: <保護(hù)數(shù)據(jù)成員或成員函數(shù)的說(shuō)明> public: <公共數(shù)據(jù)成員或成員函數(shù)的說(shuō)明> }; <各個(gè)成員函數(shù)的實(shí)現(xiàn)>
其中,各關(guān)鍵字含義如下:
■public表示類的公有部分,是全局透明的。它的數(shù)據(jù)成員和成員函數(shù)是開(kāi)放的,既可以由本類的成員函數(shù)訪問(wèn),也可以由程序的其他部分直接訪問(wèn)。
■private表示類的私有部分,是完全隱藏的。它只能由本類的成員函數(shù)訪問(wèn),而不允許程序的其他部分直接訪問(wèn)。
■protected表示類的保護(hù)部分,介于以上兩者之間,是半透明的。它可以由本類的成員函數(shù)和派生類的成員函數(shù)直接訪問(wèn)。保護(hù)部分主要用于類的繼承性。
3.對(duì)象定義
Class定義的是“類”類型,具有“類”類型的變量稱為類的實(shí)例變量,即對(duì)象。因此,定義對(duì)象之前,一定要先定義好該對(duì)象的類。對(duì)象的聲明和基本類型的聲明一樣。
(1)對(duì)象定義
對(duì)象定義的格式如下:
<類名><對(duì)象名表>
其中,<類名>是特定對(duì)象所屬的類的名字,即所定義的對(duì)象是屬于該“類”類型的對(duì)象。<對(duì)象名表>中可以有一個(gè)或多個(gè)對(duì)象名,定義多個(gè)對(duì)象名時(shí)用逗號(hào)分隔。<對(duì)象名表>中,可以是一般的對(duì)象名,也可以是指向?qū)ο蟮闹羔樏€可以是對(duì)象數(shù)組名。
(2)對(duì)象成員的表示方法
一個(gè)對(duì)象的成員就是該對(duì)象的類所定義的成員。對(duì)象成員有數(shù)據(jù)成員和成員函數(shù),其表示方法如下:
<對(duì)象名>.<成員名>
或
<對(duì)象指針名>-><成員名>
4.構(gòu)造函數(shù)和析構(gòu)函數(shù)
構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中說(shuō)明的兩種特殊的成員函數(shù)。構(gòu)造函數(shù)用于初始化類變量或者分配內(nèi)存空間。構(gòu)造函數(shù)的定義方法和其他成員函數(shù)相同,但是構(gòu)造函數(shù)用類名作函數(shù)名,它不能指定返回類型和顯示返回值。每當(dāng)該類的對(duì)象被創(chuàng)建時(shí),編譯器都將自動(dòng)調(diào)用構(gòu)造函數(shù)初始化創(chuàng)建的對(duì)象。一個(gè)類可以有很多個(gè)構(gòu)造函數(shù),當(dāng)然,這些構(gòu)造函數(shù)的形參各不相同。析構(gòu)函數(shù)與構(gòu)造函數(shù)的功能正好相反,當(dāng)對(duì)象要撤銷的時(shí)候,系統(tǒng)將自動(dòng)調(diào)用析構(gòu)函數(shù)來(lái)清理對(duì)象所占的內(nèi)存。
2.1.2 MFC類
一個(gè)完整的Windows應(yīng)用程序首先必須有用戶界面、窗體、各種對(duì)話框、按鈕、菜單等,開(kāi)發(fā)者可以通過(guò)調(diào)用Windows的API函數(shù)來(lái)實(shí)現(xiàn)這一切,但是API采用的是C的標(biāo)準(zhǔn),用它編寫程序,就無(wú)從發(fā)揮很多C++的特性,比如繼承、封裝等。Microsoft也提供了C++庫(kù),它位于任何Windows API之上,能夠使開(kāi)發(fā)者更加高效和輕松地工作,這就是MFC。
1.MFC的特點(diǎn)
MFC是Visual C++軟件的一部分。MFC庫(kù)中的所有類形成了建立應(yīng)用程序的框架,利用這些類可以充分支持Windows應(yīng)用程序的開(kāi)發(fā)。MFC具有以下特點(diǎn):
■MFC完整地封裝了Windows的API函數(shù)。包括消息、控件、窗口函數(shù)、菜單、對(duì)話框、圖形設(shè)備接口(GDI)、對(duì)象鏈接以及多文檔界面(MDI)等。
■MFC減少了大量在編寫Windows程序時(shí)必須編寫的代碼。同時(shí),MFC具有良好的通用性和可移植性,具有了所有C++編程的優(yōu)點(diǎn)。
■MFC借助Application Wizard使開(kāi)發(fā)者擺脫了那些每次都必寫的基本代碼,借助Class Wizard和消息映射使開(kāi)發(fā)者擺脫了定義消息處理時(shí)那種混亂和冗長(zhǎng)的代碼段。
■MFC利用C++的封裝功能使開(kāi)發(fā)者擺脫Windows中各種句柄的困擾,只需要面對(duì)C++中的對(duì)象。這樣,使開(kāi)發(fā)者更接近編程語(yǔ)言而遠(yuǎn)離系統(tǒng)。
MFC最主要的優(yōu)勢(shì)是它的效率高。
2.MFC的層次
MFC是很龐大的,包含了大約200個(gè)不同的類。利用這些類,開(kāi)發(fā)者可以完成各種標(biāo)準(zhǔn)的Windows編程任務(wù)。在設(shè)計(jì)思想上,MFC將面向?qū)ο蠓椒ê褪录?qū)動(dòng)結(jié)合得非常好。但在一般的應(yīng)用程序中,不需要使用所有的類。事實(shí)上,開(kāi)發(fā)者可能只需要使用十多個(gè)MFC中的類就可以建立一個(gè)非常漂亮的程序。下面著重介紹一下MFC中最常用的幾種類。
(1)文檔類
文檔類用來(lái)構(gòu)建應(yīng)用程序的框架,它的根是CCmdTarget類。它為客戶定義的文檔提供了大量的操作,比如Open、Close、Save等。文檔類主要應(yīng)用于文檔數(shù)據(jù)的存儲(chǔ)、調(diào)出以及修改。文檔類包括CDocument、CDocItem、CDocTemplate,以及它們的子類,使用戶能對(duì)文檔數(shù)據(jù)進(jìn)行查詢、編輯和修改。
(2)視圖類
視圖類由CView及其子類組成。CView類繼承自CWnd。CView類是可以在窗口中創(chuàng)建的子窗口,它可以提供一個(gè)特殊的接收外來(lái)輸入的結(jié)構(gòu)窗口。CView類包含了常見(jiàn)的一些可視化編輯控件,如CScrollView、CCtrlView、CEditView、CTreeView、CListView。CView類廣泛地應(yīng)用于基于文檔的應(yīng)用程序中,它的許多操作都是和文檔相關(guān)的,比如拖動(dòng)滾動(dòng)條時(shí),實(shí)際上是看到文檔或圖像對(duì)應(yīng)的部分在滾動(dòng)。一個(gè)視圖只能分配給一個(gè)文檔,但是一個(gè)文檔可以擁有多個(gè)視圖。
(3)框架窗口類
框架窗口類為開(kāi)發(fā)者提供創(chuàng)建應(yīng)用窗體的方法,可以建立單文檔(Single Document Interface,SDI)與多文檔(MultipleDocument Interface,MDI)兩種窗體。
SDI是單文檔界面,就是同一時(shí)間只能打開(kāi)一個(gè)文檔;MDI則是多文檔界面,同時(shí)能打開(kāi)多個(gè)文檔。MFC為它們準(zhǔn)備了CFrameWnd,CMDIFrameWnd,CMDIChildWnd等幾個(gè)類。開(kāi)發(fā)基于文檔的應(yīng)用程序時(shí),框架窗口即通過(guò)這些類來(lái)實(shí)現(xiàn)。
(4)對(duì)話框類
主要用于創(chuàng)建及操作各種各樣的模態(tài)和非模態(tài)對(duì)話框,包含了通用對(duì)話框類CDialog以及支持類,包括選擇顏色、選擇字體、打印、查找/替換等通用對(duì)話框。CDialog類也是繼承自CWnd。
(5)控件類
控件類包括常見(jiàn)的Windows控件,這些控件包括靜態(tài)文本、命令按鈕、位圖按鈕、列表框、組合框、編輯控件等。
(6)繪圖類及繪圖對(duì)象類
Windows中所有圖形化的輸出都是繪制在稱為設(shè)備環(huán)境(Device Context,DC)的區(qū)域內(nèi)。繪圖類及繪圖對(duì)象類包括設(shè)備環(huán)境類(CDC)與它的一些派生類,提供了諸如字體、顏色、畫線、畫圓、填充等繪圖操作,繪圖對(duì)象中所包含的類用于模型化繪圖對(duì)象,如畫筆、刷子、字體、位圖和調(diào)色板等。
(7)文件服務(wù)類
該類提供了各種用于處理文件的類。常用的文件服務(wù)類是CFile類及其派生類,它們控制普通文件的I/O操作,比如讀/寫文件,重命名及刪除等。
(8)其他類
MFC還有異常處理、特殊結(jié)構(gòu)(List、Array和Map)、網(wǎng)絡(luò)服務(wù)(WinSock)、對(duì)象鏈接和嵌入(OLE)、數(shù)據(jù)庫(kù)(ODBC、DAO)的一些專用類。
為了建立一個(gè)MFC應(yīng)用程序,開(kāi)發(fā)者應(yīng)該學(xué)會(huì)直接使用這些類,而且通常需要從這些類中繼承新的類。在繼承的類中,開(kāi)發(fā)者可以建立新的成員函數(shù),以適應(yīng)開(kāi)發(fā)需要。
2.1.3 程序框架
1.幾種文件類型
在Visual C++中,應(yīng)用程序是以Project(工程)的形式存在的,工程文件以dsp為擴(kuò)展名。其次,擴(kuò)展名為dsw的文件稱為Workspace(工作空間)文件。在Workspace文件中可包含多個(gè)Project,由Workspace文件對(duì)它們進(jìn)行統(tǒng)一協(xié)調(diào)和管理。
在應(yīng)用程序中,大量應(yīng)用的是以h和cpp為擴(kuò)展名的文件。其中以h為擴(kuò)展名的文件被稱為頭文件,主要包含的是類的定義。以cpp為擴(kuò)展名的文件被稱為實(shí)現(xiàn)文件,主要包含的是類成員函數(shù)的實(shí)現(xiàn)代碼。
在應(yīng)用程序中經(jīng)常要使用一些位圖、菜單之類的資源,Visual C++中以rc為擴(kuò)展名的文件被稱為資源文件,里面就包含了應(yīng)用程序中所有要用的Windows資源。
2.應(yīng)用程序框架
Windows程序設(shè)計(jì)是一種完全不同于傳統(tǒng)的DOS方式的程序設(shè)計(jì)方法,它是一種事件驅(qū)動(dòng)方式的程序設(shè)計(jì)方式。在程序提供給用戶的界面中有許多可操作的可視對(duì)象。用戶從所有可能的操作中任意選擇,被選擇的操作會(huì)產(chǎn)生某些特定的事件,這些事件發(fā)生后的結(jié)果是向程序中的某些對(duì)象發(fā)生消息,然后這些對(duì)象調(diào)用相應(yīng)的消息處理函數(shù)來(lái)完成特定的操作。
Windows應(yīng)用程序的最大特點(diǎn)就是程序沒(méi)有固定的流程,只是針對(duì)某個(gè)事件的處理有特定的子流程,Windows應(yīng)用程序就是由許多這樣的子流程構(gòu)成的。
可以看出,Windows應(yīng)用程序在本質(zhì)上是面向?qū)ο蟮摹3绦蛱峁┙o用戶界面的可視對(duì)象在程序的內(nèi)部一般也是一個(gè)對(duì)象,用戶對(duì)可視對(duì)象的操作通過(guò)事件驅(qū)動(dòng)模式觸發(fā)相應(yīng)對(duì)象的可用方法。程序的運(yùn)行過(guò)程就是用戶的外部操作不斷產(chǎn)生事件,這些事件又被相應(yīng)的對(duì)象處理的過(guò)程。
Windows程序工作原理如圖2-2所示。
我們所要建立的MFC應(yīng)用程序毫無(wú)疑問(wèn)是Windows操作系統(tǒng)環(huán)境下的應(yīng)用程序,但是MFC應(yīng)用程序又有自己的特點(diǎn)。因?yàn)镸FC為應(yīng)用程序做了大量的工作,而且MFC也為應(yīng)用程序建立了大量的類,所以我們也有一個(gè)MFC建立應(yīng)用程序的框架。如圖2-3所示。

圖2-2 Windows程序工作原理

圖2-3 MFC應(yīng)用程序框架
圖2-3中給出了使用MFC方式的應(yīng)用程序的4個(gè)主要類之間的關(guān)系。
■CMYAPP類:主要的作用是用來(lái)處理消息,它統(tǒng)一管理程序收到的所有消息,然后把消息分配到相應(yīng)的對(duì)象。
■CMAINFRAME類:是CMYVIEW的父類,使各種視窗VIEW顯示在主框窗MAINFRAME的客戶區(qū)中。
■CMYVIEW類:作用是顯示數(shù)據(jù),數(shù)據(jù)的來(lái)源是類CMYDOC。在MFC程序中,程序的數(shù)據(jù)是放在文檔當(dāng)中的,而顯示數(shù)據(jù)則是利用視窗方式。
■CMYDOC類:作用是管理數(shù)據(jù),通過(guò)CMYVIEW類和用戶進(jìn)行交互并對(duì)所管理數(shù)據(jù)進(jìn)行操作。
使用過(guò)傳統(tǒng)的Windows編程方法的人都知道,在應(yīng)用程序中有一個(gè)重要的函數(shù)WINMAIN(),這個(gè)函數(shù)是應(yīng)用程序的基礎(chǔ),用戶的操作所產(chǎn)生的消息正是經(jīng)過(guò)這個(gè)函數(shù)進(jìn)行處理后,再派送到對(duì)應(yīng)的對(duì)象中進(jìn)行進(jìn)一步處理的。
然而,基于MFC開(kāi)發(fā)的應(yīng)用程序中,用來(lái)處理消息的是系統(tǒng)自動(dòng)生成的MFC中的CWINAPP類的派生類CMYAPP,由這個(gè)類來(lái)完成WINMAIN()所完成的工作。CMYAPP執(zhí)行窗口注冊(cè)等標(biāo)準(zhǔn)服務(wù),然后再調(diào)用應(yīng)用程序?qū)ο笾械某蓡T函數(shù)來(lái)初始化和運(yùn)行應(yīng)用程序。
在MFC應(yīng)用程序設(shè)計(jì)中,開(kāi)發(fā)者所要做的工作主要就是設(shè)計(jì)自己需要的類,編寫并處理相關(guān)的消息和事件,并將其添加到應(yīng)用程序中去。
3.文檔、視圖和框架
文檔/視圖結(jié)構(gòu)是Visual C++中使用MFC開(kāi)發(fā)基于文檔的應(yīng)用程序的基本框架。在這個(gè)框架中,數(shù)據(jù)的維護(hù)及其顯示,分別由兩個(gè)不同但又彼此緊密相關(guān)的類-文檔類和視圖類來(lái)負(fù)責(zé),而框架窗口則是視窗的包容器。框架的核心是文檔和視圖。一個(gè)文檔是一個(gè)數(shù)據(jù)對(duì)象,用戶編輯過(guò)程中與這個(gè)數(shù)據(jù)對(duì)象進(jìn)行交互。數(shù)據(jù)是由FILE菜單中的New或Open命令創(chuàng)建的,一般都保存在一個(gè)文件中。一個(gè)視圖是一個(gè)窗口對(duì)象,用戶通過(guò)這個(gè)窗口對(duì)象與一個(gè)文檔進(jìn)行交互。
在文檔/視圖結(jié)構(gòu)中,文檔的任務(wù)是對(duì)數(shù)據(jù)進(jìn)行管理和維護(hù),數(shù)據(jù)被保存在文檔類的成員變量中。文檔通過(guò)一個(gè)稱為串行化(serialize)的過(guò)程將數(shù)據(jù)保存到磁盤文件或數(shù)據(jù)庫(kù)中。MFC類庫(kù)為數(shù)據(jù)的串行化提供了默認(rèn)的支持,只需要在此基礎(chǔ)上稍加修改,就可以為自定義的文檔類提供串行化支持。文檔類還可以處理命令消息。這里所謂的命令消息是指來(lái)自如菜單、工具欄按鈕和加速鍵的WM_COMMAND通知消息。除了WM_COMMAND外,文檔不能處理其他的Windows消息。
視圖類在文檔和用戶之間起中介作用。視圖可以直接或間接地訪問(wèn)文檔類中的這些成員變量,它從文檔類中(而不是從存儲(chǔ)介質(zhì)中)將文檔中的數(shù)據(jù)取出來(lái),然后在屏幕上顯示文檔的數(shù)據(jù)。同時(shí),它可以接收用戶的輸入,并接受用戶的修改,通過(guò)調(diào)用文檔和視圖的接口將修改的信息反饋給文檔類。實(shí)際的數(shù)據(jù)更新仍然是由文檔來(lái)完成的。
每一個(gè)文檔可以有多個(gè)視圖類的成員函數(shù),但每個(gè)視圖只能對(duì)應(yīng)于一個(gè)確定的文檔。也就是說(shuō),視圖是文檔的不同表現(xiàn)形式。可見(jiàn),文檔/視圖模式總的工作方式是:視圖把文檔中的數(shù)據(jù)以特定的方式顯示于計(jì)算機(jī)屏幕上,用戶通過(guò)與視圖的交互來(lái)查看數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行修改。然后,視圖通過(guò)相關(guān)聯(lián)的文檔類的成員函數(shù)將經(jīng)過(guò)修改的數(shù)據(jù)傳遞給文檔對(duì)象。文檔對(duì)象獲得修改過(guò)的數(shù)據(jù)之后,對(duì)其進(jìn)行必要的修改,最后保存到永久介質(zhì)(如磁盤文件)中。
文檔/視圖模型的一個(gè)重要機(jī)制是文檔、視圖及框架的關(guān)聯(lián)性,三者互相協(xié)調(diào),互相包含指向?qū)Ψ降闹羔槨_@種關(guān)聯(lián)是通過(guò)一種稱作文檔模板的類來(lái)完成的。
程序開(kāi)始運(yùn)行時(shí),將調(diào)用CMYAPP類InitInstance成員函數(shù)來(lái)完成程序的一系列初始化工作,其中有這樣一段程序:
代碼2-2 框架程序的初始化
CsingleDocTemplate *pDocTemplate; pDocTemplate=new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS (CMySDIDoc), RUNTIME_CLASS (CMainFrame), RUNTIME_CLASS (CMySDIView)); AddDocTemplate(pDocTemplate);
CSingleDocTemplate類即單文檔模板類,它首先定義了一個(gè)單文檔模板類的指針,然后動(dòng)態(tài)創(chuàng)建一個(gè)單文檔模板類的實(shí)例,該實(shí)例中將特定的文檔類(CMySDIDoc)、視圖類(CMySDIView)和框架類(CMainFrame)綁定在一起,最后調(diào)用AddDocTemplate函數(shù),將這個(gè)模板實(shí)例添加到應(yīng)用程序的文檔模板列表中。
2.1.4 集成開(kāi)發(fā)環(huán)境
Visual C++首先是一種程序設(shè)計(jì)語(yǔ)言,同時(shí)也是一個(gè)集成開(kāi)發(fā)工具,它提供了自動(dòng)生成軟件代碼和可視化資源編輯的功能。Visual C++是Windows環(huán)境下最主要的面向?qū)ο髴?yīng)用開(kāi)發(fā)環(huán)境之一,使用Visual C++可以靈活地開(kāi)發(fā)從底層軟件到上層直接面向用戶的軟件。“只有想不到,沒(méi)有做不到”是程序員對(duì)Visual C++的評(píng)價(jià),而Visual C++也就此成為了專業(yè)程序員的首選編程工具。
在開(kāi)始Visual C++程序設(shè)計(jì)之前,首先對(duì)開(kāi)發(fā)平臺(tái)即Visual C++ 6.0的集成開(kāi)發(fā)環(huán)境(Integrated Development Environment,IDE)有一個(gè)了解。
在Developer Studio啟動(dòng)之后,就會(huì)看到一個(gè)窗口。該窗口中每個(gè)區(qū)域都有其特定的用途。如圖2-4所示。

圖2-4 Visual C++工作界面
1.工作區(qū)
首次啟動(dòng)Visual C++時(shí),在Developer Studio的左側(cè)有一塊區(qū)域,占去一大塊面積,卻沒(méi)有顯示什么內(nèi)容,這就是工作區(qū)(Workspace)。通過(guò)它可以用以下3種不同的方法來(lái)查看應(yīng)用程序的各個(gè)部分。
■Class View(類視圖):用戶可以通過(guò)它在C++類的層次上找到并操作源代碼,它提供了應(yīng)用程序中所有類的整體結(jié)構(gòu)框圖,例如可以找到某一個(gè)類,定位到定義該類的位置,修改它的成員和方法。
■Resource View(資源視圖):用戶可以通過(guò)它在應(yīng)用程序中找到并編輯各種資源,包括對(duì)話框、圖標(biāo)和菜單的設(shè)計(jì)等。
■File View(文件視圖):用戶可以通過(guò)它查看構(gòu)成應(yīng)用程序的各個(gè)文件并確定它們的位置,進(jìn)行代碼編寫工作。
2.輸出窗格
輸出窗格(Output Pane)是Developer Studio向用戶提供信息的地方,這些信息包括編譯程序的進(jìn)展說(shuō)明、警告及出錯(cuò)信息。
3.編輯區(qū)
編輯區(qū)(Editor Area)位于Developer Studio的右邊區(qū)域。它是Visual C++中進(jìn)行一切編輯工作的區(qū)域,當(dāng)編輯C++的源代碼時(shí)將在這里顯示代碼編輯窗;當(dāng)設(shè)計(jì)對(duì)話框時(shí),窗口繪制器也在此顯示。另外,當(dāng)設(shè)計(jì)應(yīng)用程序使用圖標(biāo)時(shí),編輯區(qū)又將顯示圖標(biāo)繪制器。編輯區(qū)基本上就是Developer Studio的全部區(qū)域,不能被窗格、菜單或工具欄所占據(jù)。
4.菜單欄
菜單欄(Menu Bar)是Windows應(yīng)用程序必不可少的要素之一,它由File、Edit、View、Insert、Project、Build和Tools等組成,每個(gè)菜單又由多個(gè)選項(xiàng)構(gòu)成。
(1)File菜單
File菜單選項(xiàng)中最主要的是【New】選項(xiàng)。選中【New】選項(xiàng)將打開(kāi)【New】對(duì)話框,如圖2-5所示。

圖2-5 【New】選項(xiàng)
利用【Files】選項(xiàng)卡可以實(shí)現(xiàn)各種類型普通文件的創(chuàng)建,而各種類型普通文件的用途如表2-1所示。
表2-1 普通文件用途
【Projects】選項(xiàng)卡可以創(chuàng)造各種類型Visual C++工程文件。而各種類型工程文件的用途如表2-2所示。
表2-2 工程文件用途
【W(wǎng)orkspaces】選項(xiàng)卡可以創(chuàng)建新的工作區(qū)。
(2)Edit菜單
通過(guò)Edit菜單可以對(duì)已經(jīng)創(chuàng)建的工程中的有關(guān)文件進(jìn)行編輯加工。
(3)View菜單
View菜單中的命令主要用來(lái)改變窗口和工具欄的顯示方式、檢測(cè)源代碼、激活調(diào)試時(shí)所用的各個(gè)窗口等,它主要由【Class Wizard】、【Resource Includes】、【W(wǎng)orkspace】、【Output】、【Debug Windows】等一系列選項(xiàng)組成。
【ClassWizard】是編寫MFC應(yīng)用程序的專用工具,其中常用的是【Message Maps】和【Member Variables】選項(xiàng)卡。
■【Message Maps】選項(xiàng)卡:把消息映射到與窗口、對(duì)話框、控件、菜單選項(xiàng)和快捷鍵有關(guān)的處理函數(shù),創(chuàng)建或刪除消息處理函數(shù),查看已經(jīng)擁有的消息處理函數(shù)的消息并跳轉(zhuǎn)到相應(yīng)的處理代碼中去。
■【Member Variable】選項(xiàng)卡:用于增加或刪除變量,或增加新的類收集并驗(yàn)證輸入到表單視圖(Form View)中的數(shù)據(jù),其中Control IDs是映射到成員變量的控件的ID值,Type是成員變量的類型,Member是成員變量名。
系統(tǒng)默認(rèn)將所有資源符號(hào)保存在“resource.h”文件中。也可以在【Resource Includes】選項(xiàng)中的【Symbol Header file】文本框中自定義新的資源符號(hào)存儲(chǔ)文件。
另外,【W(wǎng)orkspace】選項(xiàng):用來(lái)顯示工作區(qū)窗口。【Output】選項(xiàng):用來(lái)顯示輸出區(qū)窗口。【Debug Windows】選項(xiàng):用來(lái)調(diào)試程序。
(4)Insert菜單:為工程添加新的類(Class)、窗體(Form)和資源(Resource)等內(nèi)容。
(5)Project菜單:創(chuàng)建、修改和保存正在編輯的工程文件。
(6)Build菜單:編譯、建立和執(zhí)行應(yīng)用程序。
(7)Tools菜單:簡(jiǎn)單快速地訪問(wèn)多個(gè)不同的開(kāi)發(fā)工具。
(8)Windows菜單:對(duì)用戶可見(jiàn)窗口的格式進(jìn)行設(shè)置,在各個(gè)窗口之間進(jìn)行切換。
(9)Help菜單:向用戶提供各種幫助選項(xiàng)。
2.1.5 生成多文檔應(yīng)用程序
至此,我們已經(jīng)掌握了使用Visual C++開(kāi)發(fā)程序的基本過(guò)程,下面,將舉一個(gè)利用Visual C++生成多文檔應(yīng)用程序的實(shí)例。這里將用到Visual C++提供的一個(gè)強(qiáng)大工具AppWizard。
【例2-1】簡(jiǎn)單的多文檔應(yīng)用程序
本例題通過(guò)講解如何生成簡(jiǎn)單的多文檔應(yīng)用程序,讓讀者對(duì)Visual C++的集成開(kāi)發(fā)環(huán)境有一個(gè)直觀的認(rèn)識(shí),并了解Visual C++生成多文檔應(yīng)用程序的編程方法,為后續(xù)實(shí)例講解打基礎(chǔ)。
設(shè)計(jì)步驟
[1]選擇【File】|【New】菜單命令,打開(kāi)【New】對(duì)話框;選擇“MFC AppWizard(exe)”工程類型,在【Project Name】域鍵入工程名稱“Demo1”,在【Location】域鍵入工程文件存放位置。其他選項(xiàng)默認(rèn),如圖2-6所示。

圖2-6 【New】對(duì)話框中【Projects】選項(xiàng)卡
[2]單擊【ok】按鈕進(jìn)入【MFC AppWizard Step1】對(duì)話框,工程類型選擇“Multiple Documents”,其他選項(xiàng)默認(rèn),如圖2-7所示。

圖2-7 【MFC AppWizard-Step 1】對(duì)話框
[3]單擊【Next】按鈕進(jìn)入【MFC AppWizard-Step 2 of6】對(duì)話框,這里需要決定在應(yīng)用程序中是否需要數(shù)據(jù)庫(kù)支持,這里選擇“None”,如圖2-8所示。

圖2-8 【MFC AppWizard-Step 2 of6】對(duì)話框
[4]單擊【Next】按鈕進(jìn)入單擊【MFC AppWizard-Step 3 of6】按鈕,這里需要決定在應(yīng)用程序中是否需要OLE支持。添加的OLE支持越多,應(yīng)用程序就越大。最基本的OLE支持層次是用作容器(Container)。容器既可以作為客戶,又可以存儲(chǔ)鏈接對(duì)象和嵌入對(duì)象。這里選擇“None”,其他默認(rèn),如圖2-9所示。
[5]單擊【Next】按鈕進(jìn)入【MFC AppWizard-Step 4 of6】對(duì)話框,這里上半部分需要選擇應(yīng)用程序中要包含的界面元素類型,采用默認(rèn)設(shè)置即可。下半部分可以設(shè)置應(yīng)用程序文件列表中列出的最近使用文件的數(shù)目,如圖2-10所示。
[6]圖中有一個(gè)【Advanced】按鈕。單擊這個(gè)按鈕,顯示如圖2-11所示的對(duì)話框。可設(shè)置應(yīng)用程序默認(rèn)打開(kāi)并操作文件的類型。設(shè)置為以“bmp”為文件擴(kuò)展名的位圖文件。
[7]單擊【Next】按鈕,進(jìn)入【MFC AppWizard-Step 5 of6】對(duì)話框,這里需要選擇應(yīng)用程序中界面風(fēng)格,選擇“MFC Standard”;是否在源文件中自動(dòng)生成注釋代碼,選擇“Yes,please”;應(yīng)用MFC類庫(kù)的方式,選擇“As a shared DLL”。如圖2-12所示。

圖2-9 【MFC AppWizard-Step 3 of6】對(duì)話框

圖2-10 【MFC AppWizard-Step 4 of6】對(duì)話框

圖2-11 【Advanced Options】對(duì)話框

圖2-12 【MFC AppWizard-Step 5 of6】對(duì)話框
[8]單擊【Next】按鈕進(jìn)入【MFC AppWizard-Step 6 of6】對(duì)話框,可以指定應(yīng)用程序中自動(dòng)生成的文檔、視圖、框架類的基類。這里選擇默認(rèn)設(shè)置,如圖2-13所示。

圖2-13 【MFC AppWizard-Step 6 of6】對(duì)話框
[9]單擊【Finish】按鈕完成應(yīng)用程序工程文件的建立。
應(yīng)用程序開(kāi)始運(yùn)行時(shí),調(diào)用CDemo1App類InitInstance成員函數(shù)來(lái)完成程序的一系列初始化工作,其中,看到如下代碼:
CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_DEMO1TYPE, RUNTIME_CLASS(CDemo1Doc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CDemo1View)); AddDocTemplate(pDocTemplate);
CMultiDocTemplate類是多文檔模板類,它動(dòng)態(tài)創(chuàng)建一個(gè)多文檔模板類實(shí)例,該實(shí)例將有關(guān)文檔、視圖及框架關(guān)聯(lián)在一起。最后調(diào)用AddDocTemplate函數(shù),將這個(gè)模板實(shí)例添加的程序的文檔模板列表中。
Visual C++中運(yùn)行該應(yīng)用程序的結(jié)果如圖2-14所示。

圖2-14 多文檔應(yīng)用程序運(yùn)行結(jié)果
- LabVIEW Graphical Programming Cookbook
- Rake Task Management Essentials
- Effective Python Penetration Testing
- Hands-On RESTful Web Services with Go
- 網(wǎng)站構(gòu)建技術(shù)
- ASP.NET程序開(kāi)發(fā)范例寶典
- Mastering Apache Storm
- Python+Office:輕松實(shí)現(xiàn)Python辦公自動(dòng)化
- Learning Image Processing with OpenCV
- Hands-On Dependency Injection in Go
- Visual Basic程序設(shè)計(jì)基礎(chǔ)
- INSTANT PLC Programming with RSLogix 5000
- Swift編程實(shí)戰(zhàn):iOS應(yīng)用開(kāi)發(fā)實(shí)例及完整解決方案
- 算法(第4版)
- Xamarin Cross-platform Application Development(Second Edition)