VC++6.0定制窗口的方法+框架窗體、文檔視圖_第1頁
VC++6.0定制窗口的方法+框架窗體、文檔視圖_第2頁
VC++6.0定制窗口的方法+框架窗體、文檔視圖_第3頁
VC++6.0定制窗口的方法+框架窗體、文檔視圖_第4頁
VC++6.0定制窗口的方法+框架窗體、文檔視圖_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、BOOLxxiew:PreCreateWmdov(CREATESTRUCT&cs)三、修改主框架窗口、子窗口及其顯示性質(zhì)VC+6-0定制窗口的方法VC卄6.0是Microsoft新近推出的可視化C卄集成開發(fā)環(huán)境。它在繼承以前VC卄的基礎(chǔ)上增加了許多新的功能,用于支持Win32平臺應(yīng)用程序、服務(wù)程序和控件的開發(fā)。VC+5.0提供了強大、快捷的編程工具,其中最基木的是三個導(dǎo)航:AppWizard用于程序框架的生成,AppStudio用于資源的編輯,ClassWizard用于類的編輯和管理。其中,窗口、菜單等無需用戶編寫程序,而山系統(tǒng)門動生成.但在許多情況下,用戶要設(shè)世白己希望的謝口(即定制窗口)。

2、一、如何在多文檔界面下去掉開始的子窗口在多文檔界面下,H動生成一個新的子窗口,而一個實際的應(yīng)用系統(tǒng)往往是山用戶操作后再生成新的窗口。為了去掉開始的子謝口,可在應(yīng)用程序文件分析命令行的語句CcominaiidLinelnfocmdhifo:ParseCominaiidLine(cmdliifb);后加入:cindInfb.m_nShellCommand=CcominandLineInfb:FileNotliing;去掉子窗口后,就只剩下主框架謝口了。因為在多文檔界面中,系統(tǒng)生成兩個菜單:一個是用戶的菜單,列一個是系統(tǒng)主框架菜單。通常用戶工作在用戶菜單。為了保證菜單界面不變,可修改主框架菜單資源,

3、使其與用戶菜單保持一致。二、修改謝口標題欄在缺省情況下,窗口標題欄中顯示的文檔名為文件名。若要在標題欄顯示一個長字符串,而又不修改文件名,則可將項目工作區(qū)轉(zhuǎn)換到ResourceView而版,選擇串表(StnngTable)資源,在StrmgTable中雙擊IDR-MAIN-FRAME項,caption中顯示一字符串xx8yy,將第一個參數(shù)修改為用戶IH己希望見到的主窗口標題即可??赏ㄟ^覆蓋CWnd的成員函數(shù)PreCreateWmdow來修改主窗口和子謝口PreCreateWindov函數(shù)在即將創(chuàng)建窗口前被調(diào)用,函數(shù)原型為:BOOLPreCreateWmdow函數(shù)(CREATESTRUCTcs)

4、。如果要覆蓋PreCreateWmdow函數(shù),則在創(chuàng)建窗口前可以修改CREATESTRUCT結(jié)構(gòu)以替換缺省參數(shù),CREATESTRUCT結(jié)構(gòu)存放謝口特征,如謝口坐標.風格等,還可以定義新窗口風格。若想修改主框架窗口,則可以在MainFmicpp的下列成員函數(shù)中加入待修改的內(nèi)容。例如:BOOLCniamFrame:PreCreateWindow(CREATESTRUCT&cs)通過修改CREATESTRUCT結(jié)構(gòu)來修改謝口類或風格定義新窗口的高度、寬度cs.cx=450:cs.cy=300:/定義新窗口風格為去掉主窗口名及最大化等按鈕cs.style=ws-POPWINDO;renirnCfra

5、meWnd:PreCreateWmdow(cs);定制子窗口的操作與上述主窗口相同,可在CluldFrmcpp中加入以下內(nèi)容:BOOLCniamFrame:PreCreateWindow(CREATESTRUCT&cs)通過修改CREATESTRUCT結(jié)構(gòu)來修改謝口類或風格returnCmdichildWn代CreateWmdov(cs):要修改視圖窗口的顯示性質(zhì),則可在視圖文件xxView.cpp的下述成員函數(shù)中加入以下語句:BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)增加的語句cs.lpsz

6、Class=AfxRegisterWndClass(cs-HREDRAW|CSA-REDRAW.O,(HBRUSH):GetStockObject(WHITE-BRUSH).O);returnCscrollXiew:PieCreateWindow(cs);其中,cs的參數(shù)pszClass用于存放Windows窗口類名稱。要想注冊Windows口類,則必須調(diào)用全局函數(shù)AfxRegisterWndClasSo該函數(shù)原型為:LPCTSTRAFXAPIA6JUpdataALLiev(NULL)即可。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?Ccre

7、ateContext*pContext)第7章框架窗口、文檔和視圖BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)寸:L應(yīng)用程序組成結(jié)構(gòu)1.單文檔應(yīng)用程序(SingleDocumentInterface,SDI)在單文檔界面程序中,用戶在同一時刻只能操作一個文檔,如記事本程序。在這些應(yīng)用程序中,打開文檔時會自動關(guān)閉當前打開的活動文檔,若文檔修改后尚未保存,會提示是否保存所做的修改。因為一次只開一個窗口,因此不像WORD那樣需要一個窗口菜單。單文檔應(yīng)用程序一般都提供一個“文件”菜單,在該菜單下有一組命

8、令,用于新建文檔、打開已有文檔、保存或另存為等。這類程序相對比較簡單,常見的應(yīng)用程序有終端仿真程序和一些工具程序。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)2.多文檔應(yīng)用程序(MultipleDocumentInterface,MDI)在多文檔界面應(yīng)用程序中,允許同時操作多個文檔,如MicrosoftWordo可以打開多個文祚(同時也就為每個文件打開一個窗口),可以通過切換活動窗口激活相應(yīng)的文檔進行編輯。多文檔應(yīng)用程序也提供一個“文件”菜單,用于新建、打開、保存文檔。與單文檔應(yīng)用程序不同的是,

9、它往往還提供一個“關(guān)閉”菜單項,用于關(guān)閉當前打開的文檔。多文檔應(yīng)用程序還提供一個“窗口”菜單,管理所有打開的子窗口,包括對子窗口的新建、關(guān)閉、層疊、平鋪等。關(guān)閉一個窗口時,窗口內(nèi)的文檔也被自動關(guān)閉。3.基于對話框的應(yīng)用程序(DialogbasedApplication)基于對話框的應(yīng)用程序非常簡單,由應(yīng)用程序類、對話框類(可以作為其它控件的容器)構(gòu)成。它的生命周期可概括為:通過應(yīng)用程序類的Initlnstance()函數(shù),構(gòu)造一個模式對話框?qū)ο螅徽{(diào)用DoModal函數(shù),讓基于對話框的應(yīng)用程序像對待普通對話框一樣接收和分配消息;用戶退出對話框后,程序也就隨之結(jié)束。常見的基于對話框的應(yīng)用程序有計算

10、器等(以對話框為容器布局的程序)。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)CMainFrame類和窗口MFC應(yīng)用程序主要由3部分組成:窗口、文檔和視圖。其中窗口是整個應(yīng)用程序的載體,也是應(yīng)用程序不可缺少的部分。窗口也叫框架窗口,它可以分為兩類:一類是主框架窗口(也叫主窗口),另一類是子框架窗口(也叫子窗口)。在MFC應(yīng)用程序中,框架(Framework)是應(yīng)用程序所應(yīng)具備的軟件模塊按一定的結(jié)構(gòu)組成的集合??蚣艽翱诳梢岳斫鉃榭蚣艿目梢暬@示形式。BOOLCniaiiiFrame:OnCreat

11、eCline(LPCREATESTRUCTcs?CcreateContext*pContext)主框架窗口是應(yīng)用程序放置在桌面(DeskTop)上的那個窗口,每個應(yīng)用程序只能有一個主窗口,主窗口的標題欄上通常顯示應(yīng)用程序的名稱。子框架窗口是應(yīng)用程序主框架窗口內(nèi)的子窗口,它占據(jù)了主框架窗口客戶區(qū)的部分或全部。視圖是子框架窗口內(nèi)的子窗口,它占據(jù)了子框架窗口客戶區(qū)的部分或全部。圖71標明了多文DrovLinB9IApp-DrwLi2-IDIx|(I)褊埸査香Q)窗口幫fibQI)檔應(yīng)用程序中主框架窗口、子框架窗口和視圖之間的關(guān)系。由于單文檔應(yīng)用程序沒有子框架窗口,所以可以認為視圖充滿了整個主框架窗口

12、。使用MFCAppWizard創(chuàng)建單文檔應(yīng)用程序后,包含主框架窗口類的文件分別為MainFrm.h和MainFm.cpp。主框架窗口類是由CFrameWnd派生而來的,類名為CMainFrameo而對于多文檔應(yīng)用程序,主框架窗口由CMDIFrameWnd派生。CMainFrame類有4個重要的函數(shù):AssertValidDump、OnCreate和PreCreateWindow。這4個禹數(shù)都是由血舟裡序向?qū)ё詣勇暶骱投x的,無須人為干預(yù),不過了解它們的作用還是非常有必要的,在需要的情況下,用戶還可以修改它們以達到預(yù)定效果。它們各自的功能如下:(1)AssertValid函數(shù)用來診斷CMainF

13、rame對象的有效性。(2)Dump函數(shù)用來輸出CMainFrame對象的狀態(tài)信息。(3)OnCreate函數(shù)用來創(chuàng)建工具欄m_wndToolBar和狀態(tài)欄m_wndStatusBar,而在視圖窗口中是由基類CFrameWnd的成員禹數(shù)OnCreate逋過謫用0nCreateClient函數(shù)倉ij建的。(4)PreCreateWindow函數(shù)是一個虛函數(shù)。如果要創(chuàng)建一個非默認風格的窗口,可以重載這個函數(shù),在函數(shù)中通過修改Createstruct結(jié)構(gòu)參數(shù)來改變窗口類、窗口風格、窗口大小和位置等。CDocument類和文檔CDocument類是CCmdTarget類的派生類,其派生關(guān)系如圖74所示

14、。CDocument類為用戶定義的文檔類提供了基本的函數(shù)功能,它支持標準操作,如創(chuàng)建、裝載、保存等。一個應(yīng)用程序可以支持多種類型的文檔,每種類型的文檔都通過一個文檔模板對象建立與各自視圖的聯(lián)系。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)不論是SDI應(yīng)用程序還是MDI應(yīng)用程序,文檔類都是從CDocument類派生出來的。在文檔/視圖結(jié)構(gòu)中,文檔類的主要任務(wù)通常是對數(shù)據(jù)進行管理和維護,數(shù)據(jù)將保存在文檔類的成員變量中,視圖通過對這些變量的訪問來獲取或返回數(shù)據(jù),并能通過這種方式來更新并顯示數(shù)據(jù)。從CD

15、ocument類派生文檔類的步驟如下:(1)為每一個文檔類型從CDocument類(當然也可以是其他CDocument類的漩生類)派生一個相應(yīng)的文檔類。(2)為文檔類添加成員變量。這些成員變量用來保存文子當?shù)念l據(jù),其他對象(如與文檔相關(guān)聯(lián)的視圖)直接或間接地訪問這些成員變量以讀取或更新文檔的數(shù)據(jù)。(3)重載Serialize成員函數(shù),實現(xiàn)文檔數(shù)據(jù)的序列化。CView類和視圖CView類是CWnd類的派生類,其派生關(guān)系如圖75所示。CView類是MFC中一個基本的類,也是其他MFC視圖類和用戶視圖派生類的基類。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRU

16、CTcs?CcreateContext*pContext)視圖窗口用來顯示文檔中的數(shù)據(jù),并根據(jù)視圖對象提供的基本功能,指定用戶使用什么方式查看文檔數(shù)據(jù),接受用戶對數(shù)據(jù)的交互操作(包括選擇和編輯),并將更改后的數(shù)據(jù)回傳給文檔。視圖被附加到文檔中并在文檔和用戶之間充當媒介,它可以在屏幕上呈現(xiàn)文檔的數(shù)據(jù),并將用戶輸入解釋為對文檔的操作,還可以為打印和打印預(yù)覽呈現(xiàn)圖像。在MFC類庫的層次位置中,CView類是從CWnd類下派生的,掌握這個繼承關(guān)系對用戶來說是很有用的。例如,由于所有的從CView類派生的類也都是由CWnd類間接派生的,因此這些類具有CWnd的所有功能,如創(chuàng)建、移動、顯示和隱藏窗口等,并

17、且CView類可以接收任何Windows消息。CView類只提供了基礎(chǔ)框架,在MFC中派生了CView類的許多子類,為不同的應(yīng)用提供了強大支持。這些視圖類都不是直接派生于CView類,而是派生于CView的子類CCtrlView。CCtrlView類的派生類對應(yīng)于Windows通用控件,提供了與通用控件相對應(yīng)的功能。下面簡單地介紹一下視圖類各派生類的情況。l.CEditView類CEditView類主要用來支持類似編輯控件所要實現(xiàn)的功能,常見的文本操作基本上都是由該類支持實現(xiàn)的。如果希望有一個具有簡單編輯功能或附加功能的編輯窗口,就可以構(gòu)造一個CEditView類型的對象。一個CEditVie

18、w對象可以占有一個窗體的整個用戶區(qū)。用戶也可以通過從CEditView中派生自己的類來增加或改變基本功能,并可以聲明能加入到文檔模板中的類。2.CTreeView類CTreeView類主要提供對一些樹形控件所實現(xiàn)的功能的支持。它可以使數(shù)據(jù)的顯示方式更富于變化。3CListView類CListView類與CTreeView類類似,不同之處在于它提供了一種簡捷地實現(xiàn)數(shù)據(jù)的不同顯示方式的途徑,為數(shù)據(jù)組織提供了多種手段。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)4CRichEditView類CRich

19、EditView類主要提供對Rich文本操作的支持。Rich文本是既可以為文本,也可以為圖形圖像的一種特殊格式的文本。5.CScrollView類CScrollView類的主要功能是提供視圖的滾動顯示。需要注意的是,以上介紹的兒個類都是間接派生于CView類,而該類直接繼承至CView類,這就決定了其動作的特殊性。7.1.4框架窗口、文檔和視圖的關(guān)系孩檔/視圖結(jié)構(gòu)是MFC應(yīng)用程序中最基本的程序結(jié)構(gòu),它適用于大多數(shù)Windows應(yīng)用程序。文檔與視圖完成了程序的大部分功能,它們是MFC應(yīng)用程序的核心。由MFC創(chuàng)建的應(yīng)用程序的主線程序體現(xiàn)在應(yīng)用類中,而應(yīng)用類通過文檔模板類將文檔類、窗口類(SDI中的

20、主窗口類或MDI中的子窗口類)、視圖類聯(lián)系在一起,組成一個有機整體,共同完成程序設(shè)計任務(wù)。單文*當模板類CSingleDocTemplate和參文*當模板類CMutiDocTemplate均由CDocTemplate類派生。單文檔模板類支持單文檔應(yīng)用程序,多文檔模板類支持多文檔應(yīng)用程序。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)應(yīng)用類CWinApp通過一個內(nèi)部類CDocManager來管理文檔模板類。CWinApp類成員變量m_pDocManager是指向CDocManager對象的指針。在C

21、DocManager中定義的指針鏈表,其每項都是一個指向文檔模板對象的指針。實際上,應(yīng)用類通過其鏈表成員管理應(yīng)用程序的所有文檔模板對象。文檔對象用來保存和管理數(shù)據(jù),視圖對象用于數(shù)據(jù)交互,應(yīng)用程序框架用來管理不同文檔顯示界面。例如,程序設(shè)計要求用數(shù)據(jù)網(wǎng)格顯示二維數(shù)據(jù),同時還要求用圖形顯示二維數(shù)據(jù),即這些數(shù)據(jù)來自同一文檔,但以不同的視圖方式顯示。在這種情況下可以用框架中的文檔模板把一個文檔及兩個視圖組合在一起。在程序運行時,CWinApp將創(chuàng)建一個CFrameWnd框架窗口實例,而框架窗口將創(chuàng)建文檔模板,然后由文檔模板創(chuàng)建文檔實例和視圖實例,并將兩者關(guān)聯(lián)起來。一般來講,用戶只需對文檔和視圖進行操作

22、,框架的各種行為已經(jīng)被MFC安排好而不需要人為干預(yù),這也是MFC設(shè)計文檔/視圖結(jié)構(gòu)的本意,讓用戶將注意力放在完成任務(wù)上,而從界而編寫中解放出來。文檔/視圖結(jié)構(gòu)的數(shù)據(jù)交互如圖76所示,兩者的關(guān)系如圖77所示。圖76文檔視圖結(jié)構(gòu)的數(shù)據(jù)交互BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)主冷采的作用様!攔.柔*欄工具欄.伏亦欄(im済總)視00矣作用柞用1.極曼用戸命入23示用AMW丈(ttB內(nèi)存)2永久旺留用戶奴痔O用淪自定義矣住用存定義悚作方池及iafiente3圖77文檔與視圖的關(guān)系BOOLCnia

23、iiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)文檔BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)框架窗口、文檔和視圖之間的關(guān)系可以表述為:文檔和視圖之間是一對多的關(guān)系,每個視圖和框架窗口是一對一的關(guān)系??蚣艽翱?、文檔和視圖三者之間是相互關(guān)聯(lián)、相互協(xié)調(diào)的,彼此都包含了指向?qū)Ψ降闹羔?。它們之間的聯(lián)系是通過文檔模板的構(gòu)造函數(shù)來實現(xiàn)的。下面介紹在程序中如何得到各種對象的指針。全局函數(shù)AfxGetApp()可以得到CWinAp

24、p應(yīng)用程序類指針,而AfxGetApp()-m_pMainWnd就是框架窗口孕ameWnd冃勺皓*誹。在fit架窗口卬,CFrameWnd:GetActiveDocument()得到當前活動文檔指針。在框架窗口中,CFrameWnd:GetActiveView()得到當前活動視圖指針。在視圖中,CView:GetDocument()ffl于檢索指向文檔類的指針。在文檔中,CDocument:GetFirstViewPosition()和CDocument:GetNextView()甬萊遍厲所宥和文*當芙燃的視圖。在文檔中,CDocument:GetDocTemplate()用來得到文檔模板指針

25、。在多文檔界面中,CMDIFrameWnd:MDIGetActive()得到當前活動的MDI了窗口。$72文檔文檔(Document)是MFC應(yīng)用程序中所處理數(shù)據(jù)的集合,包括文本、圖形、圖像和表格等類型。一個文檔對應(yīng)于用戶當前打開的一個文件。文檔的主要作用是把數(shù)據(jù)處理從用戶界面的管理中分離出來,集中處理數(shù)據(jù),同時提供與視圖交互的接口。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)*721數(shù)據(jù)成員數(shù)據(jù)成員包括成員變量和成員函數(shù)。CDocument類為用戶定義的文檔類提供了基本的函數(shù)功能。CDocum

26、ent支持標準操作,如創(chuàng)建、裝載、保存等??蚣苡肅Document定義的界面來操作文檔。CDocument類的主要成員變量如下:BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)CStringm_strTitle:用于標記文檔的標題。CStringm_strPathName:用于標記文檔的路徑。CDocTemplate*m_pDocTemplate:指向文檔模板的指針。一CPtrListm_viewList:視圖列表。BOOLm_bModified:指明打開文檔后是否進行了修改。BOOLm_bAuto

27、Delete:在沒有可用視圖時是否刪除自動文檔。BOOLmbEmbedded:是否可通過OLE創(chuàng)建文檔。7.2.2成員函數(shù)1.AddView函數(shù)函數(shù)原型如下:voidAddView(CView*pView);說明:為當前的文檔添加一個視圖。其中,參數(shù)pView是指向新添加的視圖的指針。2C8nCloseFrame函數(shù)函數(shù)原型如下:virtualBOOLCanCloseFrame(CFrameWnd*pFrame);斷非這盤判回試存數(shù)返測戶函則先用該如示用閉函提調(diào)關(guān)該則序能:程果下是用如況果應(yīng)。情如口認O明窗默口說的在窗,否則,返回FALSEo3.DeleteContents函數(shù)函數(shù)原型如下:v

28、irtualvoidDeleteContents();說明:框架窗口調(diào)用該函數(shù)在不刪除CDocument對象的前提下刪除文檔中的數(shù)據(jù)。當文檔被重復(fù)使用時,調(diào)用該函數(shù)確保文檔為空。4.GetDocTemplate函數(shù)函數(shù)原型如下:CDocTemplate*GetDocTemplate()const;說明:調(diào)用該項函數(shù)得到一個指向當前文檔使用的文檔模板的侖針。當文檔不是由文檔模板來管理時,返回NULLo5.GetFile函數(shù)函數(shù)原型如下:virtualCFile*GetFile(LPCTSTRlpszFIIeName,UINTnOpenFlags,CFileException*pError);說明

29、:得到一個CFile對象的指針。其中,IpszFileName為指泄文彳牢的路徑的字符串,nOpenFlags為扌J開文件時指定文件的共享和存取方式,pError為指向錯誤代碼的指針。6.GetFirstViewPosition函數(shù)函數(shù)原型如下:virtualPOSITIONGetFirstViewPosition()const;說明:利用該函數(shù)可得到與文檔相關(guān)的第一個視圖的位置,返回值可以供GetNextView()數(shù)使用。7GetNextView函數(shù)函數(shù)原型如下:virtualCView*GetNextView(POSITION&rPosition)const;說明:得到下一個視圖的位置。

30、若當前視圖是視圖系列中最后一幅時,返回NULLo其中,參數(shù)rPosition是前一幅視圖的位置。8.GetPathName函數(shù)函數(shù)原型如下:constCString&GetPathName()const;說明:返回當前文檔存盤文件的完整路徑。9.GetTitle函數(shù)函數(shù)原型如下:constCString&GetTitle()const;說明:返回文檔的標題,通常與文檔的文件名有關(guān)。與其相對的是SetTitle()函數(shù),它用于設(shè)置文檔的標題。其原型如下:virtualvoidSetTitle(LPCTSTRIpszTitle);lO.IsModified函數(shù)函數(shù)原型如下:BOOLIsModifi

31、ed();說明:檢測文檔是否被修改過。如果文檔被修改過,返回TRUEo11.OnChangedViewList函數(shù)函數(shù)原型如下:virtualvoidOnChangedViewList();說明:在文檔的視圖增加或減少時調(diào)用。默認是當文檔的最后一個視圖被刪除時自動刪除文檔。12.OnCloseDocument函數(shù)函數(shù)原型如下:virtualvoidOnCloseDocument();說明:關(guān)閉文檔時被調(diào)用。默認先調(diào)用DeleteContents()函數(shù)刪除文檔數(shù)據(jù),然后再關(guān)閉視圖窗口。13.0nNewDocument函數(shù)函數(shù)原型如下:BOOLOnNewDocument();說明:在SDI應(yīng)用程

32、序中,當用戶在“文件”菜單中單擊新建”菜單項時,自動調(diào)用框架窗口。OnNewDocument()消除I白文*當丙容,得到一個“空”的文檔。而在MDI應(yīng)用程序中,框架自動生成一個新的文檔對象,如果要調(diào)用OnNewDocument()實現(xiàn)初始化,用戶可以在此處插入一個新文檔的初始化代碼。140nOpenDocument函數(shù)函數(shù)原型如下:virtualBOOLOnOpenDocument(LPCTSTRIpszPathName);說明:在打開文檔的時候調(diào)用。其中,IpszPathName為被打開文檔的路徑。15.0nSaveOpenDocument函數(shù)函數(shù)原型如下:virtualBOOLOnSave

33、Document(LPCTSTRIpszPathName);說明:當執(zhí)行“保存”和“另存為”命令時被調(diào)用。默認時,調(diào)用CObject:Serialize函數(shù)將文檔數(shù)據(jù)存入文件。如果操作成功,返回TRUE。16.SaveModified函數(shù)函數(shù)原型如下:virtualBOOLSaveModified();說明:當關(guān)閉一個被修改的文檔時,調(diào)用該函數(shù)詢問是否需要徐存修改的文檔。切果成功地關(guān)閉了文檔,則返回TRUEo17.SetModifiedFlag函數(shù)函數(shù)原型如下:voidSetModifiedFlag(BOOLbModified二TRUE);說明:設(shè)置文檔的編輯標志。當用戶保存文檔后,文檔的bM

34、odified自動被設(shè)置為FALSEo如果用戸退出程序時,bModified的標志為TRUE,系統(tǒng)會自動提示用戶是否保存文檔。當用戸在程序中某處修改了文檔數(shù)據(jù),在其后加上代碼pDoc-SetModifiedFag仃RUE)可以有效地保證數(shù)據(jù)的安全。皐.Serialize函數(shù)函數(shù)原型如下:voidSerialize(CArchive&ar);說明:當用戶要把文檔中的內(nèi)容寫入文件或從文件中調(diào)出來時,框架自動調(diào)用文檔的Serialize成員函數(shù)來實現(xiàn)文檔和文件的序列化。要注意的是,讀出數(shù)據(jù)的順序應(yīng)該和寫入數(shù)據(jù)的順序保扌寺一致。19.UpdateAIIViews函數(shù)函數(shù)原型如下:voidUpdateA

35、IIViews(CView*pSender,LPARAMIHint=OL,CObject*pHint二NULL);說明:保證數(shù)據(jù)在文檔類及其視圖類中是一致的。視圖類接受用戶的輸入,則會將界面數(shù)據(jù)存儲到文檔數(shù)據(jù)中,而文檔類中的數(shù)據(jù)發(fā)生了變化,也應(yīng)該及時更新視圖類數(shù)據(jù),并刷新界面。7-2-3文檔序列化文檔類中存儲數(shù)據(jù)的方法有多種,例如,使用對象指針、動態(tài)對象數(shù)組、動態(tài)鏈式存儲結(jié)構(gòu)或哈希表來實現(xiàn)用戶自定義數(shù)據(jù)的存儲。文檔類通過“序列化機制”來管理文檔中數(shù)據(jù)的存取,序列化機制示意圖如圖78所示。如圖78序列化機制BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCT

36、cs?CcreateContext*pContext)基本類型對象基本類型對象如圖78序列化機制BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)如圖78序列化機制BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)CArchive對象BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)持久性(persistence)是

37、指對象所具有的保存和加載其狀態(tài)的能力,即對象能夠在程序運行結(jié)束前將對象的當前狀態(tài)寫入永久性存儲體中,以后在程序再運行時通過數(shù)據(jù)的讀取而恢復(fù)對象的狀態(tài)。這種對象的保存和恢復(fù)的過程稱為序列化(serialize)。為了深入理解序列化操作,有必要了解對文檔不同操作后的具體程序運行過程。1創(chuàng)建空文檔應(yīng)用程序類的InitlnstanceO函數(shù)在調(diào)用了AddDocTemplate()函數(shù)之后,會通過CWinApp:ProcessSnellCommand間接調(diào)用CWinApp的成員函敎OnFileNew,異依次完成下列工作:構(gòu)造文檔對象,從磁盤中讀取數(shù)據(jù)。勾造主框架類CMainFrame類的對象,并創(chuàng)建該主

38、框架窗口,但不顯不。構(gòu)造視圖對象,并創(chuàng)建視圖窗口,同樣也不顯示。通過MFC內(nèi)部機制,建立主框架窗口、文檔和視圖對象之間的聯(lián)系。調(diào)用CDocument:OnNewDocument()虛函數(shù),并調(diào)用CDocument:DeleteContents()虛函數(shù)來渚傑文檔對象的內(nèi)容。調(diào)用CView:OnInitialUpdate()虛函數(shù)初始化視圖類的數(shù)據(jù)成員。調(diào)用CFrameWnd:ActiveFrame()虛函數(shù),顯示帶有菜單、工具欄、狀態(tài)欄以及視圖窗口的主框架窗口。2打開文檔在利用MFC應(yīng)用程序向?qū)?chuàng)建應(yīng)用程序時,MFC會自動將“文件”菜單中的“打開”命令映射到CWinApp類的OnFileOpe

39、n()成員函數(shù)。OnFileOpen()函數(shù)會完成下列操作:(1)彈出通用文件“打開”對話框,供用戶選擇一個文檔。(2)文檔指定后,調(diào)用文檔對象的CDoucment:OnOpenDocument()虛函數(shù)。這個函數(shù)將打開文檔,并調(diào)用DeleteContents()函數(shù)清除文檔對象的內(nèi)容,然后創(chuàng)建一個CArchive對象用于數(shù)據(jù)的讀取,接著又自動調(diào)用Serialize()函數(shù)。(3)調(diào)用視圖對象的CView:OnInitialUpdate()虛函數(shù)初始化視圖類的數(shù)據(jù)成員。3保存文檔在利用MFC應(yīng)用程序向?qū)?chuàng)建應(yīng)用程序時,它會自動將墳件”菜單中的“保存命令與文檔類的OnFileSave成員函數(shù)在內(nèi)

40、部關(guān)聯(lián)。OnFileSmve()函數(shù)仝穿成下列操作(1)彈出通用文戀“保存”對話框,讓用戶輸入一個文件名。(2)調(diào)用文檔類對象的CDocument:OnSaveDocument()虛函數(shù),接著又自動調(diào)甬Serialize()函數(shù),蔣CArchive對彖的內(nèi)容保存在文檔中。4關(guān)閉文檔當用戶試圖關(guān)閉文檔(或退出應(yīng)用程序)時,應(yīng)用程序會根據(jù)用戶對文檔的修改與否來進一步完成下列住務(wù)。(1)若文檔內(nèi)容已修改,則彈出一個“消息”對話框,詢問用戶是否保存修改后的文檔。當用戶選擇“是”,貝|應(yīng)用程序瓠行OnFileSave過程。(2)調(diào)用CDocument:OnCloseDocument()虛函數(shù),關(guān)刃所有與

41、該文檔相關(guān)聯(lián)的文檔窗口及相應(yīng)的視圖,調(diào)用文宿奚陽DeIeteContents清除文檔教擁。用戶經(jīng)常需要自己定義類來實現(xiàn)序列化操作,以完成某些特定的功能,MFC為滿足用戶的這個需要規(guī)定了自定義類實現(xiàn)序列化必須滿足以下4個條件:(1)類必須是直接或間接地從CObject類派生。(2)類必須定義一個不帶參數(shù)的構(gòu)造函數(shù)。當從磁盤載入文檔時調(diào)用該構(gòu)造函數(shù)來創(chuàng)建一個可序列化的對象,使用從文件中讀出來的數(shù)據(jù)填充對象的成員變量。(3)要使用MFC序列化宏。在類的頭文件中使用DECLARE_SERIAL宏,在類的實現(xiàn)文件中使用IMPLEMENT.SERIAL宏。(4)自定義類必須重載序列化成員函數(shù)Seriali

42、ze()o由于不同類的數(shù)據(jù)結(jié)構(gòu)各不相同,可序列化的類應(yīng)該重載SerializeO函數(shù),使其支持對特定數(shù)據(jù)的序列化。并且,任何需要序列化的對象都應(yīng)該在文檔派生類中作為數(shù)據(jù)成員進行聲明。7.3視圖視圖(view)是文檔在應(yīng)用程序窗口中的一1個映像。視圖就像一個觀景器,用戶通過視圖查看和修改文檔,視圖充當了文檔與用戶之間的媒介物。應(yīng)用程序通過視圖向用戶顯示文檔中的數(shù)據(jù),并把用戶的輸入解釋為對文檔的操作。一個視圖總是與一個文檔對象相關(guān)聯(lián),用戶通過與文檔相關(guān)聯(lián)的視圖與文檔進行交互。當用戶打開一個文檔時,應(yīng)用程序就會創(chuàng)建一個與之相關(guān)聯(lián)的視圖。$731視圖的特點視圖主要有以下幾方面特點:(1)多個視圖可以共

43、享一個主窗口。(2)CDocTemplate為視圖、主窗口和文檔之間建立相互聯(lián)系。(3)當用戶打開或切分窗口時,應(yīng)用程序?qū)?gòu)造一個視圖,并將它連接到相應(yīng)的文檔。(4)一個視圖只能擁有一個文檔,而一個文檔可以擁有多個視圖。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)(5)視圖接收由程序框架傳給它的命令,如果視圖不能處理該命令,就將其傳遞給相關(guān)聯(lián)的文檔處理。(6)視圖可處理多種類型的輸入和命令,如鍵盤輸入、鼠標輸入、菜單命令、工具欄命令等。(7)視圖負責顯示和修改文檔數(shù)據(jù)。在應(yīng)用程序中可以使用視圖直

44、接讀取文檔的數(shù)據(jù),也可以在文檔中提供由視圖調(diào)用的函數(shù)來獲取文檔數(shù)據(jù)。*732視圖的成員函數(shù)l.OnDraw函數(shù)-函數(shù)原型如下:voidOnDraw(CDC*pDC);其中,pDC為指向打印設(shè)備描述表的指針。-說明:當用戶執(zhí)行屏幕顯示、打印和打印預(yù)覽時,框架將調(diào)用該函數(shù)在輸出設(shè)備上顯示文檔數(shù)據(jù),因此OnDraw函數(shù)是編程時需要覆蓋的函麺之一。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)2.GetDocument函數(shù)函數(shù)原型如下:CDocument*GetDocument()const;(CDocu

45、ment派生類)*GetDocument()const;說明:獲得與視圖類相關(guān)連的文檔對象指針。在視鹵類申帀用GetDocument獲取與之矣唳的文*當對象的指針,取得對文檔數(shù)據(jù)、對象、對象集合的訪問。通過該函數(shù)還可以獲得指向視圖對象所屬的文檔的文檔指針m_pDocumento3.0nllpdate函數(shù)函數(shù)原型如下:virtualvoidOnUpdate(CView*pSender,LPARAMIHint,CObject*pHint);其中,參數(shù)Sender表示與被更改的文檔類相關(guān)聯(lián)的視圖類的指針,當為NULL時,表示所有的視圖都需要更新。說明:Onllpdate函數(shù)是一個虛函數(shù),它負責更新數(shù)

46、據(jù),對文檔數(shù)據(jù)的正確顯示起必要的支持作用。4.0nInitialUpdate函數(shù)函數(shù)原型如下:voidOnlnitialUpdate();說明:OnlnitialUpdate函數(shù)用于初始化視圖類的數(shù)據(jù)成員。5IsSelected函數(shù)函數(shù)原型如下:virtualBOOLIsSelected(constCObject*pDocItem)const;說明:判斷指定的文檔項目是否被選中,如果沒有選中,則返回零值,否則返回非零值。該函數(shù)由框架調(diào)用,檢查指定的文檔項目是否被選中。pDocItem為指向要測試的文檔項目的指針。6.0nScroll函數(shù)函數(shù)原型如下:virtualBOOLCView:OnScr

47、oll(UINTnScrollCode,UINTnPos,BOOLbDoScroll二TRUE);說明:框架調(diào)用這個函數(shù)以確定視圖是否能夠滾動。如果bDoScroll為TRUE,并且視圖確實被滾動了,則返回非零值;否則返回零。如果bDoScroll為FALSE,則返回當bDoScroll為TRUE時應(yīng)當返回的值,即使沒有做實際的滾動。7.0nPrepareDC函數(shù)函數(shù)原型如下:virtualvoidOnPrepareDC(CDC*pDC,CPrintlnfo*plnfo二NULL);說明:在調(diào)用0nDraw()數(shù)前允許由MFC調(diào)用該函數(shù)修改設(shè)備描述表。其中,參數(shù)pDC為指向設(shè)備環(huán)境的指針,用于

48、畫出文檔的圖像。plnfo為指向CPrintlnfo結(jié)構(gòu)的指針,如果OnPrepareDC是為打印或打印預(yù)覽調(diào)用的,則該結(jié)構(gòu)描述了當前打印任務(wù),m_nCuPage成員指定了要打印的頁數(shù)。如果0nPrepareDC是為屏幕顯示而調(diào)用的,則這個參數(shù)為NULLo在下列情況下,應(yīng)該重載OnPrepareDC:(1)要為指定的頁面調(diào)整設(shè)備環(huán)境的屬性。例如,如果想要設(shè)置設(shè)備環(huán)境的映射模式或者其他特征,則應(yīng)在這個函數(shù)中完成這些操作。(2)要實現(xiàn)打印時的分頁。通常應(yīng)當在打印開始時利用OnPreparePrinting成員函數(shù)來指定文檔的長度。但是,如果并不知道文檔的確切長度(例如,當打印數(shù)據(jù)庫中未知數(shù)量的記錄

49、時),則應(yīng)重載OnPrepareDC函數(shù),以便在打印時檢測是否到了文檔的末尾。如果已經(jīng)沒有文檔需要打印了,將CPrintlnfo結(jié)構(gòu)的m_bContinuePrinting成員設(shè)為FALSEo要按頁發(fā)送打印機的轉(zhuǎn)義序列碼。要在OnPrepareDC中發(fā)送轉(zhuǎn)義序列碼,則應(yīng)調(diào)用pDC成員的Escape成員函數(shù)。除了該函數(shù),視圖類還提供了其他4個關(guān)于打印的函數(shù)。OnBeginPrinting函數(shù):重載該函數(shù)可以創(chuàng)建打印文檔所需要的資濾。OnEndPrinting函數(shù):重載該函數(shù)可以釋放在OnBeginPrintingSift中創(chuàng)建的資源。OnPreParePrinting函數(shù):重載該函數(shù)可以提供文檔

50、的最大打印頁數(shù)。OnPrint數(shù):重載該函數(shù)可以提供如打印頁眉頁腳等的附加打印服務(wù)。=.733視圖的操作方法-CView類及其派生視圖類是用戶的數(shù)據(jù)窗口,它控制著應(yīng)用程序文檔內(nèi)容的顯示以及用戶和應(yīng)用程序文檔的交互。同時,CView類的派生類分別支持各種不同的功能,可以根據(jù)需要選擇適當?shù)呐缮悺OOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)對視圖操作的一般步驟如下:(1)獲得與其相關(guān)聯(lián)的文檔對象指針。在視圖類中可用GetDocument獲取與之關(guān)聯(lián)的文檔對象的指針,取得對文檔數(shù)據(jù)、對塚、對彖棄合的訪

51、問。例如,CDocument*pDoc=GetDocument()0(2)在OnDraw函數(shù)中添加要重新繪制的模塊。在OnDraw函數(shù)中對需要重新繪制的功能模塊再次操作,以避免在刷新視圖時所繪內(nèi)容丟失。例如,在該函數(shù)外繪制了一條直線pDC-LineTo(50,100),如果沒有在這個函數(shù)內(nèi)重新調(diào)用繪制直線的操作,古視圖刷新后將看不到所繪直線。(3)使用0nUpdate函數(shù)更新、同步數(shù)據(jù)。OnUpdate函數(shù)負責更新數(shù)據(jù),提供對文檔正確顯示的支持。數(shù)據(jù)一旦發(fā)生變化,利用這個函數(shù)就可以保持文檔和視圖中數(shù)據(jù)的一致性。(4)通過界面與用戶交互。Windows標準消息是直接發(fā)送到視圖對象的。在處理各種命

52、令消息時,視圖類的優(yōu)先級也比較高,而且視圖中顯示文檔數(shù)據(jù)。因此,使用視圖對象對用戶輸入進行響應(yīng)是理所當然的。刷新視圖時默認的函數(shù)調(diào)用過程是CDocument:llpdateAIIViews()-CView:Onllpdate()-CWnd:Invalidate()-OnPaint()-OnDraw()oBOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)7.4基礎(chǔ)實例j,單文檔應(yīng)用程序1編程要求編寫一個簡易的存儲學(xué)生成績信息的程序,具體功能要求為:首先通過對話框來輸入一個學(xué)生記錄,包括學(xué)生的姓名、學(xué)號和

53、3門課程的成績。然后,將記錄內(nèi)容保存到一個對象數(shù)組集合類對象中,最后通過文檔序列化將記錄保存到一個文件中。當添加記錄或打開一個記錄文件時,還會將數(shù)據(jù)顯示在文檔窗口(視圖)中。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)2.編程實現(xiàn)1)添加用于輸入學(xué)生成績信息的對話框2)添加一個CStudentScore類并使其可序列化3)添加并處理菜單項4)完善代碼5)編譯運行并測試,結(jié)果如圖7-10所示BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?Ccreat

54、eContext*pContext)BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)7.5提高實例多文檔應(yīng)用程序-1編程要求編寫一個一檔多視的程序,在各自MDI文檔窗口中包含同一個視圖類的多個視圖對象。這個實例可以為同一個文檔數(shù)據(jù)提供兩種不同的顯示和編輯方式,其效果如圖7J1所示。BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)BOOLCniaiiiFrame:OnCreateCline(LPCREATESTRUCTcs?CcreateContext*pContext)在左邊的窗格中,用戶可以輸入起點坐標和終點坐標,相應(yīng)的右邊窗格中就會顯示出以輸入的起點和終點為坐標的一條直線;也可以在右邊窗格中通過按鼠標左鍵拖動的方法改變左邊窗格中的

溫馨提示

  • 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

提交評論