利用MFC開發(fā)Windows應用程序.ppt
《利用MFC開發(fā)Windows應用程序.ppt》由會員分享,可在線閱讀,更多相關《利用MFC開發(fā)Windows應用程序.ppt(42頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1,第四章利用MFC開發(fā)Windows應用程序,本章導讀理解MFC的概念和作用。理解Windows應用程序的特點和運行機制。掌握利用MFCAppwizard創(chuàng)建Windows應用程序的步驟和方法,弄清MFCAppwizard所創(chuàng)建的應用程序中所產(chǎn)生的主要類及其功能、組成文件和程序的框架結(jié)構(gòu)。理解消息的概念,掌握編寫Windows應用程序過程中所涉及到的消息的種類、特點、消息的發(fā)送和接收的基本過程和機制。掌握消息映射、消息處理函數(shù)的概念及二者間的關系。掌握利用ClassWizard增加、修改和刪除窗口消息處理函數(shù)的方法和步驟,并理解程序代碼的變化過程和特點。,2,本章導讀,MFC(MicrosoftFoundationClass)是Microsoft公司推出的Microsoft基本類庫。在編寫Windows應用程序時,必須編寫的大量重復代碼都由MFC中定義的類和支持代碼提供了;不必再直接使用WindowsAPI(應用程序接口)來進行編程工作,使用MFC提供的位于WindowsAPI之上的C++庫,使程序員的工作變得更加容易。在VisualC++6.0中,用戶不僅可以方便地使用MFC,而且還可以使用向?qū)В╓izard)來輔助開發(fā)應用程序。MFC實際上是一個擴展的、豐富的C++類層次結(jié)構(gòu),在MFC中封裝了SDK結(jié)構(gòu)、功能及應用程序框架內(nèi)部技術,隱藏了過去許多Windows程序不得不處理的許多重復工作。因此,從本章開始,將著重討論如何利用VisualC++6.0的強大功能開發(fā)Windows下的應用程序。,3,4.1Windows應用程序的特點與消息驅(qū)動機制,基于Windows操作系統(tǒng)的應用程序的特點是:標準的圖形用戶界面,比如窗口、菜單、按鈕、列表框等;應用程序與硬件無關的特性,對于同一類硬件,不論廠家、型號,程序都無需進行任何修改就可以運行;所有的Windows應用程序都是消息驅(qū)動機制,也就是說Windows程序是通過操作系統(tǒng)發(fā)送的消息來處理用戶的輸入的。在進行Windows編程之前,必須了解Windows的運行機制。在Windows操作系統(tǒng)中,無論是系統(tǒng)產(chǎn)生的動作或是用戶運行應用程序產(chǎn)生的動作都稱為事件(Events)產(chǎn)生的消息(Message)。無論是Windows應用程序的設計、還是它的應用,都是基于消息驅(qū)動方式的,這是Windows應用程序與傳統(tǒng)的應,4,用程序最大的區(qū)別。在傳統(tǒng)的編程方式中,程序是主動的。程序主動執(zhí)行,只有當需要用戶通過鍵盤或鼠標輸入信息時,才進行查詢或等待。獲得輸入后,程序繼續(xù)運行。而Windows應用程序是被動的,正常情況下,只是等待被消息觸發(fā)。當用戶點擊鼠標或按下了鍵盤,則由操作系統(tǒng)將這些操作轉(zhuǎn)化為特殊的消息,傳遞給應用程序,應用程序再用對應的消息處理過程進行處理,處理完畢后,繼續(xù)等待下一個消息。消息驅(qū)動是Windows操作系統(tǒng)的一大特色,操作系統(tǒng)將包括用戶輸入在內(nèi)的各種事件以消息的形式發(fā)送到目標,目標系統(tǒng)再根據(jù)消息的具體內(nèi)容進行相應的處理。,4.1Windows應用程序的特點與消息驅(qū)動機制,5,4.2利用MFCAppwizard創(chuàng)建Windows應用程序,在C++中,事物之間的關系是通過類的派生和類的成員函數(shù)的重載來反映的。而在VisualC++6.0中,類同樣是最重要的元素。如一個字符串可以是類Cstring的對象,一個窗口可以是類CWnd的對象,一個對話框可以是類Cdialog的對象等等。VisualC++6.0中的MFCAppWizard(應用程序向?qū)?可以使用戶自動生成一些常用的標準程序結(jié)構(gòu)和編程風格。例如一般的Windows應用程序結(jié)構(gòu)、DLL應用程序結(jié)構(gòu)、單文檔(SDI)應用程序結(jié)構(gòu)、多文檔(MDI)應用程序結(jié)構(gòu)等。下面詳細介紹利用MFCAppWizard創(chuàng)建一個Windows應用程序的步驟:第零步啟動VisualC++6.0,選擇【File】菜單下的【New】菜單項,選擇【Projects】標簽,選擇【MFCAppWizard(exe)】項目類型,在【Projectname】中輸入,6,項目名MyExp,定位于“E:\C++\EXAMPLE\”文件夾中,單擊【OK】按鈕。第一步選擇【Singledocument】應用類型,即單文檔應用程序,其他使用默認值,單擊【Next】按鈕。第二步讓用戶選擇程序中是否加入數(shù)據(jù)庫支持,在此使用默認值【None】,單擊【Next】按鈕。第三步讓用戶選擇在程序中加入復合文檔,自動化或ActiveX控件的支持,在此使用默認值,單擊【Next】按鈕。第四步讓用戶選擇應用程序的一些特性,在此使用默認值,單擊【Next】按鈕。第五步讓用戶選擇應用程序主窗口的風格、在源文件中是否加入注釋、使用怎樣的MFC類庫,在此使用默認值,單擊【Next】按鈕。,4.2利用MFCAppwizard創(chuàng)建Windows應用程序,7,第六步用戶可以對MFCAppWizard提供的缺省類名、基類名、頭文件名、源文件名進行修改,使用默認值,單擊【Finish】按鈕。則會顯示出用戶在前面幾個步驟中作出的選擇內(nèi)容,單擊【OK】按鈕,系統(tǒng)開始創(chuàng)建應用程序,并回到VisualC++6.0的主界面。運行過的應用程序MyExp可以脫離VisualC++6.0單獨運行,運行該文檔可以雙擊“E:\C++\EXAMPLE\Debug”下的MyExp.exe文件。和所有的Windows應用程序一樣,MyExp也包含標題欄、菜單欄、工具欄、狀態(tài)欄等窗口元素。,4.2利用MFCAppwizard創(chuàng)建Windows應用程序,8,4.3MFC應用程序的類和文件,4.3.1類說明AppWiZard在生成應用程序時,共派生了5個類單擊“MyExpclasses”左側(cè)的“+”展開所有的類,即可顯示出應用程序MyExp的5個類,其中:CAboutDlg:關于About對話框的對話框類CMainFrame:主框架窗口類CMyExpApp:應用程序類CMyExpDoc:文檔類CMyExpView:視圖類在工程中,每個類都擁有自己的類定義文件(*.H)和類實現(xiàn)文件(*.CPP)。類定義文件主要保存各種類的定義;類實現(xiàn)文件主要保存各種類的成員函數(shù)的實現(xiàn)代碼。,9,下面分別對這5個類進行說明:關于About對話框的對話框類CAboutDlgCAboutDlg是工程MyExp的對話框類,它是由MFC類庫中的CDialog類派生而來的。主框架窗口類CMainFrameCMainFrame是工程MyExp的主框架窗口類,它的基類是CFrameWnd。頭文件為MainFrm.h,實現(xiàn)文件為MainFrm.cpp。主框架窗口類用于管理主程序的窗口,來顯示窗口的標題欄、工具欄、狀態(tài)欄等;同時還處理對窗口操作的消息,例如窗口最大化、最小化、改變窗口大小等一般操作。視圖窗口是主框架窗口的子集,對于多文檔界面(MDI)應用程序,主框架窗口是所有MDI子窗口的容器。,4.3MFC應用程序的類和文件,10,應用程序類CMyExpAppCMyExpApp是工程MyExp的應用程序類,它的基類是CWinApp。頭文件為MyExp.h,實現(xiàn)文件為MyExp.cpp。應用程序類管理程序的整體,控制應用程序的所有對象,包括文檔、視圖和邊框窗口,并完成應用程序的初始化工作和程序退出時的清除工作。注意:每個基于MFC的應用程序都必須有一個從CWinApp類派生的對象。文檔類CMyExpDocCMyExpDoc是工程MyExp的文檔類,它的基類是CDocument。頭文件為MyExpDoc.h,實現(xiàn)文件為MyExpDoc.cpp。,4.3MFC應用程序的類和文件,11,文檔類負責存放程序的數(shù)據(jù)并讀取磁盤文件數(shù)據(jù),或?qū)⒋疟P文件數(shù)據(jù)寫入磁盤文件中。文檔類必須通過視圖類實現(xiàn)與用戶的交互。視圖類CMyExpViewCMyExpView是工程MyExp的視圖類,它的基類是CView。頭文件為MyExpView.h,實現(xiàn)文件為MyExpView.cpp。視圖類主要負責管理視圖窗口,顯示文檔類中的數(shù)據(jù),可以顯示在屏幕上,也可以輸出到打印機或其他設備上;也負責處理用戶數(shù)據(jù),接受用戶對數(shù)據(jù)的鼠標、鍵盤操作并傳送給文檔類對象。,4.3MFC應用程序的類和文件,12,4.3MFC應用程序的類和文件,4.3.2文件說明AppWizard在自動生成工程時,除了生成上面介紹的各個類的頭文件和實現(xiàn)文件外,還生成了一些為建立應用程序所需要的其他文件。這些文件可以在應用程序生成時指定的路徑(E:\C++\EXAMPLE\MyExp)中找到,下面分別對這些文件加以說明:1.MyExp.clw:ClassWizard的信息存儲文件,存儲由ClassWizard編輯已有的類或添加新類的信息,存儲由ClassWizard建立和編輯各種消息處理函數(shù)和映射變量等的信息。2.MyExp.dsp:Project文件,即工程文件。Project文件中保存著工程的各種信息,一個工程文件對應一個工程應用程序。,13,3.MyExp.dsw:Workspace文件。一個Workspace文件可包含一個或多個工程。4.MyExp.rc:資源定義文件,包含程序資源的定義,其中保存了應用程序中使用到的各種資源的信息,包括存貯在文件夾中的圖標、位圖和光標等。5.Resource.h:標準的頭文件,它包含了所有資源符號的定義,與MyExp.rc文件相對應。6.StdAfx.h:包含在所有AppWizard程序中的標準頭文件,它用于包含其他包含在預編譯頭文件中文件。7.StdAfx.cpp:包含在所有AppWizard程序中,它包含所有標準include文件。8.res\MyExpDoc.ico:文件中包含了打開文檔時所用的圖標文件。,4.3MFC應用程序的類和文件,14,9.res\MyExp.rc2:資源定義文件,包含了用vc不能直接編輯的資源??梢詫⑺胁荒苡少Y源編輯器編輯的資源放置到這個文件中。10.res\MyExp.ico:應用程序的圖標文件。應用程序圖標包含在資源文件MyExp.rc中。11.res\Toolbar.bmp:用于創(chuàng)建工具欄按鈕的位圖文件。初始欄工具欄和狀態(tài)欄是在主邊框窗口類中構(gòu)造的。12.ReadMe.txt:包含了對所有該程序的文件的解釋信息,并說明了所有創(chuàng)建的類。另外,如果在AppWizard的第4步中選擇了Context_sensitiveHelp選項,則AppWizard會自動生成一個.hpj文件和一些.rtf文件,它們用以給出上下文的幫助。,4.3MFC應用程序的類和文件,15,Windows應用程序一般是由消息驅(qū)動的(message-driven),這也是Windows編程方式與其他編程方式最大的不同之處。消息就是操作系統(tǒng)通知應用程序某件事情已經(jīng)發(fā)生的一種方式。例如,當用戶移動或雙擊鼠標、改變窗口大小等,都將向適當?shù)拇翱诎l(fā)送消息,一個窗口可以向另一個窗口發(fā)送消息,并且大多數(shù)窗口通過向其他窗口發(fā)送一個稍有不同的消息來響應消息。Windows系統(tǒng)中的消息主要有三種類型:標準的Windows消息、控件消息和命令消息。,4.4Windows消息,16,4.4Windows消息,4.4.1標準的Windows消息所有以WM_為前綴的消息都是標準的Windows消息(WM_COMMAND消息除外),如WM_PAINT、WM_QUIT等,這些消息通常含有用于確定如何對消息進行處理的一些參數(shù)。標準的Windows消息一般由窗口對象和視圖對象進行處理。窗口對象指的是從CWnd中派生出的類的對象,如從CWnd、CFrameWnd、CMDIFrameWnd、CMDIChildWnd、Cview、Cdialog等MFC類或這些類的派生類定義的對象(這些類都是CWnd類直接或間接派生的)。,17,4.4Windows消息,標準的Windows消息可以分為三類,即鍵盤消息、鼠標消息和窗口消息。下面分別加以說明。鍵盤消息當鍵盤的某個鍵被按下時,將產(chǎn)生WM_CHAR消息,這個消息帶有字符代碼值、重復次數(shù)和先前狀態(tài)碼三個參數(shù)。WM_CHAR消息的處理函數(shù)為OnChar(),此函數(shù)的原型為:afx_msgvoidOnchar(UINTnChar,UINTnRepCnt,UINTnFlags);其中:nChar是所按鍵的字符代碼值;nRepCnt是重復的次數(shù),它表示用戶按鍵時重復擊鍵的次數(shù);nFlags表示掃描碼、先前鍵狀態(tài)和鍵轉(zhuǎn)換狀態(tài)等,其參數(shù)值功能描述見表4.1所示。,18,4.4Windows消息,,表4.1nFlags參數(shù)值功能描述,19,4.4Windows消息,鼠標消息在Windows中處理鼠標的操作基本上有三種:單擊(Click)2.雙擊(DoubleClick)3.拖動(Drag)所有這些鼠標的操作,都會產(chǎn)生相應的消息。鼠標移動時產(chǎn)生WM_MOUSEMOVE消息,鼠標左鍵按下時產(chǎn)生WM_LBUTTONDOWN消息,鼠標右鍵按下時產(chǎn)生WM_RBUTTONDOWN消息,鼠標左鍵雙擊時產(chǎn)生WM_LBOTTONDBLCLK消息等等。所有這些鼠標消息的處理函數(shù)都有相似的原型,它們都有兩個參數(shù)。我們以處理鼠標左鍵按下的消息函數(shù)OnLButtonDown()為例來進行說明。此函數(shù)的原型如下:afx_msgvoidOnLButtonDown(UINTnFlags,Cpointpoint);其中:參數(shù)point是鼠標事件發(fā)生時鼠標光標所在的位置,它是相對于窗口左上角的水平坐標和垂直坐標而言的。,20,4.4Windows消息,參數(shù)nFlag指明鼠標按鈕的狀態(tài)以及鼠標事件發(fā)生時鍵盤上某些鍵的狀態(tài),每一狀態(tài)都可以由nFlag的一位來表示。我們可以從表4.2中所列的位屏蔽中得到每一位。4.2nFlags參數(shù)每位的含義其中,MK_CONTROL、MK_LBUTTON、MK_MBUTTON、MK_MBUTTON、MK_RBUTTON和MK_SHIFT都是預定義的宏。,21,4.4Windows消息,窗口消息所有窗口的變化,包括窗口內(nèi)容重繪WM_PAINT、窗口最大化WM_MAXIMIZE、窗口最小化WM_MINIMIZE、窗口重定義大小WM_RESIZE、窗口滾動WM_HSCROLL、WM_VSCROLL、窗口定時WM_TIMER等消息所帶參數(shù)各不相同。在這里我們來詳細討論一下WM_PAINT消息。當調(diào)用成員函數(shù)UpdateWindow()或RedrawWindow()要求重新繪制窗口內(nèi)容時,應用程序?qū)⑹盏絎M_PAINT消息。當窗口最小化后再還原或被其他窗口遮蓋后又重新顯示時,則當前窗口中的內(nèi)容必須重新繪制,消息WM_PAINT就是為實現(xiàn)這個功能的。,22,4.4Windows消息,當向Windows應用程序發(fā)送WM_PAINT消息,應用程序檢索到此消息后,就重新顯示窗口中的內(nèi)容。WM_PAINT消息的處理函數(shù)為OnPaint()。函數(shù)原型為:afx_msgvoidOnPaint();如果想詳細了解所有的標準的Windows消息,可以參閱VisualC++6.0聯(lián)機幫助中的有關內(nèi)容。4.4.2控件消息控件是一個小的子窗口,屬于其他窗口(如對話框等),能夠接受操作并象父窗口發(fā)送消息。常見的控件有按鈕、列表框、編輯框、復合框、滾動條等。在VisualC++6.0中,對控件的操作都是通過生成相應的控件類來進行。這些控件類僅能發(fā)送少量特定的消息,這些消息就叫做控件消息。發(fā)送控件消息的控件在VisualC++中,23,4.4Windows消息,使用唯一ID號來進行標識,使用控件類來操縱??丶⒎譃閮深悾?.從控件傳給消息,通常這類消息的前綴的最后一個字符為N;2.由系統(tǒng)發(fā)送給控件的消息,這類消息的前綴的最后一個字符為M。例如,當用戶對編輯框中的文本進行修改時,編輯框?qū)l(fā)送給父窗口一條包含控件通知碼EN_CHANGE的WM_COMMAND消息。窗口的消息處理函數(shù)將以某種適當?shù)姆绞綄νㄖ⒆鞒鲰憫?,如檢索編輯框中的文本。與其他標準的Windows消息一樣,控件消息也是由窗口對象和視圖對象進行處理。,24,4.4Windows消息,4.4.3命令消息命令消息主要包括由用戶界面對象發(fā)送的M_COMMAND消息,用戶界面對象是指菜單、工具欄、快捷鍵等。它和控件消息的區(qū)別在于:控件消息只能由特定控件向Windows系統(tǒng)傳送,而命令消息是由用戶界面發(fā)送的,它可以被更多的對象處理。在文檔對象、視圖對象、窗體對象、控件對象中都能處理這種消息。1.用戶界面對象菜單、工具欄、快捷鍵等都是可以產(chǎn)生命令的用戶界面對象。每個這樣的對象都分配了一個ID號,通過給對象和命令分配同一個ID號,將用戶界面對象和命令聯(lián)系在一起。例如,選擇程序中的【文件】菜單下的【打開】菜單項,則產(chǎn)生一條ID_FILE_OPEN命令,然后通過消息映射調(diào)用函數(shù)OnFileOpen()來進行處理。,25,4.4Windows消息,2.命令ID在MFC編程中,命令完全由命令ID來進行描述,命令ID分配給產(chǎn)生此命令的用戶界面對象。通常情況下,命令ID是由它所表示的用戶界面對象的功能來命名的。MFC預定義了一些命令ID,如ID_EDIT_CUT、ID_FILE_SAVE等,而其他命令ID則要由編程人員自己定義。3.命令目標當用戶界面對象被單擊后,將調(diào)用處理函數(shù)來執(zhí)行所產(chǎn)生的命令。Windows把非命令消息的消息直接發(fā)送給窗口,窗口中用于處理這些消息的處理函數(shù)將被調(diào)用。而對于命令消息,將把命令發(fā)送給多個目標,也就是命令目標,其中通常有一個要調(diào)用此命令的處理函數(shù)。,26,4.5消息的發(fā)送和接收的基本過程和機制,在Windows中,大部分的消息都是由用戶和應用程序的相互作用而產(chǎn)生的。CWinApp類的成員函數(shù)Run()用于處理消息循環(huán),它唯一的功能就是等待消息,并將消息發(fā)送到適當?shù)拇翱?。當消息循環(huán)接收到一條Windows消息時,它首先通過查詢一種內(nèi)部結(jié)構(gòu)來確定消息要發(fā)送的窗口。這種內(nèi)部結(jié)構(gòu)把當前所有的窗口映像成其對應的窗口類。MFC的基類還能夠檢測這一目標類是否在其消息中為這一消息提供了處理函數(shù)入口。如果找到入口,則消息被送往處理函數(shù),結(jié)束消息發(fā)送過程。如果消息無對應入口,則對目標類進行基類消息映射檢測,沿著層次向上查找,直到找到入口函數(shù)為止。對于命令消息來說,查找較為復雜。通常,每個命令目標類先把命令發(fā)送給某些其他的對象,使其他對象有,27,4.5消息的發(fā)送和接收的基本過程和機制,優(yōu)先處理的機會。如果這些對象都不能處理此命令,則起始類檢查自己的消息映射,若也不能處理此消息,則將命令發(fā)送給更多的命令目標。在大多數(shù)情況下,命令目標將以下列順序發(fā)送命令:1.發(fā)送至當前活動的子命令目標對象;2.發(fā)送至其本身;3.發(fā)送至其他命令目標。【例】在一個MDI應用程序中,如果選擇了“文件”菜單中的“保存”菜單項,則產(chǎn)生一條命令消息。我們假定命令處理函數(shù)是應用程序文檔類的成員函數(shù),則此命令的發(fā)送順序為:,28,4.5消息的發(fā)送和接收的基本過程和機制,1.命令消息首先傳給主框架窗口;2.主框架窗口給當前活動的子窗口處理此命令的機會;3.視圖檢查其消息映射,若沒有找到處理函數(shù),再把此命令發(fā)送給與其相連的文檔;4.文檔檢查其消息映射,如果找到命令的處理函數(shù),則調(diào)用此函數(shù),發(fā)送過程結(jié)束,否則繼續(xù)下面的步驟;5.將命令發(fā)送給文檔模板,然后返回到視圖,再返回邊框窗口,邊框窗口檢查其消息映射;6.命令回送到主邊框窗口,主邊框窗口檢查自己的消息映射;7.檢測應用程序的消息映射,進到消息入口,并調(diào)用適當?shù)奶幚沓绦颉?29,4.6消息映射與消息處理函數(shù),4.6.1消息映射與消息處理函數(shù)的概念通過消息映射,消息就和它的處理函數(shù)對應起來。消息處理函數(shù)指的是與某個消息對應的函數(shù)。消息處理函數(shù)的執(zhí)行是由其對應的消息引發(fā)的,某個類對象中的消息處理函數(shù)是與這個類對象能夠得到的一個消息對應的,當這個消息發(fā)生時,這個函數(shù)就會被執(zhí)行。消息處理函數(shù)的定義與使用方法與類的一般的成員函數(shù)不同。一般成員函數(shù)包括兩部分:函數(shù)的定義部分和函數(shù)的實現(xiàn)部分;而消息處理函數(shù)除了這兩部分以外,還有消息映射部分。,30,4.6消息映射與消息處理函數(shù),4.6.2管理窗口消息處理函數(shù)利用ClassWizard可以管理消息處理函數(shù),ClassWizard是一個非常強大有用的工具,我們可以用ClassWizard來創(chuàng)建新類、定義消息處理函數(shù)、覆蓋MFC的虛擬函數(shù),從對話框、表單視圖或記錄視圖的控件中獲取數(shù)據(jù)??梢杂萌N方法來激活ClassWizard對話框:1.選擇【View】菜單中的【ClassWizard】菜單項;2.直接按下Ctrl+W鍵;3.在代碼編輯窗口中單擊鼠標右鍵(此時,代碼編輯窗口中必須有打開的文件),在彈出菜單中選擇【ClassWizard】菜單項。,31,4.6消息映射與消息處理函數(shù),當執(zhí)行了以上操作,窗口中將彈出【MFCClassWizard】對話框。此時顯示的是【MessageMap】選項卡。在這個選項卡的最上面有兩個下拉列表框:【Project】列表中顯示的是當前的項目名稱,【Classname】列表中顯示的是正在編輯的消息映射所屬的類名。選項卡的中間也有兩個多行的列表框。左邊的【ObjectIDs】列表框中顯示的對象有三種類型:在【Classname】欄中列出的類名、菜單項對象和其他可能在【Classname】中所選的類傳遞消息的控件,當其中的某一個類被選中時,右面的【Messages】列表框就顯示出此類的能捕獲的所有Windows消息。其中還列出了一些能夠捕獲的普通消息的虛函數(shù)。最下面【Memberfunctions】列表中顯示的是與此消息相關的類的成員函數(shù)的列表。,32,4.6消息映射與消息處理函數(shù),在【MFCClassWizard】對話框中共有五個選項卡,分別說明如下:1.【MessageMaps】選項卡用于進行消息映射的處理;2.【MemberVariables】選項卡用于為對話框中的控件所用到的類創(chuàng)建成員變量;3.【Automation】選項卡幫助用戶管理與OLE自動化相聯(lián)系的方法和屬性;4.【ActiveXEvents】選項卡幫助用戶管理ActiveX類支持的ActiveX事件;5.【ClassInfo】選項卡顯示類的一般信息,包括定義它的頭文件和源文件、類名以及與之相聯(lián)系的基類。,33,4.6消息映射與消息處理函數(shù),4.6.2.1增加一個窗口消息以應用程序MyExp為例,說明用ClassWizard增加一個窗口消息處理函數(shù)的過程。1.在VC++工作界面下打開MyExp項目,并啟動ClassWizard,進入對話框界面。2.從【ClassName】復合框中選擇視圖類CMyExpView,在【ObjectIDs】列表框中就會列出各種消息來源的組件。3.從【ObjectIDs】列表框中選擇CMyExpView,在列表框【Message】中列出的就是CMyExpView類對象能夠從窗口對象CWnd接受到的窗口消息和各種可重載的虛函數(shù)。從中可以找到名為WM_LBUTTONDOWN的消息,用鼠標選中這個消息。,34,4.6消息映射與消息處理函數(shù),4.此時,【AddFunction】按鈕處于可執(zhí)行狀態(tài),單擊此按鈕,就會在CMyExpView類中增加一個被CWnd保護的消息處理函數(shù)OnLButtonDown。5.在【Memberfunctions】列表框中能夠發(fā)現(xiàn)這個函數(shù)及其對應的消息映射機制:OnLButtonDownON_WM_LBUTTONDOWN。在函數(shù)前有一個“W“標志,表示這個函數(shù)是一個窗口消息處理函數(shù)。6.單擊【OK】按鈕,完成一個窗口消息處理函數(shù)的增加。4.6.2.2增加窗口消息處理函數(shù)的過程的分析以上介紹了用ClassWizard增加一個窗口消息處理函數(shù)的過程,增加了該函數(shù)后,對于應用程序MyExp的代碼做了如下的修改:,35,4.6消息映射與消息處理函數(shù),1.在視圖類CMyExpView中,增加了消息處理函數(shù)的定義代碼://省略以上代碼protected://{{AFX_MSG(CMyExpView)afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);//單擊鼠標左鍵調(diào)用//}}AFX_MSGDECLARE_MESSAGE_MAP()//省略以下代碼,36,4.6消息映射與消息處理函數(shù),2.在CMyExpView類的實現(xiàn)文件MyExpview.cpp中,增加了函數(shù)的實際代碼:voidCMyExpView::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCView::OnLButtonDown(nFlags,point);}3.在實現(xiàn)文件MyExpView.cpp中,還增加了函數(shù)的消息映射機制:BEGIN_MESSAGE_MAP(CMyExpView,CView)//{{AFX_MSG_MAP(CMyExpView),37,4.6消息映射與消息處理函數(shù),ON_WM_LBUTTONDOWN()//單擊鼠標左鍵,//OnLButtonDown函數(shù)的消息映射//}}AFX_MSG_MAP//StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,view::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP(),38,4.6消息映射與消息處理函數(shù),4.6.2.3ClassWizard識別和處理窗口消息處理函數(shù)所需要的標識1.窗口消息處理函數(shù)的定義在類的定義文件中,ClassWizard通過以下兩行固定的代碼來標識消息處理函數(shù)://{{AFX_MSG(CMyExpView)//ClassWizard標識消息//處理函數(shù)定義的起始代碼//}}AFX_MSG//ClassWizard標識消息處理函數(shù)定義//的結(jié)束代碼AFX_MSG括號中的內(nèi)容(CMyExpView)是消息處理函數(shù)所在類的名稱,只有將消息處理函數(shù)定義在以上兩行代碼間時,才能被ClassWizard識別和處理。,39,4.6消息映射與消息處理函數(shù),2.窗口消息處理函數(shù)的實現(xiàn)在實現(xiàn)文件中,消息映射機制寫在如下的兩行代碼間而被ClassWizard識別://{{AFX_MSG_MAP(CMyExpView)//ClassWizard標識消//息處理映射機制的起始代碼//}}AFX_MSG_MAP//ClassWizard標識消息處理//映射機制的結(jié)束代碼同樣,AFX_MSG_MAP括號中的內(nèi)容是擁用消息映射機制的類的名稱,只有當一個消息處理函數(shù)的消息映射機制寫在以上兩行代碼間時,才能被ClassWizard識別和處理。,40,4.6消息映射與消息處理函數(shù),4.6.2.4刪除窗口消息處理函數(shù)用ClassWizard刪除窗口消息處理函數(shù)的方法很簡單:在操作界面中,從【MemberFunctions】列表框中選擇剛剛增加的OnLButtonDown函數(shù),這時【DeleteFuntion】按鈕處于激活可執(zhí)狀態(tài),單擊此按鈕,系統(tǒng)會提示是否對OnLButtonDown函數(shù)進行刪除,并提示必須用手工從實現(xiàn)文件中刪除函數(shù)的實際代碼,確認后就刪除了這個消息處理函數(shù)。以上操作只是從視圖類CMyExpView中刪除了函數(shù)的定義代碼,從實現(xiàn)文件中刪除了映射消息機制,而對于實現(xiàn)文件中的函數(shù)實現(xiàn)代碼,需要手工進行刪除。這樣做的目的是避免誤操作而刪除大量有用的代碼。,41,本章小結(jié),,42,習題,,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 利用 MFC 開發(fā) Windows 應用程序
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://ioszen.com/p-3218595.html