第9章Windows應(yīng)用程序引擎——消息映射.ppt_第1頁
第9章Windows應(yīng)用程序引擎——消息映射.ppt_第2頁
第9章Windows應(yīng)用程序引擎——消息映射.ppt_第3頁
第9章Windows應(yīng)用程序引擎——消息映射.ppt_第4頁
第9章Windows應(yīng)用程序引擎——消息映射.ppt_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

1、第九章:Windows應(yīng)用程序引擎消息映射,教學(xué)要點本章內(nèi)容包括消息的介紹(產(chǎn)生、發(fā)送、路由、接收),消息映射和消息、消息響應(yīng)函數(shù)的關(guān)系,常見窗口消息(鍵盤消息、鼠標(biāo)消息和定時器消息)的使用,消息監(jiān)視工具Spy+使用。要求了解消息映射機制在MFC中的應(yīng)用程序中的作用、利用API發(fā)送同步和異步消息、自定義消息的建立方法,熟悉消息監(jiān)視工具Spy+的使用,掌握消息映射三個宏的含義、鍵盤消息、鼠標(biāo)消息和定時器消息有關(guān)概念與用法,熟練掌握在應(yīng)用程序向?qū)傻某绦蛑卸ㄎ坏綄?yīng)三個消息映射宏,并且自己思考MFC應(yīng)用程序的執(zhí)行。,內(nèi)容簡介,Windows操作系統(tǒng)下的應(yīng)用程序都是基于事件驅(qū)動而工作的。消息映射是

2、一種把消息映射到相應(yīng)的消息響應(yīng)函數(shù)上的機制。Windows的各種消息沿著MFC應(yīng)用程序架構(gòu)規(guī)定的路線,找到它的歸宿消息映射函數(shù)。當(dāng)找不到的話,最終交給窗口對象的DefWindowProc成員函數(shù)去進行默認(rèn)的處理。,教學(xué)目標(biāo),要求了解消息映射機制在MFC中的應(yīng)用程序中的作用,利用API發(fā)送同步和異步消息、自定義消息的建立方法.熟悉消息監(jiān)視工具Spy+的使用掌握消息映射三個宏的含義、鍵盤消息、鼠標(biāo)消息和定時器消息有關(guān)概念與用法熟練掌握在應(yīng)用程序向?qū)傻某绦蛑卸ㄎ坏綄?yīng)三個消息映射宏,并且自己思考MFC應(yīng)用程序的執(zhí)行過程中,為什么看不到API編程中的WinMain()函數(shù)。,第9章目錄,9.1認(rèn)識

3、消息9.2MFC中消息的發(fā)送與接收9.3常用的窗口消息習(xí)題,9.1認(rèn)識消息,消息機制是Win32程序設(shè)計的靈魂,Win應(yīng)用程序利用格式化的Windows消息與其它Windows應(yīng)用程序及Windows系統(tǒng)進行通訊??梢允褂肎etMessage()函數(shù)來獲取消息,然后利用DispatchMessage()函數(shù)發(fā)送消息到窗口處理函數(shù),最后由窗口函數(shù)來進行消息的處理。MFC將面向?qū)ο蟮腃+編程思想與消息驅(qū)動機制結(jié)合在一起.,9.1.1消息的產(chǎn)生9.1.2消息的種類9.1.3一個應(yīng)用程序的消息映射分析9.1.4消息映射函數(shù)*9.1.5用類向?qū)Ч芾硐⒂成?9.1認(rèn)識消息(下),9.1.1消息的產(chǎn)生,W

4、indows對每一個輸入事件都產(chǎn)生一個消息,Windows應(yīng)用程序也可以調(diào)用Windows函數(shù),指示W(wǎng)indows給應(yīng)用程序發(fā)送消息,Windows系統(tǒng)環(huán)境也可以給Windows應(yīng)用程序發(fā)送消息,兩個Windows應(yīng)用程序之間也可通過WM_COPYDATA消息來共享數(shù)據(jù)。,9.1.2消息的種類,1.窗口消息(Windowsmessage)窗口消息的產(chǎn)生一般與創(chuàng)建窗口、繪制窗口、移動窗口和銷毀窗口及在窗口中操作等操作有關(guān)2.命令消息命令消息一般與處理用戶的請求相關(guān),是由某一用戶接口事件所出發(fā)的消息。3.控件通知消息(Controlnotification)某些重要事件發(fā)生時,由控件或者其他類型的

5、子窗口發(fā)送到父窗口的消息。4.自定義消息有時候用戶需要定義一些程序內(nèi)部使用的消息,以區(qū)別于系統(tǒng)定義的消息,這些用戶自己定義的消息稱為自定義消息。,9.1.3一個應(yīng)用程序的消息映射分析,Windows靠消息的流動而轉(zhuǎn)動,在利用Win32API開發(fā)圖形界面的應(yīng)用程序時,在核心的窗口函數(shù)(進行消息處理的函數(shù))中使用了一個大的switch/case結(jié)構(gòu)進行流程的控制,對消息進行分門別類地控制。隨著對響應(yīng)消息的增加,switch/case結(jié)構(gòu)會出現(xiàn)多層嵌套,程序理解會出現(xiàn)很大的困難,為了解決這個問題,在MFC中引入了消息映射的概念。,例:一個簡單的演示消息映射,1生成程序框架(1)啟動VC6.0,選擇“

6、File”菜單的“New”命令,在彈出的“New”對話框中選擇“Project”選項卡。(2)在“Project”選項卡的列表中選擇“MFCAppWizard(exe)”項,在“ProjectName”編輯框中輸入要創(chuàng)建的工程名稱MsgMap,在“Location”編輯框中設(shè)置工程的存放位置,單擊“OK”按鈕。(3)在彈出的“MFCAppWizard-Step1”對話框中選擇“singledocument”,然后單擊“Finish”按鈕。(4)在彈出的“NewProjectinformation”對話框中單擊“OK”按鈕,完成應(yīng)用程序框架的創(chuàng)建。,2消息映射消息映射是一種把Windows系統(tǒng)的

7、各種消息(共四類消息)映射到MFC類庫的成員函數(shù)上的機制。MFC的應(yīng)用程序中,消息映射可以被MFC的CCmdTarget類或從其派生而來的任何一個類來使用。在上述生成的MsgMap單文檔應(yīng)用程序中,共有應(yīng)用程序類、框架類、文檔類、視圖類和對話框類。這五個類都是從CCmdTarget類派生而來,所以Windows操作系統(tǒng)可以向所有這些類發(fā)送消息。3應(yīng)用程序框架中的消息映射編譯并運行上述程序,在程序的主界面中,單擊工具欄中的“?”按鈕,則彈出“關(guān)于MsgMap”對話框,我們以該功能的實現(xiàn)為例,來說明Windows中的命令消息的映射.,3應(yīng)用程序框架中的消息映射,(1)“?”工具欄按鈕的資源ID,(

8、2)“?”工具欄按鈕的消息映射利用應(yīng)用程序向?qū)傻臉?biāo)準(zhǔn)MFC應(yīng)用程序中,從CCmdTarget派生的類將消息與消息響應(yīng)函數(shù)通過一些預(yù)定義的宏聯(lián)系起來,實現(xiàn)了一一對應(yīng),這種機制就是消息映射,MFC中使用的是功能強大的消息映射宏來實現(xiàn)的。它們是DECLARE_MESSAGE_MAP(初始化消息映射表)、BEGIN_MESSAGE_MAP(開始用戶消息映射)、END_MESSAGE_MAP(結(jié)束用戶消息映射)以及一些ON_宏。,消息映射的聲明,classCMsgMapApp:publicCWinApppublic:CMsgMapApp();/應(yīng)用程序類的構(gòu)造函數(shù)/Overrides以下為可超載的虛

9、擬函數(shù)/ClassWizardgeneratedvirtualfunctionoverrides/AFX_VIRTUAL(CMsgMapApp)public:virtualBOOLInitInstance();/AFX_VIRTUAL,消息映射的聲明,/Implementation/AFX_MSG(CMsgMapApp)afx_msgvoidOnAppAbout();/工具欄按鈕“?”的消息映射函數(shù)/NOTE-theClassWizardwilladdandremovememberfunctionshere./DONOTEDITwhatyouseeintheseblocksofgenerate

10、dcode!/AFX_MSGmappingmacroshere./DONOTEDITwhatyouseeintheseblocksofgeneratedcode!,消息映射的定義,DECLARE_MESSAGE_MAP()/消息映射宏的聲明;BEGIN_MESSAGE_MAP(CMsgMapApp,CWinApp)/AFX_MSG_MAP(CMsgMapApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)/工具欄?按鈕ID_APP_ABOUT對單擊的消息映射為OnAppAbout/NOTE-theClassWizardwilladdandremove/AFX_MSG_

11、MAP/StandardfilebaseddocumentcommandsON_COMMAND(ID_FILE_NEW,CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)/StandardprintsetupcommandON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:OnFilePrintSetup)END_MESSAGE_MAP(),4消息映射中的幾種宏定義,消息映射中的映射都是一些定義好的宏,如ON_WM_MOUSEACTIVATE,ON_COMMAND,ON_UPDATE_COMMAN

12、D_UI,ON_BN_CLICKED,ON_MESSAGE,ON_REGISTER_MESAAGE等等,這些宏根據(jù)消息類別的不同而不同,有的有參數(shù),有的無參數(shù)。表9.1是常見的宏,表9.1常見消息的映射宏,9.1.4消息映射函數(shù),當(dāng)Windows接收到一個消息時,Windows通過查找消息映射表就能找到一個專門的處理函數(shù)來對其進行響應(yīng),該函數(shù)就是消息映射函數(shù)(又叫消息響應(yīng)函數(shù)),它是相應(yīng)類的成員函數(shù)。,消息映射函數(shù),消息映射函數(shù)的實現(xiàn)代碼為:voidCMsgMapApp:OnAppAbout()/命令消息的消息映射函數(shù)的實現(xiàn)CAboutDlgaboutDlg;/聲明一個“關(guān)于”對話框?qū)ο骯bo

13、utDlgaboutDlg.DoModal();/調(diào)用對話框的成員函數(shù)DoModal顯示對話框,9.1.5用類向?qū)Ч芾硐⒂成?1.管理消息ClassWizard可以用于管理消息和用戶交互對象2.管理成員變量3.管理ActivcX控件的事件與自動化由于本書沒有講這方面的內(nèi)容,故不作詳細(xì)解釋。,9.2MFC中消息的發(fā)送與接收,9.2.1消息的發(fā)送與接收9.2.2命令消息的路由9.2.3利用函數(shù)發(fā)送消息9.2.4消息的接收與處理,9.2.1消息的發(fā)送與接收,大部分消息的發(fā)送是由用戶與應(yīng)用程序之間的交互進行的。MFC中的CWinApp類的Run()成員函數(shù)負(fù)責(zé)把消息從應(yīng)用程序的消息隊列中取出,發(fā)送到

14、應(yīng)用程序的窗口函數(shù)WinProc()中,由該函數(shù)根據(jù)消息的類別,傳送到相應(yīng)的對象中。每一個能夠接收消息的對象(從CCmdTarget派生)都有一個消息映射表,它用來連接消息與對應(yīng)的消息響應(yīng)函數(shù)。,9.2.2命令消息的路由,在MFC程序中,大多數(shù)要處理的消息都針對一種類型的對象窗口,這符合WindowsAPI的模式,而且,這些消息的命名都是有實際意義,如消息WM_CREATE、WM_MOVE和WM_SIZE就告訴我們一個窗口被創(chuàng)建、移動和改變其大小了。任何由CCmdTarget派生的類對象都能接收命令消息(點擊菜單后發(fā)出的WM_COMMAND消息),這些類對象組成一個有序鏈表,鏈表中的每一個對象

15、都可以同時接收到命令消息,但命令消息是按照一定的路徑傳送的,鏈表中的各個對象處理命令消息的優(yōu)先級的順序并不相同。表9.2列出了當(dāng)MFC發(fā)送命令消息給非文檔/視窗結(jié)構(gòu)的應(yīng)用、單文檔應(yīng)用以及多文檔應(yīng)用程序時,查找消息映射表的次序。表9.2不同應(yīng)用類型中命令消息的處理路徑,表9.2不同應(yīng)用類型中命令消息的處理路徑,9.2.3利用函數(shù)發(fā)送消息,使用PostMessage()投遞消息在線程消息隊列中的隊尾放置消息并立返回不等待線程處理這條消息。使用SendMessage()立即發(fā)送消息直接向一窗口函數(shù)發(fā)送消息,它調(diào)用一個窗口函數(shù)等待窗口函數(shù)對消息的處理和返回結(jié)果。使用SendDlgItemMessage

16、()向?qū)υ捒蛑锌丶l(fā)送消息要指定控件的標(biāo)識和含有該控件的對話框窗口句柄。,9.2.4消息的接收與處理,一般情況下,使用GetMessage()函數(shù)從消息隊列讀取這些消息,由DispatchMessage()將它們傳送給相應(yīng)的窗口函數(shù)進行處理.另外,Windows還可以直接將某些消息發(fā)送給某些應(yīng)用程序的窗口函數(shù),而不將它們放入應(yīng)用程序的隊列中,可以使用SendMessage()函數(shù)達(dá)到此目的。MFC應(yīng)用程序中,消息的接收和處理靠消息映射機制來完成,當(dāng)接收到一個消息時,Windows從消息映射表中找出該消息所對應(yīng)的消息映射函數(shù),然后調(diào)用該映射函數(shù)完成相應(yīng)的功能。,9.3常用的窗口消息,9.3.1鍵

17、盤消息9.3.2鼠標(biāo)消息9.3.3WM_TIMER消息9.3.4自定義消息*9.3.5消息監(jiān)測工具Spy+的使用,9.3.1鍵盤消息,1掃描碼與虛擬碼按下一個鍵或者釋放一個鍵,鍵盤設(shè)備就產(chǎn)生一個掃描碼(ScanCode),這些掃描碼是鍵盤的物理碼,每一個掃描碼可以唯一地確定一個按鍵。為了實現(xiàn)與設(shè)備無關(guān)的鍵盤操作,Windows系統(tǒng)中定義了一個虛擬鍵盤,Windows的鍵盤驅(qū)動程序Keybord.drv實現(xiàn)將各種不同的物理鍵盤映射到同一個虛擬鍵盤,程序員處理的是這唯一的虛擬鍵.表9.3常用的虛擬鍵代碼,表9.3常用的虛擬鍵代碼,2擊鍵消息,對于鍵盤上的所有鍵,每次按下或釋放時,都會產(chǎn)生擊鍵消息。

18、擊鍵消息主要有四種,分別為WM_KEYDOWN(鍵按下)、WM_SYSKEYDOWN(系統(tǒng)鍵按下)、WM_KEYUP(鍵彈起)、WM_SYSKEYUP(系統(tǒng)鍵彈起),3字符消息,當(dāng)按了鍵盤上的任一個鍵時,Windows都會向窗口函數(shù)發(fā)送擊鍵消息,對于那些產(chǎn)生可顯示字符的操作,Windows還會向窗口函數(shù)發(fā)送字符消息WM_CHAR。因此字符消息不是由硬件產(chǎn)生的,而是由可產(chǎn)生顯示字符的擊鍵消息轉(zhuǎn)換而來的,表9.擊鍵與消息的關(guān)系,表9.擊鍵與消息的關(guān)系,9.3.2鼠標(biāo)消息,鼠標(biāo)簡介鼠標(biāo)消息鼠標(biāo)消息響應(yīng)函數(shù),1.鼠標(biāo)簡介,Windows系統(tǒng)支持單鍵(光筆就是模擬單鍵的鼠標(biāo))、雙鍵和三鍵的鼠標(biāo),利用AP

19、I函數(shù)GetSystemMetric()可以檢測鼠標(biāo)是否存在以及鼠標(biāo)上鍵的個數(shù)。,2.鼠標(biāo)消息,當(dāng)用戶移動、按下或釋放鼠標(biāo)箭時,都會產(chǎn)生鼠標(biāo)消息,根據(jù)鼠標(biāo)所處的位置不同(窗口的客戶區(qū)或非客戶區(qū)),Windows下的鼠標(biāo)消息也分為兩大類:客戶區(qū)域的鼠標(biāo)消息、非客戶區(qū)域的鼠標(biāo)消息。,3.鼠標(biāo)消息響應(yīng)函數(shù),afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);參數(shù)nFlags代表當(dāng)按下一個鼠標(biāo)鍵盤時,各種虛擬鍵盤上的鍵或鼠標(biāo)上的鍵是否真的被按下,該參數(shù)的值有:MK_CONTROL(若按下Ctrl鍵,則置位),MK_SHIFT(若按下Shift鍵,則置位),

20、MK_LBUTTON(若按下鼠標(biāo)左鍵,則置位),MK_MBUTTON(若按下鼠標(biāo)中鍵,則置位),MK_RBUTTON(若按下鼠標(biāo)右鍵,則置位)。參數(shù)point代表客戶區(qū)坐標(biāo)中鼠標(biāo)光標(biāo)的坐標(biāo)位置。,9.3.3WM_TIMER消息,Windows定時器是一種周期性的消息產(chǎn)生裝置,它會每隔一段指定時間發(fā)送一次定時消息WM_TIMER。它是一個很重要的系統(tǒng)消息,當(dāng)系統(tǒng)所設(shè)置的時間到達(dá)以后,系統(tǒng)就會自動發(fā)送該消息。與該消息聯(lián)系密切的一個函數(shù)是SetTimer(),它設(shè)置一個系統(tǒng)時鐘,當(dāng)設(shè)置的時間到時,系統(tǒng)產(chǎn)生WM_TIMER消息。通過對SetTimer()函數(shù)的參數(shù)進行設(shè)置,告訴用戶哪一個時鐘的時間到了

21、,因此可以將一些周期性的工作放入WM_TIMER的消息處理函數(shù),WM_TIMER消息,定時器的使用一般遵循下列步驟:1.使用SetTimer()函數(shù)設(shè)置定時器2.超載OnTimer()函數(shù),完成用戶希望的操作3.撤消定時器KillTimer(),9.3.4自定義消息,Windows應(yīng)用程序利用格式化的Windows消息來與其它Windows應(yīng)用程序及Windows操作系統(tǒng)進行通訊,這些消息被發(fā)往應(yīng)用程序的窗口函數(shù)進行處理。,建立自定義消息的操作步驟為:,定義自己的窗口消息(定義消息標(biāo)識符)在適當(dāng)?shù)奈恢寐暶飨⑻幚砗瘮?shù)將消息處理函數(shù)與消息對應(yīng)起來(映射消息)編寫代碼實現(xiàn)該消息處理函數(shù)利用消息函數(shù)

22、向指定的窗口發(fā)送消息【例9-5】本程序?qū)崿F(xiàn)利用自定義消息實現(xiàn)啟動Windows系統(tǒng)中“附件”中的“畫圖”程序,*9.3.5Windows消息監(jiān)測工具Spy+的使用,Windows系統(tǒng)通過傳遞消息到各個窗口來通知其用戶的行為,因此弄清楚應(yīng)用程序可以接收的消息類型對掌握Windows的編程十分重要。然而Windows系統(tǒng)中有一千個左右的消息,有時候要搞清楚應(yīng)該處理哪些消息是很困難的。VisualStudio中包含的spy+工具就提供了這種能力,它能顯示發(fā)送到各個窗口的每一條消息,同時能探測出各個應(yīng)用程序中的窗口、進程、線程。,*9.3.5Windows消息監(jiān)測工具Spy+的使用,Spy+顯示的層次結(jié)構(gòu)反映了系統(tǒng)對象的層次結(jié)構(gòu):進程擁有線程、線程擁有窗口。注意有的線程可以沒有窗口,有窗口的線程在接收消息時,其優(yōu)先級別就會提高。這一機制使得Windows的圖形用戶界面能夠快速響應(yīng)用戶的輸入。在開發(fā)Windows應(yīng)用程序的過程中,常常會碰到程序不能正常結(jié)束的錯誤,雖然用戶程序窗口已經(jīng)不存在了,但其進程仍在系統(tǒng)中運行,Spy+的線程窗口能準(zhǔn)確地告訴我們當(dāng)前有多少線程在系統(tǒng)中運行。,*9.3.5Windo

溫馨提示

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

評論

0/150

提交評論