




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、返回返回1第四章 利用MFC開發(fā)Windows應(yīng)用程序本章導(dǎo)讀本章導(dǎo)讀 理解MFC的概念和作用。 理解Windows應(yīng)用程序的特點(diǎn)和運(yùn)行機(jī)制。 掌握利用MFC Appwizard 創(chuàng)建Windows應(yīng)用程序的步驟和方法,弄清MFC Appwizard所創(chuàng)建的應(yīng)用程序中所產(chǎn)生的主要類及其功能、組成文件和程序的框架結(jié)構(gòu)。 理解消息的概念,掌握編寫Windows應(yīng)用程序過程中所涉及到的消息的種類、特點(diǎn)、消息的發(fā)送和接收的基本過程和機(jī)制。 掌握消息映射、消息處理函數(shù)的概念及二者間的關(guān)系。 掌握利用Class Wizard增加、修改和刪除窗口消息處理函數(shù)的方法和步驟,并理解程序代碼的變化過程和特點(diǎn)。 返
2、回返回2本章導(dǎo)讀 MFC(Microsoft Foundation Class)是Microsoft公司推出的Microsoft基本類庫。在編寫Windows應(yīng)用程序時(shí),必須編寫的大量重復(fù)代碼都由MFC中定義的類和支持代碼提供了;不必再直接使用Windows API(應(yīng)用程序接口)來進(jìn)行編程工作,使用MFC提供的位于Windows API之上的C+庫,使程序員的工作變得更加容易。在Visual C+ 6.0中,用戶不僅可以方便地使用MFC,而且還可以使用向?qū)В╓izard)來輔助開發(fā)應(yīng)用程序。MFC實(shí)際上是一個(gè)擴(kuò)展的、豐富的C+類層次結(jié)構(gòu),在MFC中封裝了SDK結(jié)構(gòu)、功能及應(yīng)用程序框架內(nèi)部技術(shù)
3、,隱藏了過去許多Windows程序不得不處理的許多重復(fù)工作。因此,從本章開始,將著重討論如何利用Visual C+ 6.0的強(qiáng)大功能開發(fā)Windows下的應(yīng)用程序。 返回返回34.1 Windows應(yīng)用程序的特點(diǎn)與消息驅(qū)動(dòng)機(jī)制基于Windows操作系統(tǒng)的應(yīng)用程序的特點(diǎn)是: 標(biāo)準(zhǔn)的圖形用戶界面,比如窗口、菜單、按鈕、列表框等; 應(yīng)用程序與硬件無關(guān)的特性,對(duì)于同一類硬件,不論廠家、型號(hào),程序都無需進(jìn)行任何修改就可以運(yùn)行; 所有的Windows應(yīng)用程序都是消息驅(qū)動(dòng)機(jī)制,也就是說Windows程序是通過操作系統(tǒng)發(fā)送的消息來處理用戶的輸入的。 在進(jìn)行Windows編程之前,必須了解Windows的運(yùn)行機(jī)
4、制。在Windows操作系統(tǒng)中,無論是系統(tǒng)產(chǎn)生的動(dòng)作或是用戶運(yùn)行應(yīng)用程序產(chǎn)生的動(dòng)作都稱為事件(Events)產(chǎn)生的消息(Message)。 無論是Windows應(yīng)用程序的設(shè)計(jì)、還是它的應(yīng)用,都是基于消息驅(qū)動(dòng)方式的,這是Windows應(yīng)用程序與傳統(tǒng)的應(yīng)返回返回4用程序最大的區(qū)別。在傳統(tǒng)的編程方式中,程序是主動(dòng)的。程序主動(dòng)執(zhí)行,只有當(dāng)需要用戶通過鍵盤或鼠標(biāo)輸入信息時(shí),才進(jìn)行查詢或等待。獲得輸入后,程序繼續(xù)運(yùn)行。而Windows應(yīng)用程序是被動(dòng)的,正常情況下,只是等待被消息觸發(fā)。當(dāng)用戶點(diǎn)擊鼠標(biāo)或按下了鍵盤,則由操作系統(tǒng)將這些操作轉(zhuǎn)化為特殊的消息,傳遞給應(yīng)用程序,應(yīng)用程序再用對(duì)應(yīng)的消息處理過程進(jìn)行處理,
5、處理完畢后,繼續(xù)等待下一個(gè)消息。 消息驅(qū)動(dòng)是Windows操作系統(tǒng)的一大特色,操作系統(tǒng)將包括用戶輸入在內(nèi)的各種事件以消息的形式發(fā)送到目標(biāo),目標(biāo)系統(tǒng)再根據(jù)消息的具體內(nèi)容進(jìn)行相應(yīng)的處理。4.1 Windows應(yīng)用程序的特點(diǎn)與消息驅(qū)動(dòng)機(jī)制返回返回54.2 利用MFC Appwizard 創(chuàng)建Windows應(yīng)用程序 在C+中,事物之間的關(guān)系是通過類的派生和類的成員函數(shù)的重載來反映的。而在Visual C+ 6.0中,類同樣是最重要的元素。如一個(gè)字符串可以是類Cstring的對(duì)象,一個(gè)窗口可以是類CWnd的對(duì)象,一個(gè)對(duì)話框可以是類Cdialog的對(duì)象等等。 Visual C+ 6.0中的MFC AppW
6、izard(應(yīng)用程序向?qū)?可以使用戶自動(dòng)生成一些常用的標(biāo)準(zhǔn)程序結(jié)構(gòu)和編程風(fēng)格。例如一般的Windows應(yīng)用程序結(jié)構(gòu)、DLL應(yīng)用程序結(jié)構(gòu)、單文檔(SDI)應(yīng)用程序結(jié)構(gòu)、多文檔(MDI)應(yīng)用程序結(jié)構(gòu)等。 下面詳細(xì)介紹利用MFC AppWizard創(chuàng)建一個(gè)Windows應(yīng)用程序的步驟:第零步第零步 啟動(dòng)Visual C+ 6.0,選擇【File】菜單下的【New】菜 單 項(xiàng) , 選 擇 【 P r o j e c t s 】 標(biāo) 簽 , 選 擇 【 M F C AppWizard(exe)】項(xiàng)目類型,在【Project name】中輸入返回返回6項(xiàng)目名MyExp,定位于“E:C+EXAMPLE”文件
7、夾中,單擊【OK】按鈕。第一步第一步 選擇【Single document】應(yīng)用類型,即單文檔應(yīng)用程序,其他使用默認(rèn)值,單擊【Next】按鈕。第二步第二步 讓用戶選擇程序中是否加入數(shù)據(jù)庫支持,在此使用默認(rèn)值【None】,單擊【Next】按鈕。第三步第三步 讓用戶選擇在程序中加入復(fù)合文檔,自動(dòng)化或ActiveX控件的支持,在此使用默認(rèn)值,單擊【Next】按鈕。第四步第四步 讓用戶選擇應(yīng)用程序的一些特性,在此使用默認(rèn)值,單擊【Next】按鈕。第五步第五步 讓用戶選擇應(yīng)用程序主窗口的風(fēng)格、在源文件中是否加入注釋、使用怎樣的MFC類庫,在此使用默認(rèn)值,單擊【Next】按鈕。4.2 利用MFC Appw
8、izard 創(chuàng)建Windows應(yīng)用程序返回返回7第六步第六步 用戶可以對(duì)MFC AppWizard提供的缺省類名、基類名、頭文件名、源文件名進(jìn)行修改,使用默認(rèn)值,單擊【Finish】按鈕。則會(huì)顯示出用戶在前面幾個(gè)步驟中作出的選擇內(nèi)容,單擊【OK】按鈕,系統(tǒng)開始創(chuàng)建應(yīng)用程序,并回到Visual C+ 6.0的主界面。 運(yùn)行過的應(yīng)用程序MyExp可以脫離Visual C+ 6.0單獨(dú)運(yùn)行,運(yùn)行該文檔可以雙擊“E:C+EXAMPLEDebug”下的MyExp.exe文件。和所有的Windows應(yīng)用程序一樣,MyExp也包含標(biāo)題欄、菜單欄、工具欄、狀態(tài)欄等窗口元素。 4.2 利用MFC Appwiza
9、rd 創(chuàng)建Windows應(yīng)用程序返回返回84.3 MFC應(yīng)用程序的類和文件4.3.1 類說明類說明 AppWiZard在生成應(yīng)用程序時(shí),共派生了5個(gè)類單擊“MyExp classes”左側(cè)的“+”展開所有的類,即可顯示出應(yīng)用程序MyExp的5個(gè)類,其中:CAboutDlg: 關(guān)于About對(duì)話框的對(duì)話框類CMainFrame: 主框架窗口類CMyExpApp: 應(yīng)用程序類CMyExpDoc: 文檔類CMyExpView:視圖類 在工程中,每個(gè)類都擁有自己的類定義文件(*.H)和類實(shí)現(xiàn)文件(*.CPP)。類定義文件主要保存各種類的定義;類實(shí)現(xiàn)文件主要保存各種類的成員函數(shù)的實(shí)現(xiàn)代碼。返回返回9下面
10、分別對(duì)這5個(gè)類進(jìn)行說明: 關(guān)于關(guān)于About對(duì)話框的對(duì)話框類對(duì)話框的對(duì)話框類CAboutDlg CAboutDlg是工程MyExp的對(duì)話框類,它是由MFC類庫中的CDialog類派生而來的。 主框架窗口類主框架窗口類CMainFrame CMainFrame是工程MyExp的主框架窗口類,它的基類是CFrameWnd。頭文件為MainFrm.h,實(shí)現(xiàn)文件為MainFrm.cpp。 主框架窗口類用于管理主程序的窗口,來顯示窗口的標(biāo)題欄、工具欄、狀態(tài)欄等;同時(shí)還處理對(duì)窗口操作的消息,例如窗口最大化、最小化、改變窗口大小等一般操作。視圖窗口是主框架窗口的子集,對(duì)于多文檔界面(MDI)應(yīng)用程序,主框架
11、窗口是所有MDI子窗口的容器。4.3 MFC應(yīng)用程序的類和文件返回返回10 應(yīng)用程序類應(yīng)用程序類CMyExpApp CMyExpApp是工程MyExp的應(yīng)用程序類,它的基類是CWinApp。頭文件為MyExp .h,實(shí)現(xiàn)文件為MyExp.cpp。 應(yīng)用程序類管理程序的整體,控制應(yīng)用程序的所有對(duì)象,包括文檔、視圖和邊框窗口,并完成應(yīng)用程序的初始化工作和程序退出時(shí)的清除工作。 注意:每個(gè)基于MFC的應(yīng)用程序都必須有一個(gè)從CWinApp類派生的對(duì)象。 文檔類文檔類CMyExpDoc CMyExpDoc是工程MyExp的文檔類,它的基類是CDocument。頭文件為MyExpDoc.h,實(shí)現(xiàn)文件為My
12、ExpDoc.cpp。4.3 MFC應(yīng)用程序的類和文件返回返回11 文檔類負(fù)責(zé)存放程序的數(shù)據(jù)并讀取磁盤文件數(shù)據(jù),或?qū)⒋疟P文件數(shù)據(jù)寫入磁盤文件中。文檔類必須通過視圖類實(shí)現(xiàn)與用戶的交互。 視圖類視圖類CMyExpView CMyExpView是工程MyExp的視圖類,它的基類是C Vi e w 。 頭 文 件 為 M y E x p Vi e w . h , 實(shí) 現(xiàn) 文 件 為MyExpView.cpp。 視圖類主要負(fù)責(zé)管理視圖窗口,顯示文檔類中的數(shù)據(jù),可以顯示在屏幕上,也可以輸出到打印機(jī)或其他設(shè)備上;也負(fù)責(zé)處理用戶數(shù)據(jù),接受用戶對(duì)數(shù)據(jù)的鼠標(biāo)、鍵盤操作并傳送給文檔類對(duì)象。 4.3 MFC應(yīng)用程序的
13、類和文件返回返回124.3 MFC應(yīng)用程序的類和文件4.3.2 文件說明文件說明 App Wizard在自動(dòng)生成工程時(shí),除了生成上面介紹的各個(gè)類的頭文件和實(shí)現(xiàn)文件外,還生成了一些為建立應(yīng)用程序所需要的其他文件。這些文件可以在應(yīng)用程序生成時(shí)指定的路徑(E:C+EXAMPLEMyExp)中找到,下面分別對(duì)這些文件加以說明:1. MyExp.clw:Class Wizard的信息存儲(chǔ)文件,存儲(chǔ)由Class Wizard編輯已有的類或添加新類的信息,存儲(chǔ)由Class Wizard建立和編輯各種消息處理函數(shù)和映射變量等的信息。2. MyExp.dsp:Project文件,即工程文件。Project文件中
14、保存著工程的各種信息,一個(gè)工程文件對(duì)應(yīng)一個(gè)工程應(yīng)用程序。返回返回133. MyExp.dsw:Workspace文件。一個(gè)Workspace文件可包含一個(gè)或多個(gè)工程。 4. MyExp.rc:資源定義文件,包含程序資源的定義,其中保存了應(yīng)用程序中使用到的各種資源的信息,包括存貯在文件夾中的圖標(biāo)、位圖和光標(biāo)等。 5. Resource.h:標(biāo)準(zhǔn)的頭文件,它包含了所有資源符號(hào)的定義,與MyExp.rc文件相對(duì)應(yīng)。6. StdAfx.h:包含在所有App Wizard程序中的標(biāo)準(zhǔn)頭文件,它用于包含其他包含在預(yù)編譯頭文件中文件。7. StdAfx.cpp:包含在所有App Wizard程序中,它包含所
15、有標(biāo)準(zhǔn)include文件。8. resMyExpDoc.ico:文件中包含了打開文檔時(shí)所用的圖標(biāo)文件。4.3 MFC應(yīng)用程序的類和文件返回返回149. resMyExp.rc2:資源定義文件,包含了用vc不能直接編輯的資源??梢詫⑺胁荒苡少Y源編輯器編輯的資源放置到這個(gè)文件中。10. resMyExp.ico:應(yīng)用程序的圖標(biāo)文件。應(yīng)用程序圖標(biāo)包含在資源文件MyExp.rc中。 11. resToolbar.bmp:用于創(chuàng)建工具欄按鈕的位圖文件。初始欄工具欄和狀態(tài)欄是在主邊框窗口類中構(gòu)造的。12. ReadMe.txt:包含了對(duì)所有該程序的文件的解釋信息,并說明了所有創(chuàng)建的類。 另 外 , 如
16、果 在 A p p Wi z a r d 的 第 4 步 中 選 擇 了Context_sensitive Help選項(xiàng),則App Wizard會(huì)自動(dòng)生成一個(gè).hpj文件和一些.rtf文件,它們用以給出上下文的幫助。 4.3 MFC應(yīng)用程序的類和文件返回返回15 Windows 應(yīng)用程序一般是由消息驅(qū)動(dòng)的(message-driven),這也是Windows編程方式與其他編程方式最大的不同之處。 消息就是操作系統(tǒng)通知應(yīng)用程序某件事情已經(jīng)發(fā)生的一種方式。例如,當(dāng)用戶移動(dòng)或雙擊鼠標(biāo)、改變窗口大小等,都將向適當(dāng)?shù)拇翱诎l(fā)送消息,一個(gè)窗口可以向另一個(gè)窗口發(fā)送消息,并且大多數(shù)窗口通過向其他窗口發(fā)送一個(gè)稍有
17、不同的消息來響應(yīng)消息。 Windows系統(tǒng)中的消息主要有三種類型:標(biāo)準(zhǔn)的Windows消息、控件消息和命令消息。4.4 Windows消息返回返回164.4 Windows消息4.4.1 標(biāo)準(zhǔn)的標(biāo)準(zhǔn)的Windows消息消息 所有以WM_為前綴的消息都是標(biāo)準(zhǔn)的Windows消息(WM_COMMAND消息除外),如WM_PAINT、WM_QUIT等,這些消息通常含有用于確定如何對(duì)消息進(jìn)行處理的一些參數(shù)。標(biāo)準(zhǔn)的Windows 消息一般由窗口對(duì)象和視圖對(duì)象進(jìn)行處理。窗口對(duì)象指的是從CWnd中派生出的類的對(duì)象,如從CWnd、CFrameWnd、CMDIFrameWnd、CMDIChildWnd、Cvie
18、w、Cdialog等MFC類或這些類的派生類定義的對(duì)象(這些類都是CWnd類直接或間接派生的)。返回返回174.4 Windows消息 標(biāo)準(zhǔn)的Windows消息可以分為三類,即鍵盤消息、鼠標(biāo)消息和窗口消息。下面分別加以說明。 鍵盤消息鍵盤消息 當(dāng)鍵盤的某個(gè)鍵被按下時(shí),將產(chǎn)生WM_CHAR消息,這個(gè)消息帶有字符代碼值、重復(fù)次數(shù)和先前狀態(tài)碼三個(gè)參數(shù)。WM_CHAR消息的處理函數(shù)為OnChar( ),此函數(shù)的原型為:afx_msg void Onchar(UINT nChar,UINT nRepCnt,UINT nFlags); 其中:nChar是所按鍵的字符代碼值; nRepCnt是重復(fù)的次數(shù),它
19、表示用戶按鍵時(shí)重復(fù)擊鍵的次數(shù); nFlags表示掃描碼、先前鍵狀態(tài)和鍵轉(zhuǎn)換狀態(tài)等,其參數(shù)值功能描述見表4.1所示。 返回返回184.4 Windows消息位含 義015指明鍵重復(fù)按下的次數(shù)1623指定掃描碼,依賴于具體廠家的按鍵值24如果同時(shí)按下擴(kuò)展鍵(如功能鍵Alt、Ctrl),則置為1,否則置為02528由Windows內(nèi)部使用29若同時(shí)按下了Alt鍵,則置為1,否則置為030指明先前鍵狀態(tài)。若消息發(fā)出前鍵是按下的,則置為1,否則置為031指明鍵轉(zhuǎn)換狀態(tài)。若按鍵已松開,則置為1,否則置為0表4.1 nFlags參數(shù)值功能描述 返回返回194.4 Windows消息鼠標(biāo)消息鼠標(biāo)消息 在Win
20、dows中處理鼠標(biāo)的操作基本上有三種:單擊(Click) 2. 雙擊(Double Click) 3.拖動(dòng)(Drag) 所有這些鼠標(biāo)的操作,都會(huì)產(chǎn)生相應(yīng)的消息。鼠標(biāo)移動(dòng)時(shí)產(chǎn)生WM_MOUSEMOVE消息,鼠標(biāo)左鍵按下時(shí)產(chǎn)生WM_LBUTTONDOWN消息,鼠標(biāo)右鍵按下時(shí)產(chǎn)生WM_RBUTTONDOWN消息,鼠標(biāo)左鍵雙擊時(shí)產(chǎn)生WM_LBOTTONDBLCLK消息等等。 所有這些鼠標(biāo)消息的處理函數(shù)都有相似的原型,它們都有兩個(gè)參數(shù)。我們以處理鼠標(biāo)左鍵按下的消息函數(shù)OnLButtonDown( )為例來進(jìn)行說明。此函數(shù)的原型如下: afx_msg void OnLButtonDown(UINT nFl
21、ags,Cpoint point); 其中:參數(shù)point是鼠標(biāo)事件發(fā)生時(shí)鼠標(biāo)光標(biāo)所在的位置,它是相對(duì)于窗口左上角的水平坐標(biāo)和垂直坐標(biāo)而言的。返回返回204.4 Windows消息參數(shù)nFlag指明鼠標(biāo)按鈕的狀態(tài)以及鼠標(biāo)事件發(fā)生時(shí)鍵盤上某些鍵的狀態(tài),每一狀態(tài)都可以由nFlag的一位來表示。我們可以從表4.2中所列的位屏蔽中得到每一位。 4.2 nFlags參數(shù)每位的含義 其中,MK_CONTROL、MK_LBUTTON、MK_MBUTTON、MK_MBUTTON、MK_RBUTTON和MK_SHIFT都是預(yù)定義的宏。位屏蔽含 義MK_CONTROLCtrl鍵按下時(shí)設(shè)置MK_LBUTTON鼠標(biāo)左
22、鍵按下時(shí)設(shè)置MK_MBUTTON鼠標(biāo)中間鍵按下時(shí)設(shè)置MK_RBUTTON鼠標(biāo)右鍵按下時(shí)設(shè)置MK_SHIFTShift鍵按下時(shí)設(shè)置返回返回214.4 Windows消息 窗口消息窗口消息 所有窗口的變化,包括窗口內(nèi)容重繪WM_PAINT、窗口最大化WM_MAXIMIZE、窗口最小化WM_MINIMIZE、窗口重定義大小WM_RESIZE、窗口滾動(dòng)WM_HSCROLL、WM_VSCROLL、窗口定時(shí)WM_TIMER等消息所帶參數(shù)各不相同。 在這里我們來詳細(xì)討論一下WM_PAINT消息。當(dāng)調(diào)用成員函數(shù)UpdateWindow( )或 RedrawWindow( )要求重新繪制窗口內(nèi)容時(shí),應(yīng)用程序?qū)⑹?/p>
23、到WM_PAINT消息。當(dāng)窗口最小化后再還原或被其他窗口遮蓋后又重新顯示時(shí),則當(dāng)前窗口中的內(nèi)容必須重新繪制,消息WM_PAINT就是為實(shí)現(xiàn)這個(gè)功能的。 返回返回224.4 Windows消息當(dāng)向Windows應(yīng)用程序發(fā)送WM_PAINT消息,應(yīng)用程序檢索到此消息后,就重新顯示窗口中的內(nèi)容。WM_PAINT消息的處理函數(shù)為 OnPaint( )。函數(shù)原型為:afx_msg void OnPaint( ); 如果想詳細(xì)了解所有的標(biāo)準(zhǔn)的Windows消息,可以參閱Visual C+ 6.0聯(lián)機(jī)幫助中的有關(guān)內(nèi)容。4.4.2 控件消息控件消息 控件是一個(gè)小的子窗口,屬于其他窗口(如對(duì)話框等),能夠接受操
24、作并象父窗口發(fā)送消息。常見的控件有按鈕、列表框、編輯框、復(fù)合框、滾動(dòng)條等。 在Visual C+ 6.0中,對(duì)控件的操作都是通過生成相應(yīng)的控件類來進(jìn)行。這些控件類僅能發(fā)送少量特定的消息,這些消息就叫做控件消息。發(fā)送控件消息的控件在Visual C+中返回返回234.4 Windows消息使用唯一ID號(hào)來進(jìn)行標(biāo)識(shí),使用控件類來操縱??丶⒎譃閮深悾?. 從控件傳給消息,通常這類消息的前綴的最后一個(gè)字符為N;2. 由系統(tǒng)發(fā)送給控件的消息,這類消息的前綴的最后一個(gè)字符為M。 例如,當(dāng)用戶對(duì)編輯框中的文本進(jìn)行修改時(shí),編輯框?qū)l(fā)送給父窗口一條包含控件通知碼EN_CHANGE的WM_COMMAND消息。
25、窗口的消息處理函數(shù)將以某種適當(dāng)?shù)姆绞綄?duì)通知消息作出響應(yīng),如檢索編輯框中的文本。 與其他標(biāo)準(zhǔn)的Windows消息一樣,控件消息也是由窗口對(duì)象和視圖對(duì)象進(jìn)行處理。返回返回244.4 Windows消息4.4.3 命令消息命令消息 命令消息主要包括由用戶界面對(duì)象發(fā)送的M_COMMAND消息,用戶界面對(duì)象是指菜單、工具欄、快捷鍵等。它和控件消息的區(qū)別在于:控件消息只能由特定控件向Windows系統(tǒng)傳送,而命令消息是由用戶界面發(fā)送的,它可以被更多的對(duì)象處理。在文檔對(duì)象、視圖對(duì)象、窗體對(duì)象、控件對(duì)象中都能處理這種消息。1. 用戶界面對(duì)象 菜單、工具欄、快捷鍵等都是可以產(chǎn)生命令的用戶界面對(duì)象。每個(gè)這樣的對(duì)象
26、都分配了一個(gè)ID號(hào),通過給對(duì)象和命令分配同一個(gè)ID號(hào),將用戶界面對(duì)象和命令聯(lián)系在一起。例如,選擇程序中的【文件】菜單下的【打開】菜單項(xiàng),則產(chǎn)生一條ID_命令,然后通過消息映射調(diào)用函數(shù)On()來進(jìn)行處理。返回返回254.4 Windows消息2. 命令命令I(lǐng)D 在MFC編程中,命令完全由命令I(lǐng)D來進(jìn)行描述,命令I(lǐng)D分配給產(chǎn)生此命令的用戶界面對(duì)象。通常情況下,命令I(lǐng)D是由它所表示的用戶界面對(duì)象的功能來命名的。MFC預(yù)定義了一些命令I(lǐng)D,如ID_EDIT_CUT、ID_ 等,而其他命令I(lǐng)D則要由編程人員自己定義。3. 命令目標(biāo)命令目標(biāo) 當(dāng)用戶界面對(duì)象被單擊后,將調(diào)用處理函數(shù)來執(zhí)行所產(chǎn)生的命令。Win
27、dows把非命令消息的消息直接發(fā)送給窗口,窗口中用于處理這些消息的處理函數(shù)將被調(diào)用。而對(duì)于命令消息,將把命令發(fā)送給多個(gè)目標(biāo),也就是命令目標(biāo),其中通常有一個(gè)要調(diào)用此命令的處理函數(shù)。返回返回264.5 消息的發(fā)送和接收的基本過程和機(jī)制 在Windows中,大部分的消息都是由用戶和應(yīng)用程序的相互作用而產(chǎn)生的。CWinApp類的成員函數(shù)Run( )用于處理消息循環(huán),它唯一的功能就是等待消息,并將消息發(fā)送到適當(dāng)?shù)拇翱凇?當(dāng)消息循環(huán)接收到一條Windows消息時(shí),它首先通過查詢一種內(nèi)部結(jié)構(gòu)來確定消息要發(fā)送的窗口。這種內(nèi)部結(jié)構(gòu)把當(dāng)前所有的窗口映像成其對(duì)應(yīng)的窗口類。MFC的基類還能夠檢測這一目標(biāo)類是否在其消息
28、中為這一消息提供了處理函數(shù)入口。如果找到入口,則消息被送往處理函數(shù),結(jié)束消息發(fā)送過程。如果消息無對(duì)應(yīng)入口,則對(duì)目標(biāo)類進(jìn)行基類消息映射檢測,沿著層次向上查找,直到找到入口函數(shù)為止。 對(duì)于命令消息來說,查找較為復(fù)雜。通常,每個(gè)命令目標(biāo)類先把命令發(fā)送給某些其他的對(duì)象,使其他對(duì)象有返回返回274.5 消息的發(fā)送和接收的基本過程和機(jī)制優(yōu)先處理的機(jī)會(huì)。如果這些對(duì)象都不能處理此命令,則起始類檢查自己的消息映射,若也不能處理此消息,則將命令發(fā)送給更多的命令目標(biāo)。在大多數(shù)情況下,命令目標(biāo)將以下列順序發(fā)送命令:1. 發(fā)送至當(dāng)前活動(dòng)的子命令目標(biāo)對(duì)象;2. 發(fā)送至其本身;3. 發(fā)送至其他命令目標(biāo)?!纠俊纠吭谝粋€(gè)M
29、DI應(yīng)用程序中,如果選擇了“文件”菜單中的“保存”菜單項(xiàng),則產(chǎn)生一條命令消息。我們假定命令處理函數(shù)是應(yīng)用程序文檔類的成員函數(shù),則此命令的發(fā)送順序?yàn)椋悍祷胤祷?84.5 消息的發(fā)送和接收的基本過程和機(jī)制1. 命令消息首先傳給主框架窗口;2. 主框架窗口給當(dāng)前活動(dòng)的子窗口處理此命令的機(jī)會(huì); 3. 視圖檢查其消息映射,若沒有找到處理函數(shù),再把此命令發(fā)送給與其相連的文檔; 4. 文檔檢查其消息映射,如果找到命令的處理函數(shù),則調(diào)用此函數(shù),發(fā)送過程結(jié)束,否則繼續(xù)下面的步驟;5. 將命令發(fā)送給文檔模板,然后返回到視圖,再返回邊框窗口,邊框窗口檢查其消息映射;6. 命令回送到主邊框窗口,主邊框窗口檢查自己的消
30、息映射;7. 檢測應(yīng)用程序的消息映射,進(jìn)到消息入口,并調(diào)用適當(dāng)?shù)奶幚沓绦颉7祷胤祷?94.6 消息映射與消息處理函數(shù)4.6.1 消息映射與消息處理函數(shù)的概念消息映射與消息處理函數(shù)的概念通過消息映射,消息就和它的處理函數(shù)對(duì)應(yīng)起來。 消息處理函數(shù)指的是與某個(gè)消息對(duì)應(yīng)的函數(shù)。消息處理函數(shù)的執(zhí)行是由其對(duì)應(yīng)的消息引發(fā)的,某個(gè)類對(duì)象中的消息處理函數(shù)是與這個(gè)類對(duì)象能夠得到的一個(gè)消息對(duì)應(yīng)的,當(dāng)這個(gè)消息發(fā)生時(shí),這個(gè)函數(shù)就會(huì)被執(zhí)行。 消息處理函數(shù)的定義與使用方法與類的一般的成員函數(shù)不同。一般成員函數(shù)包括兩部分:函數(shù)的定義部分和函數(shù)的實(shí)現(xiàn)部分;而消息處理函數(shù)除了這兩部分以外,還有消息映射部分。返回返回304.6 消
31、息映射與消息處理函數(shù)4.6.2 管理窗口消息處理函數(shù)管理窗口消息處理函數(shù) 利用Class Wizard可以管理消息處理函數(shù),Class Wizard是一個(gè)非常強(qiáng)大有用的工具,我們可以用Class Wizard來創(chuàng)建新類、定義消息處理函數(shù)、覆蓋MFC的虛擬函數(shù),從對(duì)話框、表單視圖或記錄視圖的控件中獲取數(shù)據(jù)??梢杂萌N方法來激活Class Wizard對(duì)話框:1. 選擇【View】菜單中的【Class Wizard】菜單項(xiàng);2. 直接按下Ctrl+W鍵;3. 在代碼編輯窗口中單擊鼠標(biāo)右鍵(此時(shí),代碼編輯窗口中必須有打開的文件),在彈出菜單中選擇【Class Wizard】菜單項(xiàng)。返回返回314.6
32、 消息映射與消息處理函數(shù) 當(dāng)執(zhí)行了以上操作,窗口中將彈出【MFC Class Wizard】對(duì)話框。此時(shí)顯示的是【Message Map】選項(xiàng)卡。在這個(gè)選項(xiàng)卡的最上面有兩個(gè)下拉列表框:【Project】列表中顯示的是當(dāng)前的項(xiàng)目名稱,【Class name】列表中顯示的是正在編輯的消息映射所屬的類名。選項(xiàng)卡的中間也有兩個(gè)多行的列表框。左邊的【Object IDs】列表框中顯示的對(duì)象有三種類型:在【Class name】欄中列出的類名、菜單項(xiàng)對(duì)象和其他可能在【Class name】中所選的類傳遞消息的控件,當(dāng)其中的某一個(gè)類被選中時(shí),右面的 【Messages 】列表框就顯示出此類的能捕獲的所有Wi
33、ndows消息。其中還列出了一些能夠捕獲的普通消息的虛函數(shù)。最下面【Member functions】列表中顯示的是與此消息相關(guān)的類的成員函數(shù)的列表。返回返回324.6 消息映射與消息處理函數(shù) 在【MFC Class Wizard】對(duì)話框中共有五個(gè)選項(xiàng)卡,分別說明如下:1. 【Message Maps】選項(xiàng)卡 用于進(jìn)行消息映射的處理;2. 【Member Variables】選項(xiàng)卡 用于為對(duì)話框中的控件所用到的類創(chuàng)建成員變量;3. 【Automation】選項(xiàng)卡 幫助用戶管理與OLE自動(dòng)化相聯(lián)系的方法和屬性;4. 【ActiveX Events】選項(xiàng)卡 幫助用戶管理ActiveX類支持的Act
34、iveX事件;5. 【Class Info】選項(xiàng)卡 顯示類的一般信息,包括定義它的頭文件和源文件、類名以及與之相聯(lián)系的基類。返回返回334.6 消息映射與消息處理函數(shù)4.6.2.1 增加一個(gè)窗口消息增加一個(gè)窗口消息 以應(yīng)用程序MyExp為例,說明用Class Wizard增加一個(gè)窗口消息處理函數(shù)的過程。1.在VC+工作界面下打開MyExp項(xiàng)目,并啟動(dòng)Class Wizard,進(jìn)入對(duì)話框界面。2. 從【Class Name】復(fù)合框中選擇視圖類CMyExpView, 在【Object IDs】列表框中就會(huì)列出各種消息來源的組件。3. 從【Object IDs】列表框中選擇CMyExpView,在列
35、表框【Message】中列出的就是CMyExpView 類對(duì)象能夠從窗口對(duì)象CWnd接受到的窗口消息和各種可重載的虛函數(shù)。從中可以找到名為WM_LBUTTONDOWN 的消息,用鼠標(biāo)選中這個(gè)消息。返回返回344.6 消息映射與消息處理函數(shù)4. 此時(shí),【Add Function】按鈕處于可執(zhí)行狀態(tài),單擊此按鈕,就會(huì)在CMyExpView類中增加一個(gè)被CWnd保護(hù)的消息處理函數(shù)OnLButtonDown。5. 在【Member functions】列表框中能夠發(fā)現(xiàn)這個(gè)函數(shù)及其 對(duì) 應(yīng) 的 消 息 映 射 機(jī) 制 : O n L B u t t o n D o w n ON_WM_LBUTTONDO
36、WN。在函數(shù)前有一個(gè)“W“標(biāo)志,表示這個(gè)函數(shù)是一個(gè)窗口消息處理函數(shù)。6. 單擊【OK】按鈕,完成一個(gè)窗口消息處理函數(shù)的增加。4.6.2.2 增加窗口消息處理函數(shù)的過程的分析增加窗口消息處理函數(shù)的過程的分析 以上介紹了用Class Wizard增加一個(gè)窗口消息處理函數(shù)的過程,增加了該函數(shù)后,對(duì)于應(yīng)用程序MyExp的代碼做了如下的修改: 返回返回354.6 消息映射與消息處理函數(shù)1. 在視圖類CMyExpView中,增加了消息處理函數(shù)的定義代碼:/省略以上代碼 protected: /AFX_MSG(CMyExpView)afx_msg void OnLButtonDown(UINT nFlags
37、, CPoint point); /單擊鼠標(biāo)左鍵調(diào)用 /AFX_MSGDECLARE_MESSAGE_MAP()/省略以下代碼返回返回364.6 消息映射與消息處理函數(shù)2. 在CMyExpView 類的實(shí)現(xiàn)文件MyExpview.cpp中,增加了函數(shù)的實(shí)際代碼:void CMyExpView:OnLButtonDown(UINT nFlags, CPoint point) /TODO: Add your message handler code here and/or call default CView:OnLButtonDown(nFlags, point);3. 在實(shí)現(xiàn)文件MyExpView.cpp中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省揚(yáng)州市2024-2025學(xué)年高三上學(xué)期期末語文試題(原卷版+解析版)
- 美容美發(fā)行業(yè)數(shù)字化門店管理與服務(wù)系統(tǒng)建設(shè)方案
- 食品藥品安全監(jiān)管與管理作業(yè)指導(dǎo)書
- 2024年學(xué)年九年級(jí)語文上冊 第二單元 愛情如歌 第7課《致橡樹》教學(xué)實(shí)錄1 滬教版五四制
- 4平平安安回家來 教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治一年級(jí)上冊統(tǒng)編版
- 職場新人成功秘訣與教育培訓(xùn)需求分析報(bào)告
- DB3713-T 256-2022 高油酸花生高產(chǎn)栽培技術(shù)規(guī)程
- 2024年四年級(jí)英語上冊 Unit 3 My friends The sixth period教學(xué)實(shí)錄 人教PEP
- 6《夜間飛行的秘密》教學(xué)設(shè)計(jì)-2024-2025學(xué)年四年級(jí)語文上冊(統(tǒng)編版)
- 2023三年級(jí)數(shù)學(xué)上冊 一 兩、三位數(shù)乘一位數(shù)練習(xí)三(1)教學(xué)實(shí)錄 蘇教版
- 騰訊招聘測評(píng)題庫答案大全
- 旅游提成協(xié)議書
- 第六章《平面向量及其應(yīng)用》同步單元必刷卷(基礎(chǔ)卷)(考試版)
- 校園欺凌談話記錄表
- 2024年4月重慶公務(wù)員考試申論真題及答案解析
- 2016-2023年濟(jì)南工程職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 浙江省煙草專賣局(公司)管理類崗位招聘筆試真題2023
- 2024年全國高中生物聯(lián)賽競賽試題和答案
- 臺(tái)州模具行業(yè)現(xiàn)狀分析
- 會(huì)客廳策劃方案
- 過敏性鼻炎中醫(yī)治療
評(píng)論
0/150
提交評(píng)論