mfc創(chuàng)建和使用應(yīng)用程序框架_第1頁
mfc創(chuàng)建和使用應(yīng)用程序框架_第2頁
mfc創(chuàng)建和使用應(yīng)用程序框架_第3頁
mfc創(chuàng)建和使用應(yīng)用程序框架_第4頁
mfc創(chuàng)建和使用應(yīng)用程序框架_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 4.1 應(yīng)用程序框架和向?qū)?4.2 應(yīng)用程序向?qū)傻奈募?4.3 ClassWizard類向?qū)е饕獌?nèi)容14.1 應(yīng)用程序框架和向?qū)? 同一類型應(yīng)用程序的結(jié)構(gòu)大致相同,并有很多相同的源代碼,因此可以通過一個(gè)應(yīng)用程序框架AFX(Application FrameWorks)編寫同一類型應(yīng)用程序的通用源代碼。何為應(yīng)用程序框架?3與其它可視化開發(fā)工具一樣,Visual C+提供了創(chuàng)建應(yīng)用程序框架的向?qū)ppWizard和相關(guān)的開發(fā)工具。向?qū)?shí)質(zhì)上是一個(gè)源代碼生成器,利用應(yīng)用程序向?qū)Э梢钥焖賱?chuàng)建各種風(fēng)格的應(yīng)用程序框架,自動生成程序通用的源代碼,這樣大大減輕了手工編寫代碼的工作量。何為應(yīng)用程序向?qū)В?

2、主要向?qū)ь愋虳atebase Project:創(chuàng)建數(shù)據(jù)庫項(xiàng)目MFC ActiveX Control Wizard:創(chuàng)建基于MFC的ActiveX控件MFC AppWizarddll:創(chuàng)建基于MFC的動態(tài)鏈接庫MFC AppWizardexe:創(chuàng)建基于MFC的應(yīng)用程序(最常用)New Database Wizard:在SQL服務(wù)器上創(chuàng)建一個(gè)SQL Server數(shù) 據(jù)庫Win32 Application:創(chuàng)建Win32應(yīng)用程序,可不使用MFC,采 用SDK方法編程Win32 Console Application:創(chuàng)建DOS下的Win32控制臺應(yīng)用程 序,采用C+或C語言進(jìn)行編程Win32 Dyn

3、amic-link Library:創(chuàng)建Win32動態(tài)鏈接庫,采用 SDK方法Win32 Static Library:創(chuàng)建Win32靜態(tài)鏈接庫,采用SDK方法5引入應(yīng)用程序向?qū)У哪康模簽榱吮苊獬绦騿T重復(fù)編寫代碼。 區(qū)別于DOS程序,即使一個(gè)簡單的Windows程序:它也必須顯示一個(gè)程序運(yùn)行窗口,需要編寫復(fù)雜的程序代碼。而同一類型應(yīng)用程序的框架窗口風(fēng)格是相同的,如相同的菜單欄、工具欄、狀態(tài)欄和用戶區(qū)。基本菜單命令的功能也是一樣的,如相同的文件操作和編輯命令。6MFC AppWizardexe的功能:MFC AppWizardexe是創(chuàng)建基于MFC的Windows應(yīng)用程序的向?qū)?。即使不添加任何?/p>

4、碼,當(dāng)執(zhí)行編譯、鏈接命令后,Visual C+ IDE 將生成一個(gè)Windows界面風(fēng)格的應(yīng)用程序。MFC應(yīng)用程序框架將那些每個(gè)應(yīng)用程序都共同需要使用的代碼封裝起來,如默認(rèn)的程序初始化功能、建立應(yīng)用程序界面和處理基本的Windows消息,使程序員不必做這些重復(fù)的工作,把精力放在編寫實(shí)質(zhì)性的代碼上。7例1: 編寫一個(gè)單文檔應(yīng)用程序Mysdi,程序運(yùn)行后在程序視圖窗口顯示信息“這是一個(gè)單文檔程序!”。8910Single document:單文檔界面應(yīng)用程序,程序運(yùn)行后出現(xiàn)標(biāo)準(zhǔn)的Windows界面,它由框架(包括菜單欄、工具欄和狀態(tài)欄)和客戶區(qū)組成。并且程序運(yùn)行后一次只能打開一個(gè)文檔,如Windo

5、ws自帶的記事本Notepad。Multiple documents:多文檔界面應(yīng)用程序,程序運(yùn)行后出現(xiàn)標(biāo)準(zhǔn)的Windows界面,并且可以同時(shí)打開多個(gè)文檔,如Word。Dialog based:基于對話框的應(yīng)用程序,程序運(yùn)行后首先出現(xiàn)一個(gè)對話框界面,如計(jì)算器Calculator。Step1 :創(chuàng)建應(yīng)用程序的類型1112None:向?qū)?chuàng)建的應(yīng)用程序不包括對數(shù)據(jù)庫的操作功能,但以后可以手工添加對數(shù)據(jù)庫的操作代碼(默認(rèn)項(xiàng))。Header files only:提供了最簡單的數(shù)據(jù)庫支持,僅在項(xiàng)目的stdAfx.h文件中使用#include指令包含afxdb.h和afxdao.h兩個(gè)用于定義數(shù)據(jù)庫類的頭

6、文件,但并不生成與數(shù)據(jù)庫相關(guān)的類,用戶需要時(shí)可以自己生成。Database view without :包含了所有的數(shù)據(jù)庫頭文件,并生成了相關(guān)的數(shù)據(jù)庫類和視圖類,但不支持文檔的序列化,向?qū)?chuàng)建的應(yīng)用程序的File主菜單中將不包含有關(guān)文件操作的菜單命令項(xiàng)。 Database view with :包含了所有的數(shù)據(jù)庫頭文件,生成了相關(guān)的數(shù)據(jù)庫類和視圖類,支持文檔的序列化。Step 2 of 6選擇應(yīng)用程序所支持的數(shù)據(jù)庫方式:1314None:應(yīng)用程序不支持任何復(fù)合文檔(默認(rèn)項(xiàng))。Container:應(yīng)用程序作為復(fù)合文檔容器,能容納所嵌入或鏈接的復(fù)合文檔對象。Mini-server:微型復(fù)合文檔服務(wù)

7、器,應(yīng)用程序可以創(chuàng)建和管理復(fù)合文檔對象,但對于它所創(chuàng)建的復(fù)合文檔對象,集成應(yīng)用程序可以嵌入,但不能鏈接。微型服務(wù)器不能作為一個(gè)單獨(dú)的程序運(yùn)行,而只能由集成應(yīng)用程序來啟動。Full-server:完全復(fù)合文檔服務(wù)器,除了具備上面微型服務(wù)器的功能外,應(yīng)用程序支持鏈接式對象,并可作為一個(gè)單獨(dú)的程序運(yùn)行。Both container and server:應(yīng)用程序既可作為一個(gè)復(fù)合文檔容器,又可作為一個(gè)可單獨(dú)運(yùn)行的復(fù)合文檔服務(wù)器。Step 3 of 6選擇應(yīng)用程序所支持的數(shù)據(jù)庫方式復(fù)合文檔類型,包括以下選項(xiàng):1516Docking toolbar:應(yīng)用程序具有標(biāo)準(zhǔn)的工具欄(默認(rèn)項(xiàng))Initial sta

8、tus bar:應(yīng)用程序具有標(biāo)準(zhǔn)的狀態(tài)欄(默認(rèn)項(xiàng))Printing and print preview:應(yīng)用程序支持打印和打印預(yù)覽功能(默認(rèn)項(xiàng))Context-sensitive Help:應(yīng)用程序具有上下文相關(guān)幫助功能3D controls:應(yīng)用程序界面具有三維外觀(默認(rèn)項(xiàng))Normal:應(yīng)用程序采用傳統(tǒng)風(fēng)格的工具欄(默認(rèn)項(xiàng))Internet Explorer ReBars:應(yīng)用程序采用IE風(fēng)格的工具欄How many files would you like on your recent : 在File主菜單可列出文檔的最多個(gè)數(shù)。Advanced按鈕:進(jìn)行更高一級的設(shè)置,如修改文件名或擴(kuò)展

9、名,調(diào)整程序用戶界面窗口的樣式(邊框厚度和最小化、最大化、關(guān)閉按鈕)。Step 4 of 6設(shè)置界面特征(工具欄和狀態(tài)欄)1718MFC Standard:應(yīng)用程序采用MFC標(biāo)準(zhǔn)風(fēng)格(默認(rèn)項(xiàng))Windows Explorer:應(yīng)用程序采用Windows資源管理器 風(fēng)格選擇向?qū)欠駷樵创a生成注釋設(shè)置MFC庫與應(yīng)用程序的鏈接方式: (1) As a shared DLL:采用共享動態(tài)鏈接庫的方式(默認(rèn)項(xiàng)) ,即在程序運(yùn)行時(shí)才調(diào)用MFC庫。采用此方式可減少應(yīng)用程序的代碼長度。 (2) As a statically linked library:采用靜態(tài)鏈接庫的方式,即在編譯時(shí)把MFC庫與應(yīng)用程序

10、相鏈接。采用此方式能提高運(yùn)行速度,且不用考慮程序最終運(yùn)行環(huán)境中是否安裝了MFC庫。Step 5 of 6設(shè)置項(xiàng)目的風(fēng)格:1920 Step 6 of 6:列出了向?qū)?chuàng)建的類用戶可以修改一些類默認(rèn)的類名和對應(yīng)的頭文件名、實(shí)現(xiàn)文件名。對某些類還可以選擇不同的基類。21在視圖類的成員函數(shù)OnDraw()中實(shí)現(xiàn)屏幕輸出void CMysdiView:OnDraw(CDC* pDC)CMysdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-TextOut(100,

11、100, “這是一個(gè)單文檔程序!”); / 在坐標(biāo)(100, 100)處顯示文本串 執(zhí)行Build(F7)命令編譯鏈接程序,程序運(yùn)行后將在程序視圖區(qū)域顯示文本串。2223例2 編寫一個(gè)基于對話框的應(yīng)用程序MyDialog,程序運(yùn)行后顯示一個(gè)對話框。 編程說明與實(shí)現(xiàn) 1. 執(zhí)行File|New命令,在New對話框中選擇MFC AppWizardexe項(xiàng),輸入程序名MyDialog。單擊OK按鈕,出現(xiàn)MFC AppWizard-Step 1。 2. 在MFC AppWizard-Step 1中選擇Dialog Based選項(xiàng),單擊Next按鈕,出現(xiàn)MFC AppWizard-Step 2 of 4

12、。 3. 在MFC AppWizard-Step 2 of 4中設(shè)置應(yīng)用程序界面特征。 4. 創(chuàng)建對話框應(yīng)用程序后續(xù)的步驟與創(chuàng)建單文檔或多文檔應(yīng)用程序的Step 5和Step 6 相同。 2425 利用Visual C+編寫Windows應(yīng)用程序可以采取幾種不同的途徑:(1) 利用 Win32應(yīng)用程序接口API(Application Programming Interface)提供的函數(shù),用C語言編寫程序。(2)由于MFC通過類對API的絕大部分功能進(jìn)行了封裝,可以利用MFC,用C+語言編寫程序。(3)利用MFC和MFC AppWizardexe,首先利用 MFC AppWizardexe應(yīng)

13、用程序向?qū)苫镜膽?yīng)用程序框架,然后按照MFC機(jī)制和原理向框架添加具體的應(yīng)用代碼。Windows應(yīng)用程序的開發(fā)流程 26根據(jù)應(yīng)用程序特性在MFC AppWizardexe應(yīng)用程序向?qū)Ц鞑襟E對話框中進(jìn)行選擇,創(chuàng)建一個(gè)應(yīng)用程序的框架。利用資源編輯器為程序編輯或添加資源,如編輯菜單、添加對話框等。利用ClassWizard類向?qū)Щ蚴止ぬ砑宇?、成員變量和成員函數(shù)的聲明。根據(jù)需要編寫具體的函數(shù)代碼。編寫一個(gè)實(shí)現(xiàn)具體功能的MFC應(yīng)用程序的步驟:27編譯、鏈接程序。如果程序有語法錯誤,需要修改源程序。直到?jīng)]有編譯、鏈接錯誤,才能得到可執(zhí)行程序。測試應(yīng)用程序各項(xiàng)功能,如果程序沒有實(shí)現(xiàn)程序設(shè)計(jì)所要求的功能,啟

14、動Debug調(diào)試器進(jìn)行調(diào)試,找出并修改程序設(shè)計(jì)中的邏輯錯誤。2829資源編輯器: 為程序添加具體的代碼時(shí)還經(jīng)常要用到資源編輯器。編輯應(yīng)用程序需要的各種資源文件,如菜單,工具欄,對話框,圖標(biāo),位圖等。30 編程時(shí),除了編輯現(xiàn)有的資源,有時(shí)需要向項(xiàng)目添加新的資源,這時(shí)可以利用Insert菜單創(chuàng)建一個(gè)新的資源。 打開Insert菜單,選擇Resource菜單項(xiàng),出現(xiàn)Insert Resource對話框,如下圖所示,在Resource Type框中選擇一個(gè)資源類型,單擊New按鈕即可向項(xiàng)目添加一個(gè)資源。31ClassWizard: Visual C+ IDE為MFC提供了大量的支持工具,除了MFC A

15、ppWizardexe向?qū)В€提供了ClassWizard類向?qū)?,利用它程序員可以方便地增加或刪除新類和對消息的處理。32總 結(jié)我們可以為Visual C+ MFC編程作一個(gè)形象的總結(jié): MFC應(yīng)用程序框架使我們的程序設(shè)計(jì)工作猶如做填充題。 Developer Studio中的集成工具使我們的程序設(shè)計(jì)工作猶如做選擇題,程序員猶如軟件集成裝配車間里的技術(shù)工人。334.2 應(yīng)用程序向?qū)傻奈募?4 MFC AppWizardexe向?qū)П仨毷紫葎?chuàng)建一個(gè)項(xiàng)目,并為項(xiàng)目生成一系列初始文件,如:C+頭文件、C+源文件、資源文件和項(xiàng)目文件,其中的C+文件都是以MFC派生類為單元來組織的。 4.2.1 應(yīng)用

16、程序向?qū)傻奈募愋?35Visual C+中通用的文件類型后綴類型說明dsw工作區(qū)文件將項(xiàng)目的詳細(xì)情況組合到工作區(qū)中dsp項(xiàng)目文件存儲項(xiàng)目的詳細(xì)情況并替代mak文件hC+頭文件存儲類的定義代碼cppC+源文件存儲類的成員函數(shù)的實(shí)現(xiàn)代碼rc資源腳本文件存儲菜單、工具欄和對話框等資源rc2資源文件用來將資源包含到項(xiàng)目中ico圖標(biāo)文件存儲應(yīng)用程序圖標(biāo)bmp位圖文件存儲位圖clw類向?qū)募鎯lassWizard類向?qū)褂玫念愋畔?6Visual C+中類的支持文件一般而言,C+中的一個(gè)類由頭文件h和源文件cpp兩類文件支持。頭文件用于定義類,包括指明派生關(guān)系、聲明成員變量和成員函數(shù),消息映射聲

17、明等。源文件用于實(shí)現(xiàn)類,主要定義成員函數(shù)的實(shí)現(xiàn)代碼和消息映射的實(shí)現(xiàn)。374.2.2 應(yīng)用程序向?qū)傻念^文件 一般應(yīng)用程序框架中所有類的名字由MFC AppWizardexe向?qū)Ц鶕?jù)一定的規(guī)則自動命名,但用戶可以在向?qū)У牡?步改變類名和有關(guān)類的文件名。應(yīng)用程序框架中類(框架窗口類例外)的命名規(guī)則一般遵照如下要求: Class Name = C + ProjectName + ClassType38 注:在定義類的頭文件中的開始位置(類的正式定義前)有一段預(yù)處理命令代碼,這些代碼是為Developer Studio自身準(zhǔn)備的,如用于保證頭文件在編譯時(shí)僅被編譯一次。Developer Studio

18、中的資源編輯器、ClassWizard類向?qū)Ш途幾g器都可能用到這些代碼。這些代碼如下形式所示: #if !defined(AFX_MAINFRM_H_DE1F30C9_677C_11D6_888#define AFX_MAINFRM_H_DE1F30C9_677C_11D6_888#if _MSC_VER 1000#pragma once#endif / _MSC_VER 100039向?qū)轫?xiàng)目Mysdi生成了框架窗口類的頭文件MainFrm.h,該頭文件用于定義框架窗口類CMainFrame。不同的SDI應(yīng)用程序,其框架窗口類名和文件名是統(tǒng)一的。CMainFrame類是MFC的CFrameW

19、nd類的派生類,它主要負(fù)責(zé)創(chuàng)建標(biāo)題欄、菜單欄、工具欄和狀態(tài)欄。CMainFrame類中聲明了框架窗口中的工具欄m_wndToolBar、狀態(tài)欄m_wndStatusBar兩個(gè)成員變量和四個(gè)成員函數(shù)。1. 框架窗口類頭文件 40 向?qū)轫?xiàng)目Mysdi生成了文檔類的頭文件MysdiDoc.h,該頭文件用于定義文檔類CMysdiDoc。CMysdiDoc類是MFC的CDocument類的派生類,它主要負(fù)責(zé)應(yīng)用程序數(shù)據(jù)的保存和裝載,實(shí)現(xiàn)文檔的序列化功能。2. 文檔類頭文件 41向?qū)轫?xiàng)目Mysdi生成了視圖類的頭文件MysdiView.h,該頭文件用于定義視圖類CMysdiView。視圖類用于處理客戶

20、區(qū)窗口,它是框架窗口中的一個(gè)子窗口。CMysdiView類是MFC的CView類的派生類,它主要負(fù)責(zé)客戶區(qū)文檔數(shù)據(jù)的顯示,以及如何進(jìn)行人機(jī)交互。 3. 視圖類頭文件 42 向?qū)轫?xiàng)目Mysdi生成了應(yīng)用程序類的頭文件Mysdi.h,該頭文件用于定義應(yīng)用程序類CMysdiApp。CMysdiApp類是MFC的CWinApp類的派生類,它主要負(fù)責(zé)完成應(yīng)用程序的初始化、程序的啟動和程序運(yùn)行結(jié)束時(shí)的清理工作。 4. 應(yīng)用程序類頭文件 43在項(xiàng)目中,資源通過資源標(biāo)識符加以區(qū)別,通常將一個(gè)項(xiàng)目中所有的資源標(biāo)識符放在頭文件Resourde.h中定義。向?qū)轫?xiàng)目Mysdi生成了資源頭文件Resource.h,

21、該文件用于定義項(xiàng)目中所有的資源標(biāo)識符,給資源ID分配一個(gè)整數(shù)值。標(biāo)識符的命名有一定的規(guī)則,如IDR_MAINFRAME代表有關(guān)主框架的資源,包括主菜單、工具欄及圖標(biāo)等。標(biāo)識符以不同的前綴開始,見下表。 5. 資源頭文件 44標(biāo)識符前綴說明IDR_主菜單、工具欄、應(yīng)用程序圖 標(biāo)和快捷鍵表IDD_對話框IDC_控件和光標(biāo)IDS_字符串IDP_提示信息對話框的字符串ID_菜單命令項(xiàng)MFC中資源標(biāo)識符前綴 45向?qū)轫?xiàng)目Mysdi生成了標(biāo)準(zhǔn)包含頭文件StdAfx.h,該文件用于包含一般情況下要用到且的頭文件,如MFC類的聲明文件afxwin.h、使用工具欄和狀態(tài)欄的文件afxext.h,這些頭文件一般

22、都存放在路徑“Microsoft Visual StudioVC98MFCInclude”下。StdAfx.h文件和StdAfx.cpp文件用來生成預(yù)編譯文件。6. 標(biāo)準(zhǔn)包含頭文件 46對應(yīng)于一個(gè)頭文件中定義的類,都有一個(gè)類的實(shí)現(xiàn)文件。在實(shí)現(xiàn)文件中主要定義在頭文件中聲明的成員函數(shù)的實(shí)現(xiàn)代碼和消息映射。 值得說明的是:向?qū)傻某蓡T函數(shù)有很多,不要因?yàn)闆]有使用某個(gè)成員函數(shù)而刪除其聲明和實(shí)現(xiàn)代碼。并且,用戶一般不要輕易修改文件中那些以灰色字體顯示的代碼,因?yàn)檫@些代碼是通過資源編輯器或ClassWizard類向?qū)нM(jìn)行維護(hù)的。4.2.3 應(yīng)用程序向?qū)傻膶?shí)現(xiàn)文件47 向?qū)轫?xiàng)目Mysdi生成了框架窗

23、口類的實(shí)現(xiàn)文件Mainfrm.cpp,該文件包含了窗口框架類CMainFrame的實(shí)現(xiàn)代碼,主要是CMainFrame類成員函數(shù)的實(shí)現(xiàn),它實(shí)現(xiàn)的框架窗口是應(yīng)用程序的主窗口。1. 框架窗口類實(shí)現(xiàn)文件 CMainFrame類的四個(gè)主要成員函數(shù): AssertValid():診斷CMainFrame對象是否有效,調(diào)試用。 Dump():輸出CMainFrame對象的狀態(tài)信息,調(diào)試用。 OnCreate():創(chuàng)建工具欄m_wndToolBar和狀態(tài)欄m_wndStatusBar。而視圖窗口是由基類CFrameWnd的成員函數(shù)OnCreate()通過調(diào)用OnCreateClient()函數(shù)創(chuàng)建的。 Pr

24、eCreateWindow():如果要創(chuàng)建一個(gè)非默認(rèn)風(fēng)格的窗口,可以重載該函數(shù)(虛函數(shù)),在函數(shù)中通過修改CREATESTRUCT結(jié)構(gòu)參數(shù)cs來改變窗口類、窗口風(fēng)格、窗口大小和位置等。48例1: 修改程序Mysdi,使程序運(yùn)行窗口沒有最大化按鈕。BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) if( !CFrameWnd:PreCreateWindow(cs) )return FALSE; / TODO: Modify the Window class or styles here cs.style&=WS_MAXIMIZEBOX; / 取消

25、窗口的最大化按鈕 return TRUE;49 向?qū)轫?xiàng)目Mysdi生成了文檔類的實(shí)現(xiàn)文件MysdiDoc.cpp。與框架類CMainFrame類似,文檔類CMysdiDoc也定義了兩個(gè)用于調(diào)試的成員函數(shù)AssertValid()和Dump。2. 文檔類實(shí)現(xiàn)文件 文檔類CMysdiDoc的成員函數(shù): AssertValid() Dump() OnNewDocument():當(dāng)用戶執(zhí)行File菜單中New命令時(shí),MFC應(yīng)用程序框架會調(diào)用函數(shù)OnNewDocument()來完成新建文檔的工作。 Serialize():負(fù)責(zé)文檔數(shù)據(jù)的磁盤讀寫操作。50 注意:由于SDI單文檔應(yīng)用程序中只處理一個(gè)文檔

26、對象,當(dāng)執(zhí)行New命令時(shí),文檔對象已經(jīng)生成,因此文檔類CMysdiDoc的構(gòu)造函數(shù)不會再被調(diào)用。所以,SDI應(yīng)用程序不要在構(gòu)造函數(shù)中進(jìn)行文檔對象成員變量的初始化,而應(yīng)在OnNewDocument()函數(shù)中(看后面的例子)。在文檔派生類CMysdiDoc重載的OnNewDocument()函數(shù)中,首先需要調(diào)用基類CDocument的OnNewDocument()函數(shù)。513. 視圖類實(shí)現(xiàn)文件 向?qū)轫?xiàng)目Mysdi生成了視圖類的實(shí)現(xiàn)文件MysdiView.cpp,該文件主要定義了視圖類的成員函數(shù)。視圖對象是用來顯示文檔對象的內(nèi)容。視圖類CMysdiView也定義了兩個(gè)用于調(diào)試的成員函數(shù)Assert

27、Valid()和Dump()。 視圖類CMysdiView的成員函數(shù):GetDocument():用于獲取當(dāng)前文檔對象的指針m_pDocument。如果是建立程序的Release發(fā)行版,函數(shù)GetDocument()作為內(nèi)嵌(inline)函數(shù)來實(shí)現(xiàn)。OnDraw():虛函數(shù),它負(fù)責(zé)文檔對象的數(shù)據(jù)在用戶視圖區(qū)的顯示輸出。52例2:修改程序Mysdi,為CMysdiDoc文檔類定義一個(gè)字符串類型的成員變量,在OnNewDocument()函數(shù)中初始化成員變量。在OnDraw()函數(shù)中訪問該成員變量,并在屏幕上輸出它的值。 (1)在頭文件MysdiDoc.h文檔類CMysdiDoc的定義中增加成員

28、變量m_szText,用于保存將要顯示的文本信息:public:char* m_szText;53(2)在文檔類實(shí)現(xiàn)文件MysdiDoc.cpp中找到成員函數(shù)OnNewDocument(),添加初始化m_szText的代碼: BOOL CMysdiDoc:OnNewDocument( ) if (!CDocument:OnNewDocument()return FALSE; / TODO: add reinitialization code here, m_szText = “這是一個(gè)單文檔程序!”; / 初始化 return TRUE; 54(3)在視圖類實(shí)現(xiàn)文件MysdiView.cpp中

29、找到成員函數(shù)OnDraw(),void CMysdiView:OnDraw(CDC* pDC) / pDC是當(dāng)前輸出設(shè)備環(huán)境的指針 CMysdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / 得到當(dāng)前文檔指針pDoc / TODO: add draw code for native data here pDC-TextOut(100, 100, pDoc-m_szText); / 通過pDoc訪問文檔對象的成員變量55 向?qū)轫?xiàng)目Mysdi生成了應(yīng)用程序類的實(shí)現(xiàn)文件Mysdi.cpp,該文件是應(yīng)用程序的主文件,MFC應(yīng)用程序的初始化、啟動運(yùn)行和

30、結(jié)束都是由應(yīng)用程序?qū)ο笸瓿?。CMyWinApp theApp;Bool InitInstance()4. 應(yīng)用程序類實(shí)現(xiàn)文件 56 向?qū)轫?xiàng)目Mysdi生成了標(biāo)準(zhǔn)包含文件StdAfx.cpp,該文件用于包含StdAfx.h標(biāo)準(zhǔn)包含頭文件。StdAfx.cpp文件用于生成項(xiàng)目的預(yù)編譯頭文件(Mysdi.pch)和預(yù)編譯類型信息文件(StdAfx.obj)。 由于大多數(shù)MFC應(yīng)用程序的實(shí)現(xiàn)文件都包含StdAfx.h頭文件(其中包含了一些共同要使用的頭文件),如果在每個(gè)實(shí)現(xiàn)文件中都重新編譯StdAfx.h頭文件,整個(gè)編譯過程將浪費(fèi)大量的時(shí)間。為了提高編譯速度,可以首先將項(xiàng)目中那些共同要使用的頭文件編

31、譯出來,首次編譯后將結(jié)果存放在一個(gè)名為預(yù)編譯頭文件的中間文件中,以后再編譯時(shí)直接讀出存儲的結(jié)果,無需重新編譯,節(jié)約了編譯時(shí)間。5. 標(biāo)準(zhǔn)包含文件 57 Windows編程的一個(gè)主要特點(diǎn)是資源和代碼的分離,即將菜單、工具欄、字符串表、對話框等資源與基本的源代碼分開。優(yōu)點(diǎn): 這樣使得對這些資源的修改獨(dú)立于源代碼。例如,可以將字符串表翻譯成另一種語言,而無需改動任何源代碼。 當(dāng)Windows裝入一個(gè)應(yīng)用程序時(shí),一般情況下,程序的資源數(shù)據(jù)并不同時(shí)裝入內(nèi)存,而是在應(yīng)用程序執(zhí)行過程中需要時(shí)如創(chuàng)建窗口、顯示對話框或裝載位圖,才從硬盤讀取相應(yīng)的資源數(shù)據(jù)。4.2.4 應(yīng)用程序生成的資源文件 581資源文件 向?qū)?/p>

32、為項(xiàng)目Mysdi生成了資源文件Mysdi.rc和Mysdi.rc2。Mysdi.rc是Visual C+生成的腳本文件,它使用標(biāo)準(zhǔn)的Windows資源定義語句,可通過資源編譯器轉(zhuǎn)換為二進(jìn)制資源。一般利用資源編輯器對資源進(jìn)行可視化編輯,也可通過Open命令以文本方式打開一個(gè)資源文件進(jìn)行編輯。Mysdi.rc2文件一般用于定義資源編輯器不能編輯的資源。2圖標(biāo)文件 向?qū)轫?xiàng)目Mysdi生成了應(yīng)用程序的圖標(biāo)文件Mysdi.ico。在Visual C+中,可利用圖形編輯器編輯應(yīng)用程序的圖標(biāo)。3文檔圖標(biāo)文件 向?qū)轫?xiàng)目Mysdi生成了文檔圖標(biāo)文件MysdiDoc.ico。文檔圖標(biāo)一般用于多文檔應(yīng)用程序中,

33、在程序Mysdi中沒有顯示這個(gè)圖標(biāo),但編程時(shí)用戶可以利用相關(guān)函數(shù)來獲取該圖標(biāo)資源并顯示圖標(biāo)(ID為IDR_MYSDITYPE)。4工具欄按鈕位圖文件 向?qū)轫?xiàng)目Mysdi生成了工具欄按鈕的位圖文件Toolbar.bmp,該位圖是應(yīng)用程序工具欄中所有按鈕的圖形表示。59 除了上述用于生成可執(zhí)行程序的源代碼文件和資源文件,向?qū)н€為項(xiàng)目生成了其它一些在開發(fā)環(huán)境中必須使用的文件,如項(xiàng)目文件、項(xiàng)目工作區(qū)文件和ClassWizard類向?qū)募?項(xiàng)目文件 項(xiàng)目用項(xiàng)目文件DSP(Developer Studio Project)來描述,向?qū)轫?xiàng)目Mysdi生成了項(xiàng)目文件Mysdi.dsp,該文件將項(xiàng)目中的所

34、有文件組織成一個(gè)整體。項(xiàng)目文件保存了有關(guān)源代碼文件、資源文件以及你所指定的編譯設(shè)置等信息。4.2.5 應(yīng)用程序生成的其他文件 602項(xiàng)目工作區(qū)文件 為了創(chuàng)建應(yīng)用程序,必須在Developer Studio的工作區(qū)中打開項(xiàng)目,這些應(yīng)用程序項(xiàng)目工作區(qū)設(shè)置信息保存在項(xiàng)目工作區(qū)文件DSW(Developer Studio Workspace)中。向?qū)轫?xiàng)目Mysdi生成了項(xiàng)目工作區(qū)文件Mysdi.dsw,該文件將一個(gè)DSP項(xiàng)目文件與具體的Developer Studio結(jié)合在一起,它保存了上一次操作結(jié)束時(shí)窗口狀態(tài)、位置以及工作區(qū)設(shè)置信息。3類向?qū)募?向?qū)轫?xiàng)目Mysdi生成了類向?qū)募﨧ysdi.c

35、lw,該文件存儲了ClassWizard類向?qū)褂玫念愋畔?,如類信息的版本、類的?shù)量、每個(gè)類的頭文件和實(shí)現(xiàn)文件。利用ClassWizard類向?qū)r(shí)要使用該文件。如果從項(xiàng)目中刪除了clw文件,下次使用ClassWizard類向?qū)r(shí)會出現(xiàn)提示對話框,詢問是否想重新創(chuàng)建這個(gè)文件。614.3 ClassWizard類向?qū)?24.3 ClassWizard類向?qū)Ю脩?yīng)用程序向?qū)蒑FC應(yīng)用程序框架后,用戶需要為自己的MFC派生類添加消息處理成員函數(shù)和對話框控件的成員變量,有時(shí)還需要為程序添加新的MFC派生類,這時(shí)用戶需要使用ClassWizard類向?qū)А?34.3.1 ClassWizard的功能Cl

36、assWizard有五個(gè)頁面:Message Maps頁面用來處理消息映射,為消息添加或刪除處理函數(shù);Member Variables面頁用來給對話框類添加或刪除成員變量(與控件關(guān)聯(lián));Automation頁面提供了對OLE自動化類的屬性和方法的管理;ActiveX Events頁面用于管理ActiveX類所支持的ActiveX事件;Class Info頁面顯示應(yīng)用程序中所包含類的信息。64654.3.2 添加消息處理函數(shù) ClassWizard類向?qū)У腗essage Maps頁面主要用于添加與消息處理有關(guān)的代碼,包括添加消息映射宏和消息處理函數(shù)。Message Maps頁面有五個(gè)列表框: P

37、roject框列出當(dāng)前工作區(qū)中的項(xiàng)目 Class name框列出當(dāng)前項(xiàng)目中的類 Object IDs框列出當(dāng)前類所有能接收消息的對象(ID),包括類、菜單項(xiàng)和控件 Messages框列出在Object IDs框中選擇的對象可處理的消息和可重載的MFC虛函數(shù) Member functions框列出當(dāng)前類已創(chuàng)建的消息處理函數(shù),其中的“V”標(biāo)記表示該函數(shù)是虛函數(shù),“W”標(biāo)記表示該函數(shù)是窗口消息處理函數(shù)66當(dāng)在Messages框選擇一個(gè)消息后:單擊Add Function按鈕添加一個(gè)消息處理函數(shù)。單擊Edit Code按鈕將退出ClassWizard,打開源代碼編輯器并定位到指定的消息處理函數(shù)。單擊Delete Function按鈕可以刪除已建立的消息處理函數(shù)。注意:為了避免不小心刪除了函數(shù)代碼,此時(shí)只在頭文件中刪除了函數(shù)聲明,在源文件中刪除了消息映射項(xiàng),實(shí)際的函數(shù)代碼必須用戶自己手工刪除。添加、編輯、刪除成員函數(shù)67例 編寫一個(gè)SDI應(yīng)用程序MyMessage,程序運(yùn)行后在程序視圖窗

溫馨提示

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

最新文檔

評論

0/150

提交評論