官术网_书友最值得收藏!

1.3.1 Visual C++編程方法

面向對象是一種重要的程序設計方法,采用這一思想的C++是當今世界上應用最廣泛的編程語言之一。Windows平臺下的C++編程工具首推Microsoft的Visual C++。但是,編寫Windows應用程序只熟悉C++的語法還是遠遠不夠的,還必須掌握微軟基礎類庫(Microsoft Foundation Class,MFC)。

1.面向對象編程

面向對象的程序設計的最根本目的就是使程序員更好地理解和管理龐大而復雜的程序。為此,面向對象的程序設計圍繞真實世界的概念來組織模型,它采用對象來描述問題空間實體。一般認為,對象是包含現實世界物體特征的抽象實體,它反映了系統為之保存的信息和與它交互的能力,是一些屬性和服務的封裝體。在程序設計領域,可以用“對象=數據+作用于這些數據上的操作”這一公式來表示面向對象的編程。

對于面向對象的程序設計,一個對象具有狀態、行為和標識。

·對象的狀態包括它的屬性和這些屬性的當前值。

·對象的行為包括可以進行的操作以及伴隨著的狀態的變化。

·對象的標識用來區別于其他對象。

(1)面向對象

面向對象的核心概念就是通常所說的抽象、封裝、繼承和多態性。

1)抽象

抽象就是忽略一個主題中與當前目標無關的那些方面,以便將注意力更充分地放在與當前目標有關的方面。抽象并不要求了解全部問題,而只選擇其中的一部分。抽象包括兩個方面:一是過程抽象,二是數據抽象。過程抽象中,任何一個明確定義功能的操作都可被使用者簡單地看作單個實體,盡管該操作可能由一系列更低級的操作來完成。數據抽象定義了數據類型以及施加于該類型對象上的操作,并限定對象的值只能通過使用這些操作來查看和修改。

2)封裝

封裝是面向對象的特征之一,是對象和類概念的主要特性。所謂封裝是指隱藏類(class)為支持和實施抽象所作的內部工作的過程,把過程和數據包圍起來,對數據的訪問只能通過已定義的接口進行。類的接口是公有的,它定義了一個類所能完成的功能,而這些接口的實現是私有的或受保護的,它定義了類完成這些功能的具體操作。對于使用這些類的編程者來說,只需要知道類所能完成的功能即可,而不需要知道這些功能具體是如何實現的。

封裝保證了模塊具有較好的獨立性,使得程序維護修改較為容易。對應用程序的修改僅限于類的內部,因而封裝可以將應用程序修改帶來的影響降低到最低限度。

3)繼承

對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類或者子類,而原始類稱為新類的基類或者父類。派生類可以從它的基類那里繼承方法和實例變量,并且它可以修改或增加新的方法使之更適合特殊的需要。繼承性很好地解決了軟件的可重用性問題。比如,所有的Windows應用程序都有一個窗口,它們都可以看作是從一個窗口類派生出來的。但是為實現有的應用程序用于文字處理、有的應用程序卻用于繪圖的目的,當基類派生出了不同的子類后,需為各個子類增加不同的特性。

下面,舉一個使用Visual C++編程的例子。注意,MFC中的CView類封裝了Windows中的自定義視窗控件。圖1-3所示為CView類的繼承結構。

圖1-3 CView類在MFC中的繼承層次

在圖1-3所示中,類CObject是所有的MFC類的基類,其功能有:串行化支持,運行庫信息,對象診斷輸出以及與集合類的兼容等。類CCmdTarget從類CObject直接派生,它是Microsoft基礎類庫的消息映射結構的基類,消息映射將命令和消息傳遞給所編寫的處理成員函數。這里,命令指來自菜單項、命令按鈕和加速鍵的信息。類CWnd提供了MFC中所有窗口類的基本功能,它封裝了Windows中的窗口句柄hWnd。類CView從CWnd直接派生,它提供了用戶自定義視窗的能力,以用于用戶和應用程序間信息交互。

事實上,類CView本身僅提供了特定于編輯控件的32個成員函數,但是,用戶可以通過類CView進行調用的成員函數卻有300多個。這300多個成員函數中的絕大部分由其基類提供,其中CWnd就為CView提供了多達304個成員函數。由于CView類繼承了其他基類的數據和方法,因此,可以通過CView類調用CWnd類中提供的方法來實現對標準Windows窗口的操作。

4)多態性

多態性是面向對象程序設計的重要特性之一。它與前面講過的封裝性和繼承性構成了面向對象程序設計的三大特性。這三大特性是相互關聯的。封裝性是基礎,繼承性是關鍵,多態性是補充,并且多態性必須存在于繼承的環境中。

多態性是指允許不同類的對象對同一消息作出響應,發出同樣的消息被不同類型的對象接收時導致完全不同行為的特性。這里所說的消息主要是指對類的成員函數的調用,而不同行為是指不同的實現。比如同樣的加法,把兩個時間加在一起和把兩個整數加在一起是完全不同的。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好地解決了應用程序中不同類間函數同名的問題。用戶只需發送一般形式的消息,而將所有的實現交給接收消息的對象。對象根據接收到的消息進行相應的操作。

(2)類定義

類是Visual C++中面向對象編程的一個具體實現方式。它集中體現了面向對象編程的各種特性。

類的定義分為說明部分和實現部分。說明部分是用來實現該類成員的說明,包括數據成員說明和成員函數說明(成員函數是用來對數據成員進行操作的);實現部分是對成員函數的定義。概括說來,說明部分將告訴使用者“做什么”,而實現部分告訴使用者“怎么做”。

類定義的一般格式如代碼1-1所示。

代碼1-1類的定義

        Class  <類名>
        {
            private:
                <私有數據成員或成員函數的說明(缺省時為私有)>
            protected:
                <保護數據成員或成員函數的說明>
            public:
                <公共數據成員或成員函數的說明>
        };
        <各個成員函數的實現>

其中:

·public表示類的公有部分,是全局透明的。它的數據成員和成員函數是開放的,既可以由本類的成員函數訪問,也可以由程序的其他部分直接訪問。

·private表示類的私有部分,是完全隱藏的。它只能由本類的成員函數訪問,而不允許程序的其他部分直接訪問。

·protected表示類的保護部分,介于以上兩者之間,是半透明的。它可以由本類的成員函數和派生類的成員函數直接訪問。保護部分主要用于類的繼承。

(3)對象定義

Class定義的是“類”的類型,具有“類”類型的變量稱為類的實例變量,即對象。因此,定義對象之前,一定要先定義好該對象的類。對象的聲明和基本類型的聲明一樣。

1)對象定義的格式

對象定義的格式如下:

        <類名>  <對象名表>

其中,<類名>是特定對象所屬的類的名字,即所定義的對象是屬于該“類”類型的對象。<對象名表>中可以有一個或多個對象名,定義多個對象名時用逗號隔開。<對象名表>中,可以是一般的對象名,也可以是指向對象的指針名,還可以是對象數組名。

2)對象成員的表示方法

一個對象的成員就是該對象的類所定義的成員。對象成員有數據成員和成員函數,其表示方法如下:

        <對象名>.<成員名>

        <對象指針名>-><成員名>

(4)構造函數和析構函數

構造函數和析構函數是在類體中說明的兩種特殊的成員函數。構造函數用于初始化類變量或者分配內存空間。構造函數的定義方法和其他成員函數相同,但是構造函數用類名作函數名,它不能指定返回值類型和顯示返回值。每當該類的對象被創建時,編譯器都將自動調用構造函數初始化創建的對象。一個類可以有很多個構造函數,當然,這些構造函數的形參各不相同。析構函數與構造函數的功能正好相反,當對象要撤銷時,系統將自動調用析構函數來清理對象所占的內存。

2.MFC類

一個完整的Windows應用程序首先必須有用戶界面、窗體、各種對話框、按鈕、菜單等,開發者可以通過調用Windows的API函數來實現這一切,但是API采用的是C語言的標準,用它編寫程序,很多C++的特性(比如繼承、封裝等)就無法實現。Microsoft也提供了C++庫——MFC,它位于任何Windows API之上,能夠使開發者更加高效和輕松地工作。

(1)MFC的特點

MFC是Visual C++軟件的一部分。MFC庫中的所有類形成了建立應用程序的框架,利用這些類可以充分支持Windows應用程序的開發。MFC具有以下特點:

·MFC完整地封裝了Windows的API函數,包括消息、控件、窗口函數、菜單、對話框、圖形設備接口(GDI)、對象鏈接以及多文檔界面(MDI)等。

·MFC減少了大量在編寫Windows程序時必須編寫的代碼。同時,MFC具有良好的通用性和可移植性,提供了所有C++編程的優點。

·MFC借助Application Wizard使開發者擺脫了那些每次都必寫的基本代碼,借助Class Wizard和消息映射使開發者擺脫了定義消息處理時那種混亂和冗長的代碼段。

·MFC利用C++的封裝功能使開發者擺脫了Windows中各種句柄的困擾,他們只需要面對C++中的對象。這樣,開發者可更接近編程語言而遠離系統。

MFC最主要的優勢是它的效率高。

(2)MFC的層次

MFC是很龐大的,其包含了大約200個不同的類。利用它們,開發者可以完成各種標準的Windows編程任務。在設計思想上,MFC將面向對象的方法和事件驅動結合得非常好。但在一般的應用程序中,不需要使用所有的類。事實上,開發者可能只需要使用十多個MFC中的類就可以編寫一個非常漂亮的程序。下面著重介紹一下MFC中最常用的幾個類。

1)文檔類

文檔類用來構建應用程序的框架,它的根是CCmdTarget類。它為客戶定義的文檔提供了大量的操作,比如Open、Close、Save等。文檔類主要應用于文檔數據的存儲、調出以及修改。文檔類包括CDocument、CDocItem、CDocTemplate,還有一些它們的子類,使用戶能對文檔數據進行查詢、編輯和修改。

2)視圖類

視圖類由CView以及它的子類組成。CView類繼承自CWnd。CView類是可以在窗口中創建的子窗口,它可以提供一個特殊的、能接收外來輸入的結構窗口。CView類包含了常見的一些可視化編輯控件,如CScrollView、CCtrlView、CEditView、CTreeView、CListView。CView類廣泛地應用于基于文檔的應用程序中,它的許多操作都是和文檔相關的,比如拖動滾動條時,看到的文檔或圖像對應部分的滾動。一個視圖只能分配給一個文檔,但是一個文檔可以擁有多個視圖。

3)框架窗口類

框架窗口類為開發者提供創建應用窗體的方法,可以建立單文檔與多文檔兩種窗體。

MFC為單文檔界面(Single Document Interface,SDI)、多文檔界面(Multiple Document Interface,MDI)準備了CframeWnd、CMDIFrameWnd、CMDIChildWnd等幾個類。開發基于文檔的應用程序時,框架窗口即通過這些類來實現。

4)對話框類

對話框類主要用于創建及操作各種各樣的模態和非模態對話框,其包含了通用對話框類CDialog以及支持類,包括選擇顏色、選擇字體、查找/替換等通用對話框。CDialog類也是繼承自CWnd。

5)控件類

控件類包括常見的Windows控件,這些控件包括靜態文本、命令按鈕、位圖按鈕、列表框、組合框、編輯控件等。

6)繪圖類及繪圖對象類

Windows中所有圖形化的輸出都是繪制在設備環境(Device Context,DC)的區域內。繪圖類以及繪圖對象類包括設備環境類與它的一些派生類,提供了諸如字體、顏色、畫線、畫圓、填充等繪圖操作,繪圖對象中所包含的類用于模型化繪圖對象,如畫筆、刷子、字體、位圖和調色板等。

7)文件服務類

該類提供了各種用于處理文件的類。常用的文件服務類是CFile類及其派生類,它們控制普通文件的I/O操作,比如讀/寫文件、重命名及刪除等。

8)其他類

MFC還有異常處理、特殊結構(List、Array和Map)、網絡服務(WinSock)、對象鏈接和嵌入(OLE)、數據庫(ODBC、DAO)的一些專用類。

為了建立一個MFC應用程序,開發者應該學會直接使用這些類,而且通常需要從這些類中繼承新的類。在繼承的類中,開發者可以建立新的成員函數,以適應開發需要。

3.程序框架

(1)幾種文件類型

在Visual C++中,應用程序是以Project(工程)的形式存在的,工程文件以.dsp為擴展名。擴展名為.dsw的文件稱為Workspace(工作空間)文件。在Workspace文件中可包含多個Project,由Workspace文件對它們進行統一協調和管理。

在應用程序中,大量應用的是以.h和.cpp為擴展名的文件。其中以.h為擴展名的文件稱為頭文件,主要包含的是類的定義。以.cpp為擴展名的文件稱為實現文件,主要包含的是類成員函數的實現代碼。

在應用程序中經常要使用一些位圖、菜單之類的資源,Visual C++中以.rc為擴展名的文件稱為資源文件,里面包含了應用程序中要用的所有的Windows資源。

(2)應用程序框架

Windows程序設計方式是一種完全不同于傳統DOS方式的程序設計方式,它是一種事件驅動的程序設計方式。在程序提供給用戶的界面中,有許多可操作的可視對象。用戶從所有可能的操作中任意選擇,被選擇的操作會產生某些特定的事件,這些事件發生后的結果是向程序中的某些對象發送消息,然后這些對象調用相應的消息處理函數來完成特定的操作。

Windows應用程序的最大特點就是程序沒有固定的流程,只是針對某個事件的處理有特定的子流程,Windows應用程序就是由許多這樣的子流程構成的。

從上面的討論中可以看出,Windows應用程序在本質上是面向對象的。程序提供給用戶界面的可視對象在程序的內部一般也是一個對象,用戶對可視對象的操作通過事件驅動模式觸發相應對象的可用方法。程序的運行過程就是用戶的外部操作不斷產生事件,這些事件又被相應的對象處理的過程。

Windows程序工作原理如圖1-4所示。

圖1-4 Windows程序工作原理

我們所要建立的MFC應用程序毫無疑問是Windows操作系統環境下的應用程序,但是MFC應用程序又有自己的特點。因為MFC為應用程序做了大量的工作,而且MFC也為應用程序建立了大量的類,所以我們也有一個MFC建立應用程序的框架,如圖1-5所示。

圖1-5 MFC應用程序框架

圖1-5所示中給出了使用MFC方式的應用程序的4個主要類之間的關系,從圖中可以看出:

·CMYAPP類:主要的作用是用來處理消息,它統一管理程序收到的所有消息,然后把消息分配到相應的對象。

·CMAINFRAME類:是CMYVIEW的父類,使各種視窗VIEW顯示在主框窗MAINFRAME的客戶區中。

·CMYVIEW類:作用是顯示數據,數據的來源是類CMYDOC。在MFC程序中,程序的數據放在文檔中,而顯示數據則是利用視窗方式。

·CMYDOC類:作用是管理數據,通過CMYVIEW類和用戶進行交互并對所管理數據進行操作。

使用過傳統的Windows編程方法的人都知道,在應用程序中有一個重要的函數WINMAIN(),這個函數是應用程序的基礎,用戶的操作所產生的消息正是經過這個函數進行處理后,再派送到對應的對象中進行進一步處理的。

然而,基于MFC開發的應用程序中,用來處理消息的是系統自動生成的MFC中的CWINAPP類的派生類CMYAPP,由這個類來完成WINMAIN()所完成的工作。CMYAPP執行窗口注冊等標準服務,然后再調用應用程序對象中的成員函數來初始化和運行應用程序。

在MFC應用程序設計中,我們所要做的工作主要是設計自己需要的類,編寫并處理相關的消息和事件,并將其添加到應用程序中去。

(3)文檔、視圖和框架

文檔/視圖結構是Visual C++中使用MFC開發基于文檔的應用程序的基本框架。在這個框架中,數據的維護及顯示分別由兩個不同但又彼此緊密相關的類——文檔類和視圖類來負責,而框架窗口則是視窗的包容器。框架的核心是文檔和視圖。一個文檔是一個數據對象,用戶編輯過程中與這個數據對象進行交互。數據是由File菜單中的New或Open命令創建的,一般都保存在一個文件中。一個視圖是一個窗口對象,用戶通過這個窗口對象與一個文檔進行交互。

在文檔/視圖結構中,文檔的任務是對數據進行管理和維護,數據被保存在文檔類的成員變量中。文檔通過一個稱為串行化(Serialize)的過程將數據保存到磁盤文件或數據庫中。MFC類庫為數據的串行化提供了默認的支持,只需要在此基礎中稍加修改,就可以為自定義的文檔類提供串行化支持。文檔類還可以處理命令消息。這里所謂的命令消息是指來自如菜單、工具欄按鈕和加速鍵的WM_COMMAND通知消息。除了WM_COMMAND外,文檔不能處理其他的Windows消息。

視圖類在文檔和用戶之間起中介作用。視圖可以直接或間接地訪問文檔類中的成員變量,它從文檔類中(而不是從存儲介質中)將文檔中的數據取出來,并在屏幕上顯示出來。同時,它可以接收用戶的輸入,并接受用戶的修改,通過調用文檔和視圖的接口將修改的信息反饋給文檔類。實際的數據更新仍然是由文檔來完成的。

每一個文檔可以有多個視圖類的成員函數,但每個視圖只能對應于一個確定的文檔。也就是說,視圖是文檔的不同表現形式。可見,文檔/視圖模式總的工作方式是:視圖把文檔中的數據以特定的方式顯示于計算機屏幕上,用戶通過與視圖的交互來查看數據并對數據進行修改。然后,視圖通過相關聯的文檔類的成員函數將經過修改的數據傳遞給文檔對象。文檔對象獲得修改過的數據后,對其進行必要的修改,最后保存到永久介質(如磁盤文件)中。

文檔/視圖模型的一個重要機制是文檔、視圖及框架的關聯性,三者互相協調,互相包含指向對方的指針。這種關聯是通過一種稱為文檔模板的類來完成的。

程序開始運行時,將調用CMYAPP類InitInstance成員函數來完成程序的一系列初始化工作,其中一段程序如代碼1-2所示。

代碼1-2框架程序的初始化

        CsingleDocTemplate *pDocTemplate;
        pDocTemplate=new CSingleDocTemplate(
            IDR_MAINFRAME,
            RUNTIME_CLASS (CMySDIDoc),
            RUNTIME_CLASS (CMainFrame),
            RUNTIME_CLASS (CMySDIView));
        AddDocTemplate(pDocTemplate);

CSingleDocTemplate類即單文檔模板類,它首先定義了一個單文檔模板類的指針,然后動態創建一個單文檔模板類的實例,該實例中將特定的文檔類(CMySDIDoc)、視圖類(CMySDIView)和框架類(CMainFrame)綁定在一起,最后調用AddDocTemplate()函數,將這個模板實例添加到應用程序的文檔模板列表中。

主站蜘蛛池模板: 鹤庆县| 武隆县| 友谊县| 建水县| 赤城县| 旌德县| 兰溪市| 中牟县| 黎平县| 岫岩| 金秀| 筠连县| 正安县| 齐河县| 临朐县| 金门县| 莆田市| 海盐县| 衡南县| 开化县| 蕉岭县| 肇州县| 临漳县| 芒康县| 丰城市| 密山市| 安多县| 义马市| 阜新| 婺源县| 泸西县| 乌恰县| 丽水市| 襄樊市| 萍乡市| 长春市| 西昌市| 东城区| 宁化县| 景德镇市| 汝州市|