第5章 MFC應(yīng)用程序概述_第1頁
第5章 MFC應(yīng)用程序概述_第2頁
第5章 MFC應(yīng)用程序概述_第3頁
第5章 MFC應(yīng)用程序概述_第4頁
第5章 MFC應(yīng)用程序概述_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

5.1Windows應(yīng)用程序概述

5.2MFC應(yīng)用程序框架

5.3消息映射與消息處理

5.4

程序調(diào)試

5.5

應(yīng)用實(shí)例第5章MFC應(yīng)用程序概述5.1Windows應(yīng)用程序概述Windows應(yīng)用程序運(yùn)行于Windows操作系統(tǒng)上,與DOS應(yīng)用程序有著本質(zhì)的區(qū)別。所有的Windows應(yīng)用程序都是由消息驅(qū)動的,消息處理是所有Windows應(yīng)用程序的核心。5.1.1窗口窗口是用戶界面中最重要的部分。它是屏幕上與一個應(yīng)用程序相對應(yīng)的矩形區(qū)域,是用戶與產(chǎn)生該窗口的應(yīng)用程序之間的可視界面。5.1.2消息和事件Windows是一個基于事件的消息驅(qū)動系統(tǒng),Windows應(yīng)用程序是按照“事件→消息→處理”非順序的機(jī)制運(yùn)行的。所謂消息,就是用于描述某個事件發(fā)生的信息,而事件是對于Windows的某種操作。事件是因,消息是果,事件產(chǎn)生消息,消息對應(yīng)事件。所謂消息的處理,其實(shí)質(zhì)就是事件的處理。當(dāng)有某個事件(如單擊鼠標(biāo)、鍵盤輸入和執(zhí)行菜單命令等)發(fā)生時(shí),Windows會根據(jù)具體的事件產(chǎn)生對應(yīng)的消息,并發(fā)送到指定應(yīng)用程序的消息隊(duì)列。應(yīng)用程序從消息隊(duì)列中取出消息,并根據(jù)不同的消息進(jìn)行不同的處理。5.1.3基本數(shù)據(jù)類型

Windows編程中常用的基本數(shù)據(jù)類型的別名。5.1.4句柄句柄是Windows編程的基礎(chǔ),所謂句柄就是Windows使用的一種無重復(fù)整數(shù)。句柄主要用來標(biāo)識應(yīng)用程序中的一個對象,如窗口、實(shí)例、菜單、內(nèi)存、輸出設(shè)備、控制或文件等。Windows常見的公用句柄類型如下表所示:由于對應(yīng)的MFC類已對句柄進(jìn)行了封裝,大多數(shù)情況下不再需要訪問句柄。

5.2MFC應(yīng)用程序框架

下面通過一個實(shí)例介紹利用MFCAppWizard[exe]創(chuàng)建應(yīng)用程序框架的步驟。5.2.1創(chuàng)建MFC應(yīng)用程序框架【例5.1】編寫一個SDI單文檔應(yīng)用程序,程序運(yùn)行后,通過消息框輸出“這是一個單文檔應(yīng)用程序!”的提示信息。(1)選擇File菜單下的New菜單項(xiàng),系統(tǒng)彈出New對話框。單擊輸入工程名保存文件路徑默認(rèn)單文檔界面(SDI)應(yīng)用程序。應(yīng)用程序運(yùn)行時(shí),只能打開一個文檔。多文檔界面(MDI)應(yīng)用程序。應(yīng)用程序可以同時(shí)打開多個文檔?;趯υ捒虻膽?yīng)用程序。應(yīng)用程序?qū)@示一個簡單的對話框來處理用戶的輸入,(2)MFCAppWizard-Step1對話框主要用于選擇應(yīng)用程序類型。AppWizard可以創(chuàng)建3種類型的應(yīng)用程序框架。語言種類是否支持文檔/視圖結(jié)構(gòu)(3)MFCAppWizard-Step2of6對話框中主要用于選擇應(yīng)用程序所支持?jǐn)?shù)據(jù)庫方式。不包含任何數(shù)據(jù)庫支持包含最低限度的數(shù)據(jù)庫支持創(chuàng)建對應(yīng)表的一個數(shù)據(jù)庫類和一個視圖類,不附加標(biāo)準(zhǔn)文件支持創(chuàng)建對應(yīng)表的一個數(shù)據(jù)庫類和一個視圖類,并附加標(biāo)準(zhǔn)文件支持(4)在MFCAppWizard-Step3of6對話框中選擇應(yīng)用程序所支持的復(fù)合文檔類型。不支持任何復(fù)合文檔應(yīng)用程序作為復(fù)合文檔容器,包含可以鏈接或嵌入的ActiveX對象應(yīng)用程序僅僅可以創(chuàng)建能夠嵌入到其他應(yīng)用程序中的文檔,但是不能作為一個單獨(dú)運(yùn)行的應(yīng)用程序應(yīng)用程序可以單獨(dú)運(yùn)行,同時(shí)也可以作為一個對象嵌入到其他應(yīng)用程序中應(yīng)用程序能夠作為容器包含嵌入或鏈接的ActiveX對象,同時(shí)也能夠作為一個可以嵌入到其他程序中的對象(5)在MFCAppWizard-Step4of6對話框中設(shè)置應(yīng)用程序的外觀特征。添加工具欄自動生成狀態(tài)欄添加打印和打印預(yù)覽菜單項(xiàng)在幫助菜單中自動添加索引和使用幫助菜單項(xiàng)使應(yīng)用程序的外觀呈三維顯示消息應(yīng)用程序接口應(yīng)用程序具有TCP/IP通信功能傳統(tǒng)風(fēng)格工具條InternetExplorer風(fēng)格工具條(6)在MFCAppWizard-Step5of6對話框中設(shè)置應(yīng)用程序的風(fēng)格。創(chuàng)建標(biāo)準(zhǔn)的MFC應(yīng)用程序創(chuàng)建類似于Windows資源管理器風(fēng)格的應(yīng)用程序在生成的程序框架的源文件中加入注釋不加入注釋信息使用動態(tài)鏈接庫使用靜態(tài)鏈接庫(7)在MFCAppWizard-Step6of6對話框中,可以設(shè)置向?qū)傻奈募皖惷?。設(shè)置類名設(shè)置文件名(8)打開項(xiàng)目工作區(qū)中的ClassView類視圖,單擊CLi2_1View類左邊的“+”展開視圖類,雙擊打開OnDraw()函數(shù),并添加代碼。voidCLi2_1View::OnDraw(CDC*pDC){ CLi2_1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahere

MessageBox("這是一個單文檔應(yīng)用程序!","消息框",MB_ICONEXCLAMATION|MB_OKCANCEL);}(9)選擇Build菜單中的BuildLi2_1.exe菜單項(xiàng),對工程進(jìn)行編譯和鏈接,生成可執(zhí)行文件。再選擇Build菜單中的ExecuteLi2_1.exe菜單命令運(yùn)行程序。MFC應(yīng)用程序框架結(jié)構(gòu)類的繼承關(guān)系:5.2.2MFC應(yīng)用程序框架結(jié)構(gòu)類1.CObject類CObject是MFC類庫的根類,它幾乎描述了所有MFC類的一些公共特性,并且給所有由它派生出的類提供了3種重要特性,即:串行化支持、運(yùn)行時(shí)類信息支持以及診斷和調(diào)試支持。2.CCmdTarget類命令類CCmdTarget是CObject的子類,它是MFC庫中所有具有消息映射屬性的類的公共基類。從CCmdTarget派生的類能在程序運(yùn)行時(shí)動態(tài)創(chuàng)建對象和處理命令消息。3.CWinApp類應(yīng)用程序類CWinApp是CWinThread的子類,封裝了初始化、運(yùn)行、終止應(yīng)用程序的代碼??梢杂纱伺缮约旱膽?yīng)用類。4.CWnd類窗口類CWnd提供了MFC中所有窗口類的基本功能。從CWnd派生的類可以擁有自己的窗口,并對它進(jìn)行控制。5.CFrameWnd類CFrameWnd類是CWnd類的派生類。它是所有其他框架窗口類的基類,主要用來管理一個窗口。CFrameWnd類的對象是一個框架窗口,包括邊框、標(biāo)題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。CFrameWnd類支持單文檔界面,對于多文檔界面,使用它的兩個派生類CMDIFrameWnd和CMDIChildWnd。CMDIFrameWnd類用于MDI的主窗口,CMDIChildWnd類用于MDI的子窗口。6.CView類視圖類CView是CWnd類的子類。視圖類及其派生類用于管理框架窗口的客戶區(qū)。

7.CDocument類文檔類CDocument負(fù)責(zé)裝載和維護(hù)文檔。文檔包括應(yīng)用程序的工作成果或環(huán)境設(shè)置數(shù)據(jù)等,可以是程序需要保存的任何內(nèi)容。一個MFC應(yīng)用程序并不直接操作上述類,而是以上述類為基類派生新的類,從而構(gòu)建Windows應(yīng)用程序的基本框架。例如,應(yīng)用程序Li2_1中的類與這些基類的派生關(guān)系:1.應(yīng)用程序向?qū)傻奈募?/p>

下面以例5.1中創(chuàng)建的應(yīng)用程序?yàn)槔?,介紹MFCAppWizard[exe]向?qū)傻母黝愇募肮δ堋?/p>

5.2.3MFC應(yīng)用程序分析(1)頭文件與實(shí)現(xiàn)文件

MainFrm.h和MainFrm.cpp:定義和實(shí)現(xiàn)窗口框架類CMainFrame。

CLi2_1Doc.h和CLi2_1Doc.cpp:定義和實(shí)現(xiàn)文檔類CLi2_1Doc。

CLi2_1View.h和CLi2_1View.cpp:定義和實(shí)現(xiàn)視圖類CLi2_1View。

CLi2_1.h和CLi2_1.cpp:定義和實(shí)現(xiàn)應(yīng)用程序類CLi2_1App。Resource.h:定義工程中所有資源標(biāo)識符,給資源ID分配一個整數(shù)值。StdAfx.h和StdAfx.cpp:用于建立一個預(yù)編譯的頭文件CLi2_1.PCH和一個預(yù)定義的類型文件StdAfx.obj。(2)資源文件Li2_1.rc和Li2_1.rc2:Li2_1.rc文件是程序所使用的所有Windows資源的列表。Li2_1.ico:應(yīng)用程序的圖標(biāo)所使用的圖標(biāo)文件。Li2_1Doc.ico:應(yīng)用程序的文檔圖標(biāo)文件。文檔圖標(biāo)一般顯示在多文檔程序界面上。Toolbar.bmp:工具欄按鈕的位圖文件。(3)項(xiàng)目工作區(qū)文件和工程文件Li2_1.dsw:保存當(dāng)前工作區(qū)所包含的工程的信息。Li2_1.dsp:包含當(dāng)前工程的設(shè)置、工程中的文件等信息。(4)其他文件Li2_1.clw:該文件是類信息文件。它保存了ClassWizard編輯現(xiàn)有類或增加新類時(shí)需使用的類信息,同時(shí)還保存了創(chuàng)建、編輯消息映射和成員函數(shù)所需的信息。ReadMe.txt:該文件是工程自述文件。主要介紹所創(chuàng)建文件的內(nèi)容和功能,以及添加用戶代碼、更改使用語言的方法。2.應(yīng)用程序的執(zhí)行過程啟動:創(chuàng)建應(yīng)用程序?qū)ο髏heApp、調(diào)用應(yīng)用程序類的構(gòu)造函數(shù)初始化對象theApp。應(yīng)用程序框架調(diào)用MFC提供的AfxWinMain()主函數(shù)。AfxWinMain()主函數(shù),首先通過調(diào)用全局函數(shù)AfxGetApp()來獲取theApp的指針pApp;然后通過該指針調(diào)用theApp的成員函數(shù)InitInstance()來初始化應(yīng)用程序。

在應(yīng)用程序的初始化過程中,同時(shí)還構(gòu)造了文檔模板,產(chǎn)生最初的文檔、視圖和主框架窗口,并生成工具欄和狀態(tài)欄。當(dāng)InitInstance()函數(shù)執(zhí)行完畢后,WinMain()函數(shù)將調(diào)用成員函數(shù)

Run(),進(jìn)入消息處理循環(huán);函數(shù)Run()收到WM_QUIT消息。MFC首先調(diào)用CWinApp類的成員函數(shù)ExitInstance();然后調(diào)用靜態(tài)對象的析構(gòu)函數(shù);退出應(yīng)用程序,將控制權(quán)交給操作系統(tǒng)。消息對話框

一種簡單的對話框,用戶可以直接調(diào)用消息對話框函數(shù)來使用它,而不需要自己創(chuàng)建。VisualC++提供三個消息對話框函數(shù),它們的原型為:intAfxMessageBox(LPCTSTRlpText,UINTnType=MB_OK,UINTnIDHelp=0);intMessageBox(HWNDhWnd,LPCTSTRlpText,LPCTSTRlpCaption,UINTnType);intCWnd::MessageBox(LPCTSTRlpText,LPCTSTRlpCaption=NULL,UINTnType=MB_OK);5.2.4文檔/視圖結(jié)構(gòu)

文檔/視圖體系結(jié)構(gòu)是MFC應(yīng)用程序框架結(jié)構(gòu)的基石,它定義了一種程序結(jié)構(gòu),這種結(jié)構(gòu)利用文檔對象保存應(yīng)用程序的數(shù)據(jù),依靠視圖對象控制視圖顯示數(shù)據(jù),文檔與視圖的關(guān)系是一對多的關(guān)系,也就是說,文檔中的數(shù)據(jù)可以以不同的方式顯示。5.3消息映射與消息處理

Windows消息主要有3種類型:標(biāo)準(zhǔn)Windows消息、控件消息和命令消息。1.標(biāo)準(zhǔn)Windows消息除WM_COMMAND以外,所有以“WM_”為前綴的消息都是標(biāo)準(zhǔn)Windows消息;由窗口類或視圖類處理;都有默認(rèn)的處理函數(shù),它們在CWnd類中進(jìn)行了預(yù)定義。5.3.1消息的類別及其描述標(biāo)準(zhǔn)的Windows消息又分為3類:鍵盤消息、鼠標(biāo)消息和窗口消息。(1)鍵盤消息鍵盤消息與鍵盤某個鍵的動作相關(guān)聯(lián)。常見的鍵盤消息有以下幾種。WM_KEYDOWN、WM_KEYUP:按下、釋放非系統(tǒng)鍵產(chǎn)生的消息。WM_CHAR:輸入非系統(tǒng)字符時(shí)產(chǎn)生的消息。(2)鼠標(biāo)消息鼠標(biāo)消息涉及到鼠標(biāo)的單擊、雙擊、拖動等。常用的鼠標(biāo)消息有以下幾種。

WM_MOUSEMOVE:鼠標(biāo)移動時(shí)產(chǎn)生的消息。

WM_RBUTTONDOWN:鼠標(biāo)右鍵按下時(shí)產(chǎn)生的消息。

WM_LBUTTONDOWN:鼠標(biāo)左鍵按下時(shí)產(chǎn)生的消息。

WM_LBUTTONDBLCLICK:鼠標(biāo)雙擊時(shí)產(chǎn)生的消息。(3)窗口消息窗口消息一般與創(chuàng)建窗口、繪制窗口、移動窗口和銷毀窗口等動作有關(guān)。在MFC應(yīng)用程序中,窗口消息是由視圖類、窗口類及它們的派生類處理的。2.控件消息控件消息是指控件或其他子窗口向父窗口發(fā)送的WM_COMMAND消息。與其他標(biāo)準(zhǔn)的Windows消息一樣,控件消息也應(yīng)該在視圖類、窗口類中進(jìn)行處理。但是,如果用戶單擊按鈕控件時(shí),發(fā)出的控件通知消息BN_CLICKED將作為命令消息來處理。3.命令消息命令消息是由菜單項(xiàng)、工具欄按鈕、快捷鍵等用戶界面對象發(fā)出的WM_COMMAND消息。命令消息與其他消息不同,它可被更廣泛的對象如文檔、文檔模板、應(yīng)用程序?qū)ο?、窗口和視圖等處理。5.3.2MFC消息映射機(jī)制MFC采用消息映射來處理消息;消息映射機(jī)制包括一組消息映射宏,用于把一個Windows消息和其消息處理函數(shù)聯(lián)系起來。所有從CCmdTarget類派生出來的類都能夠擁有自己的消息映射。與MFC消息映射機(jī)制有關(guān)的宏有以下3個:DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(MyClass,MybaseClass)END_MESSAGE_MAP()為了使用消息映射宏:首先在類定義的結(jié)尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射,該宏表示在為各個處理函數(shù)所寫的類聲明之后存在消息映射條目,這些函數(shù)是該類的成員函數(shù)。然后在類的實(shí)現(xiàn)源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏來定義消息映射。MFC應(yīng)用程序MESSAG_MAP消息映射的形式如下:BEGIN_MESSAGE_MAP(MyClass,MybaseClass)//{{AFX_MSG_MAP(MyClass)//ClassWizard維護(hù)消息映射宏的標(biāo)記

ON_... //MFC預(yù)定義消息映射宏

ON_MESSAGE(message,memberFun)//用戶自定義消息映射宏

//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中,MyClass是擁有消息映射的派生類名,MybaseClass是其基類名?!纠?.2】利用ClassWizard為例5.1中生成的應(yīng)用程序添加鼠標(biāo)右鍵按下消息,即WM_RBUTTONDOWN消息,并為File菜單下的Open菜單項(xiàng)添加消息處理函數(shù),分析ClassWizard類向?qū)M(jìn)行的消息映射。5.3.3自

溫馨提示

  • 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

提交評論