《Visual C++ 6.0程序設計》課件第5章_第1頁
《Visual C++ 6.0程序設計》課件第5章_第2頁
《Visual C++ 6.0程序設計》課件第5章_第3頁
《Visual C++ 6.0程序設計》課件第5章_第4頁
《Visual C++ 6.0程序設計》課件第5章_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章文檔視圖結構5.1文檔視圖結構概述5.2創(chuàng)建文檔/視圖應用程序思考題

5.1文檔視圖結構概述

5.1.1文檔和視圖

文檔與視圖是MFC應用程序的核心。Windows應用程序除了處理數(shù)據(jù)外,還要將數(shù)據(jù)顯示出來。在Windows界面下,數(shù)據(jù)的顯示并非使用cin或cout指令。MFC采用了兩個相互獨立的類:CDocument類(文檔類)和CView類(視圖類)來負責數(shù)據(jù)的存儲與顯示。在文檔-視圖結構中,文檔是應用程序數(shù)據(jù)基本元素的集合,它構成應用程序所使用的數(shù)據(jù)單元。另外它還對數(shù)據(jù)進行管理和維護,通常數(shù)據(jù)被保存在文檔類的成員變量中。文檔是一種數(shù)據(jù)源,數(shù)據(jù)源有很多種,最常見的是磁盤文件,但也可以不是磁盤文件,文檔的數(shù)據(jù)源也可以來自串行口、網(wǎng)絡或攝像機輸入信號等。

文檔類通過一個稱為串行化(serialize)的過程將數(shù)據(jù)保存到磁盤文件或數(shù)據(jù)庫中。MFC類庫為數(shù)據(jù)的串行化提供了默認的支持,只要在此基礎上進行修改,就可以為自定義的文檔類提供串行化支持。文檔類還可以處理命令消息,這些命令消息可以來自菜單、工具欄按鈕和快捷鍵的WM_COMMAND消息。除該類消息外,文檔不能處理其他Windows的消息。視圖是數(shù)據(jù)的用戶窗口,為用戶提供了文檔的可視數(shù)據(jù)顯示,它把文檔的部分或全部內容在窗口中顯示出來。視圖還給用戶提供與文檔中的數(shù)據(jù)交互的界面,它把用戶的輸入轉化為對文檔中數(shù)據(jù)的操作。每個文檔都會有一個或多個視圖顯示,一個文檔可以對應多個視圖,而一個視圖只能對應一個文檔,視圖只負責實現(xiàn)和修改文檔數(shù)據(jù),不負責存儲。視圖像一個用戶接口,將文檔類的數(shù)據(jù)取出來,在屏幕上進行顯示。同時它可以接受用戶的輸入、修改操作,但實際的存儲活動仍然由文檔類完成。另外視圖還可以直接或間接地訪問文檔類中的成員變量,并通過這種方式來顯示和更新數(shù)據(jù)。

VisualC++6.0向用戶提供了兩種基于文檔與視圖類型的應用程序:單文檔界面(SDI)和多文檔界面(MDI)程序。在單文檔界面(SDI)應用程序中,用戶在同一時刻只能操作一個文檔。像Windows下的“記事本”程序就是這樣的例子。在這類應用程序中,打開文檔時會自動關閉當前打開的活動文檔,若文檔修改后尚未保存,會提示是否保存所做的修改。因為一次只能打開一個窗口,所以不像MicrosoftWord那樣需要一個“窗口”菜單。單文檔應用程序一般都提供一個File菜單,在該菜單下有一組命令,用于新建文檔(New)、打開已有文檔(Open)、保存或換名存盤文檔等。這類程序相對比較簡單,常見的應用程序有終端仿真程序和一些工具程序。多文檔界面(MDI)應用程序也能操作文檔,并允許同時操作多個文檔。如MicrosoftWord??梢源蜷_多個文件,可以通過切換窗口激活相應的文檔進行編輯。多文檔應用程序也提供一個File菜單,用于新建、打開、保存文檔。其與單文檔應用程序不同的是,它往往還提供一個關閉(Close)菜單項,用于關閉當前打開的文檔。多文檔應用程序還提供“窗口”菜單,管理所有打開的子窗口,包括對子窗口關閉、層疊、平鋪等。關閉一個窗口時,窗口內的文檔也被自動關閉。5.1.2基本程序結構

文檔/視圖結構是VisualC++6.0語言中使用的MFC開發(fā)應用程序的基本框架。在這個框架中,數(shù)據(jù)的維護及其顯示是由兩個不同但又彼此緊密相關的類——文檔類和視圖類分別負責的。

總的來講,采用文檔與視圖結構的應用程序由以下四個部分組成:

1.文檔類(CDocument)

負責應用程序數(shù)據(jù)的管理。它是所有應用程序文檔類的基類,提供了文檔類所需要的最基本功能實現(xiàn)的手段,為文檔對象與框架窗口對象、視圖對象等的交互提供了基本的框架。

2.視圖類(CView)

負責用戶與文檔之間的交互。它通過一個指向其對應的文檔對象的指針,可以直接或間接地獲取和修改文檔中的數(shù)據(jù)。該指針在視圖類創(chuàng)建時即生成。

3.框架結構類(CFrame)

MFC應用程序使用框架來包括應用程序中的視圖,主框架是應用程序的主窗口,子框架則提供了一個視圖窗口,每個視圖都能在其中運行。此外,框架對象還為應用程序處理菜單、狀態(tài)欄和工具欄,并接受視圖中的命令消息。

4.主應用程序類(CWinApp)

負責啟動程序的運行和處理程序與Windows之間的數(shù)據(jù)交互,它控制所有其他的類。

有了以上文檔與視圖中的四個主要的類,就可以用它們來建立任意類型的Windows程序和框架結構。

通常情況下,視圖通過GetDocument成員函數(shù)獲得指向相關聯(lián)的文檔對象的指針,并通過該指針調用文檔類的成員函數(shù)來從文檔中讀取數(shù)據(jù)。視圖將數(shù)據(jù)顯示在計算機屏幕上,用戶通過與視圖的交互來查看數(shù)據(jù)并對數(shù)據(jù)進行修改。視圖通過相關聯(lián)的文檔類成員函數(shù)將經(jīng)過修改的數(shù)據(jù)傳遞給文檔對象。文檔對象獲得修改過的數(shù)據(jù)后,將其保存到存儲設備中。對數(shù)據(jù)進行讀取、顯示、存儲時,在文檔、視圖和應用程序框架間有一系列復雜的相互作用過程,文檔與視圖間的交互是通過類的公有成員變量和函數(shù)來實現(xiàn)的。5.1.3框架窗口

框架窗口是每個Windows應用程序窗口的“門面”,它容納著視圖窗口,管理和控制應用程序的外觀??蚣艽翱诒旧淼囊恍┏R?guī)操作如最大化/最小化、移動窗口、改變窗口大小等,都是由Windows操作系統(tǒng)自動管理的,而處于框架窗口內的一些界面元素(如工具欄、狀態(tài)欄等)一般由框架窗口類來管理和控制。

每一個基于文檔/視圖結構的應用程序都有一個自己的應用程序窗口,即該程序的最外圍窗口。相應的應用程序圖標、工具欄、狀態(tài)欄等都在此窗口中顯示?;谖臋n/視圖結構的應用程序有單文檔和多文檔之分(這在前面已提到過)。單文檔應用程序(SDI)只有一個框架窗口,該框架窗口也是文檔窗口。視圖類的所有輸出都顯示在這個視圖窗口中,通過窗口的隱藏和疊合,應用程序框架可以將文檔獨立地顯示在另一個視圖類中。即單文檔應用程序可以有多個視圖,但只有一個視圖是當前活動和可視的。

多文檔應用程序(MDI)對于每一個打開的文檔,都在框架窗口內創(chuàng)建一個新的文檔框架窗口。即多文檔應用程序可以有多個視圖對應多個文檔,且各視圖都是可視和活動的。

SDI應用程序的框架窗口是從CFrameWnd類派生的。在創(chuàng)建應用程序框架時,MFC應用程序向導會自動為該程序派生一個應用程序框架窗口類,其缺省名為CMainFrame,相應的文件為“MainFrame.h”和“MainFrame.cpp”。

MDI應用程序的框架窗口類也是CMainFrame類,但它是由CMDIFrameWnd類派生的,不是SDI程序中的CFrameWnd類,其相應的文件也是“MainFrame.h”和“MainFrame.cpp”。而增加的文檔框架窗口類則是由CMDIChildWnd類派生的,其相應的實現(xiàn)文件為“ChildFrm.h”和“ChildFrm.cpp”。通過比較SDI應用程序與MDI應用程序框架窗口類能夠看出,盡管兩者框架窗口類的父類不同,但它們類的函數(shù)接口完全一致,其功能上的不同是隱含實現(xiàn)的。

框架窗口的風格可以通過修改其類中的PreCreateWindow函數(shù)來實現(xiàn)。

應用程序框架窗口類和文檔框架窗口類的主要作用是承擔與文檔無關的一些程序外觀和控制任務,而文檔的維護管理和顯示等任務則是由文檔類和視圖類來實現(xiàn)的。

5.2創(chuàng)建文檔/視圖應用程序

本節(jié)將分別建立基于單文檔(SDI)的應用程序和基于多文檔(MDI)的應用程序。

5.2.1創(chuàng)建單文檔程序

下面介紹一個創(chuàng)建單文檔程序的例子。一個文本編輯軟件,正在編輯的文本文件的內容將顯示在視圖上,用戶將在視圖上對該文件進行編輯和修改。用戶對當前文件的任何編輯和修改都會反映到文檔的修改上。

【例5-1】

創(chuàng)建一個文本編輯器。

操作步驟如下:

(1)選擇“文件/新建”命令,打開“新建”對話框,如圖5-1所示。圖5-1“新建”對話框

(2)選擇選項卡,并在左邊的項目類型列表框中選擇

選項,在文本框中輸入“文本編輯器”,并在文本框處選好項目保存的位置,單擊

按鈕,打開“MFCAppWizard-Step1”對話框,如圖5-2所示。

(3)在“MFCAppWizard-Step1”對話框中選中

單選項,并確認復選框被選中。如果不選中它,則MFCAppWizard就不會自動為文檔/視圖結構生成代碼了。單擊按鈕,顯示“MFCAppWizard-Step2of6”對話框,如圖5-3所示。圖5-2“MFCAppWizard-Step1”對話框圖5-3“MFCAppWizard-Step2of6”對話框

(4)在“MFCAppWizard-Step2of6”對話框中,詢問是否要加入對數(shù)據(jù)庫訪問的支持,因為不需要支持數(shù)據(jù)庫,所以選中單選項,如圖5-3所示。單擊按鈕,顯示“MFCAppWizard-Step3of6”對話框,如圖5-4所示。

(5)在“MFCAppWizard-Step3of6”對話框中,詢問是否需要復合文檔的支持,因為不需要支持,所以選中

單選項,如圖5-4所示。單擊按鈕,顯示“MFCAppWizard-Step4of6”對話框,如圖5-5所示。圖5-5“MFCAppWizard-Step4of6”對話框

(6)在“MFCAppWizard-Step4of6”對話框中,其選項關系到生成的應用程序窗口外觀的風格。在下有七個復選框,它們分別是:

①:是否可以在應用程序窗口中隱藏工具欄。

②:是否一打開應用程序窗口就顯示狀態(tài)欄。

③:是否在程序中自動加入對打印和打印預覽的支持。

④:是否在程序中加入對上下文幫助功能的支持。

⑤:是否使用三維風格的控件。

⑥:是否在程序中自動加入對MAPI的支持。⑦:是否在程序中自動加入對WindowsSockets的支持。

其中,最后兩項與網(wǎng)絡編程有關。

在問題下有兩個單選項:

①:選擇普通風格的工具欄。

②:選擇InternetExplorer瀏覽器風格的工具欄。

在下的文本框中要求程序員輸入的是:在自動生成的程序框架中,為“文件”菜單下的“最近打開的文件”預留多少個位置。

(7)在本程序中,只需使用“MFCAppWizard-Step4of6”對話框中提供的默認值即可。單擊按鈕,顯示“MFCAppWizard-Step5of6”對話框,如圖5-6所示。圖5-6“MFCAppWizard-Step5of6”對話框

(8)在“MFCAppWizard-Step5of6”對話框中,同樣選擇其提供的默認值即可。單擊按鈕,顯示“MFCAppWizard-Step6of6”對話框,如圖5-7所示。

(9)在“MFCAppWizard-Step6of6”對話框中,除在下拉列表框中選擇外,其他均選擇其提供的默認值即可。單擊按鈕,顯示“新建工程信息”對話框,如圖5-8所示。

(10)在“新建工程信息”對話框中將顯示VisualC++6.0提示程序員即將生成的程序框架信息。單擊按鈕,即生成一個具有文本編輯功能的應用程序,如圖5-9所示。圖5-7“MFCAppWizard-Step6of6”對話框圖5-8“新建工程信息”對話框圖5-9生成“文本編輯器”工程

(11)編譯運行“文本編輯器”工程。選擇5-9圖中菜單中的,編譯“文本編輯器”工程,菜單中的,運行“文本編輯器”工程。即生成如圖5-10所示的文本編輯器應用程序。

從以上例子可以看出,并不需要為這個例子編寫任何代碼,通過CEditView類內建的對文本編輯功能的支持,使得在視圖中進行文本編輯成為可能,而AppWizard實際上又添加了對文本文件的讀寫功能,它同由CEditView派生的類緊密結合,完成了整個文本編輯器的功能。圖5-10“文本編輯器”應用程序5.2.2創(chuàng)建多文檔程序

創(chuàng)建多文檔應用程序與創(chuàng)建單文檔應用程序的過程基本相同。

操作步驟如下:

(1)選擇“文件/新建”命令,打開“新建”對話框,如圖5-11所示。

(2)選擇選項卡,并在左邊的項目類型列表框中選擇

選項,在文本框中輸入“MDI文本編輯器”,并在文本框處選好項目保存的位置,單擊按鈕,打開“MFCAppWizard-Step1”對話框,如圖5-12所示。圖5-11“新建”對話框圖5-12“MFCAppWizard-Step1”對話框

(3)在“MFCAppWizard-Step1”對話框中選中單選項,并確認復選框被選中。單擊按鈕,進入“MFCAppWizard-Step2of6”。

(4)此后的操作步驟與4.2.1小節(jié)中創(chuàng)建單文檔應用程序的步驟相同。

(5)在“MFCAppWizard-Step6of6”對話框中,多文檔應用程序創(chuàng)建的界面如圖5-13所示。

提示:在操作過程中,除可以修改視圖類名稱、應用程序名稱、框架類名稱和文檔類名稱(方法同創(chuàng)建單文檔應用程序)外,還可以修改子框架類名稱和文件。子框架類的缺省為CChildFrame,其基類為CMDIChildWnd,且不可修改。頭文件和源文件名稱可以修改。圖5-13“MFCAppWizard-Step6of6”對話框

(6)按5.2.1小節(jié)中創(chuàng)建單文檔應用程序的方法編譯運行“MDI文本編輯器”工程。即生成如圖5-14所示的MDI文本編輯器應用程序。

提示:在多文檔應用程序中,增加了菜單,單擊該菜單下的命令項,則生成一個新的框架窗口,其名稱按前面的名稱遞增,如圖5-15所示。圖5-14“MDI文本編輯器”應用程序圖5-15新建窗口框架界面5.2.3文檔程序分析

單文檔(SDI)應用程序和多文檔(MDI)應用程序的差異較大,最明顯的差異是框架窗口的不同。對單文檔(SDI)應用程序來說,框架窗口是指惟一的主框架窗口,其缺省類為CMainFrame,其基類為CFrameWnd,其框架窗口類直接包含有視圖。對多文檔(MDI)的應用程序來說,框架窗口分為主框架窗口和子框架窗口。與單文檔不同的是,多文檔的主框架窗口不直接包含視圖,而是由每個子框架窗口包含相應的視圖。因此,多文檔的主框架類不與某個文檔相關聯(lián),只與子框架窗口相關聯(lián)。多文檔主框架窗口類的缺省類為CMainFrame,是由CMDIFrameWnd類派生而來的,子框架窗口類的缺省類為CChildFrame,是由CMDIChildFrame類派生而來的。單文檔(SDI)應用程序和多文檔(MDI)應用程序另一不同之處在于使用文檔的模板不同。文檔模板的作用是建立文檔類、視圖類以及框架窗口類之間的相互聯(lián)系。單文檔(SDI)應用程序使用CSingleDocTemplate模板,而多文檔(MDI)應用程序使用的是CMultiDocTemplate模板。

本章主要講述了基于文檔/視圖結構的應用程序的基本結構、框架窗口類、文檔類、視圖類的基本知識,并在此基礎上創(chuàng)建了單文檔(SDI)應用程序和多文檔(MDI)應用程序。通過本章的學習,讀者應掌握文檔/視圖結構應用程序的基本構成,掌握文檔類、視圖類以及框架窗口類之間的聯(lián)系方法,能夠理解并在程序編寫過程中正確處理文檔類對象與視圖類對象的分工合作。5.2.4節(jié)中將介紹一個實例。本實例將建立一個文檔視圖類的應用程序——閱讀器。此閱讀器可以用來打開*.txt的文件。通過該練習,讀者可掌握如何創(chuàng)建一個文檔視圖類的應用程序,并為其添加一簡單菜單項,以方便用戶閱讀序列編號的txt文件。5.2.4創(chuàng)建文檔視圖類應用程序

操作步驟如下:

(1)在Windows的“開始”菜單中選擇“所有程序/MicrosoftVisualStudio6.0/MicrosoftVisualC++6.0”命令,啟動VisualC++6.0,如圖5-16所示。

(2)選擇“文件/新建”命令,打開“新建”對話框,如圖5-17所示。

(3)選擇選項卡,并在左邊的項目類型列表框中選擇

選項,在文本框中輸入“閱讀器”,并在文本框處選好項目保存的位置,單擊按鈕,打開“MFCAppWizard-Step1”對話框,如圖5-18所示。圖5-16Access窗口圖5-17打開“新建”對話框圖5-18“MFCAppWizard-Step1”對話框

(4)在“MFCAppWizard-Step1”對話框中選中單選項,并確認復選框被選中。單擊

按鈕,以后步驟參照5.2.1節(jié)執(zhí)行,直到出現(xiàn)5-19所示對話框。

(5)在“新建工程信息”對話框中將顯示VisualC++6.0提示程序員即將生成的程序框架信息。單擊按鈕,即生成一個具有閱讀器功能的應用程序,如圖5-20所示。

(6)編譯運行“閱讀器”工程,結果如圖5-21所示。

(7)此閱讀器現(xiàn)在已具有打開文件的功能了。選擇“文件/打開”命令,如圖5-22所示。圖5-19“新建工程信息”對話框圖5-20生成“閱讀器”工程圖5-21“閱讀器”應用程序圖5-22“打開”對話框

(8)打開“閱讀器”目錄下的2.txt,如圖5-23所示。

注意:在使用閱讀器打開文件之前,請確保你的“閱讀器”目錄下有“2.txt”文件。

此閱讀器已基本成型,具有打開文件的基本功能了。這些工作大部分都是應用程序向導(AppWizard)完成的,所以不需要編寫一句代碼。接下來將繼續(xù)完善該程序,增加連續(xù)打開文件的功能。圖5-23打開2.txt5.2.5添加菜單

打開菜單資源進行編輯。

操作步驟如下:

(1)選擇“Workspace”窗口的選項卡,出現(xiàn)資源視圖,展開目錄樹項,如圖5-24所示。

(2)點擊選項旁邊的,如圖5-25所示。

(3)雙擊選項,出現(xiàn)菜單編輯器,如圖5-26所示。

(4)雙擊菜單欄右邊的,出現(xiàn)MenuItemProperties對話框,在文本框中輸入“瀏覽(&B)”,如圖5-27所示。圖5-24資源視圖圖5-25展開menu選項圖5-26菜單編輯器圖5-27“MenuItemProperties”對話框

(5)按回車鍵,如圖5-28所示。

(6)雙擊菜單下的,再次出現(xiàn)MenuItemProperties對話框,在文本框中輸入“ID_PRE”,在文本框中輸入“上一文件(&P)”,在文本框中輸入“順序打開上一個編號的文件”,如圖5-29所示。

(7)按回車鍵,如圖5-30所示。

(8)雙擊菜單項下的,重復操作步驟(6),在文本框中輸入“ID_NEXT”,在文本框中輸入“下一文件(&N)”,在文本框中輸入“順序打開下一個編號的文件”,并按回車鍵,結果如圖5-31所示。圖5-28增加“瀏覽”菜單圖5-29“上一文件”菜單屬性圖5-30“上一文件”菜單項圖5-31“下一文件”菜單項

(9)為菜單項添加消息處理函數(shù)OnPre和OnNext。選擇如圖5-24所示的“Workspace”窗口的選項卡,出現(xiàn)類視圖,展開目錄樹項,如圖5-32所示。

(10)在選項處,單擊鼠標右鍵,彈出的快捷菜單如圖5-33所示。

(11)在彈出的快捷菜單中選擇命令項,出現(xiàn)“NewWindowsMessageandEventHandlersforclassCMyDoc”對話框,從列表項中選擇

,從列表項中選擇,如圖5-34所示。圖5-32類視圖圖5-33CMyDoc的右鍵快捷菜單圖5-34“添加消息處理函數(shù)”對話框

(12)單擊按鈕,出現(xiàn)“AddMemberFunction”對話框,如圖5-35所示。

(13)單擊按鈕,此時又返回到“NewWindowsMessageandEventHandlersforclassCMyDoc”對話框,從

列表項中選擇,從

列表項中選擇,如圖5-36所示。

(14)單擊,出現(xiàn)“AddMemberFunction”對話框,如圖5-37所示。

(15)單擊按鈕,出現(xiàn)代碼編輯窗口,如圖5-38所示。圖5-35添加OnPre命令處理函數(shù)圖5-36“添加消息處理函數(shù)”對話框圖5-37添加OnNext命令處理函數(shù)圖5-38代碼編輯窗口

(16)在代碼編輯窗口中編輯voidCMyView::OnPre()和voidCMyView::OnNext()函數(shù),如圖5-38所示。代碼如下:

voidCMyView::OnPre()

{

CStringsFilename(GetDocument()->GetPathName());

//得到當前打開文檔的路徑名

CStringsTitle(GetDocument()->GetTitle());//得到當前打開文檔的文件名

intnTitle=atoi(sTitle);

if((nTitle>1)&(nTitle<=3))

{

sTitle.Format("%d",nTitle-1);

intnFind=sFilename.ReverseFind('\\\\'); if(nFind>0)

{

CStringsNewFilename(sFilename.Left(nFind)+"\\\\"+sTitle+".txt");

AfxGetApp()->OpenDocumentFile(sNewFilename);

}

}

else

AfxMessageBox("沒有上一文件了!");

}

voidCMyV

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論