MFC消息映像與消息路由網(wǎng)絡(luò)構(gòu)建及仿真(圖文)_第1頁(yè)
MFC消息映像與消息路由網(wǎng)絡(luò)構(gòu)建及仿真(圖文)_第2頁(yè)
MFC消息映像與消息路由網(wǎng)絡(luò)構(gòu)建及仿真(圖文)_第3頁(yè)
MFC消息映像與消息路由網(wǎng)絡(luò)構(gòu)建及仿真(圖文)_第4頁(yè)
MFC消息映像與消息路由網(wǎng)絡(luò)構(gòu)建及仿真(圖文)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

1、MFC消息映像與消息路由網(wǎng)絡(luò)構(gòu)建及仿真(圖文)論文導(dǎo)讀:本文提出了MFC消息映像與消息路由網(wǎng)絡(luò)構(gòu)建與仿真的實(shí)施方案。通過(guò)構(gòu)建仿真平臺(tái)功能模塊,建造類別型錄仿真網(wǎng)絡(luò)與MFC消息映像表與映像鏈,重點(diǎn)論述了MFC消息路由仿真的具體實(shí)施方案,給出仿真的框架并進(jìn)行仿真。從而驗(yàn)證了MFC的消息映像與消息路由機(jī)制。ClassTypeNetwork處于技術(shù)的中樞位置,在此基礎(chǔ)上,我們可以完成運(yùn)行時(shí)類型識(shí)別(RTTI),進(jìn)而可以動(dòng)態(tài)創(chuàng)建對(duì)象(DynamicCreation),后者又為數(shù)據(jù)的永久存儲(chǔ)(Persistence)提供了可能。關(guān)鍵詞:消息映像,消息路由,動(dòng)態(tài)創(chuàng)建,網(wǎng)絡(luò)仿真,MFC1. 引言信息化的發(fā)展,

2、對(duì)軟件開(kāi)發(fā)提出了更高的要求。Microsoft MFC應(yīng)用程序框架為程序員提供了高效的開(kāi)發(fā)平臺(tái),但也隱藏了很多細(xì)節(jié)。消息傳遞和路由網(wǎng)絡(luò)是一個(gè)典型的范例。下面構(gòu)造仿真平臺(tái),構(gòu)建消息映像與消息路由網(wǎng)絡(luò),并給出console仿真。2. 仿真平臺(tái)功能模塊微軟定義了若干宏,完成了對(duì)類別型錄的封裝,形成了一張巨大的類別型錄網(wǎng)絡(luò)(Class Type Network)。圖1給出了幾種技術(shù)的關(guān)系。Class Type Network處于技術(shù)的中樞位置,在此基礎(chǔ)上,我們可以完成運(yùn)行時(shí)類型識(shí)別(RTTI),進(jìn)而可以動(dòng)態(tài)創(chuàng)建對(duì)象(Dynamic Creation),后者又為數(shù)據(jù)的永久存儲(chǔ)(Persistence)提

3、供了可能。Windows借助于消息映像(Message Mapping)構(gòu)造出消息映像表與消息映像鏈。消息路由(Message Routing) 描述了消息在各個(gè)對(duì)象之間的流動(dòng)路徑。發(fā)表論文。本文首先給出MFC型錄網(wǎng)絡(luò)的構(gòu)建過(guò)程,然后完成Message Mapping和Message Routing的軟件仿真。圖1 仿真平臺(tái)功能模塊3. 仿真過(guò)程3.1 類別型錄仿真網(wǎng)絡(luò)構(gòu)建類別型錄網(wǎng)絡(luò)記載MFC類庫(kù)中所有類的信息,包括類的名稱,類的大小,版本號(hào),類的創(chuàng)建函數(shù)指針,及類的基類指針。發(fā)表論文。使用一個(gè)結(jié)構(gòu)體CRuntimeClass表示,該結(jié)構(gòu)體構(gòu)成如下:struct CRuntimeClass

4、LPCTSTR m_strClsName; /類名UINTm_ObjSize; /類大小UINTm_version; /類版本號(hào)CObject*( *m_pfnCreateObj)(); /創(chuàng)建類的回調(diào)函數(shù)指針CRuntimeClass* m_pBaseClass; /基類指針staticCRuntimeClass* pFirstClass; /類鏈表表頭CRuntimeClass*m_pNextClass; /結(jié)構(gòu)的next指針域;為每一個(gè)類都定義一個(gè)CRuntimeClass類型的靜態(tài)結(jié)構(gòu)成員。如為MFC的根類CObject類定義靜態(tài)結(jié)構(gòu)成員CObject:classCObject,為窗口

5、類的根類CWnd定義靜態(tài)結(jié)構(gòu)成員CWnd:classCWnd,等等。每加入一個(gè)類均為該類定義這么一個(gè)靜態(tài)結(jié)構(gòu)成員。發(fā)表論文。終而,構(gòu)成一個(gè)由CRuntimeClass:pFirstClass打頭的類別型錄網(wǎng)絡(luò)。圖2 類別型錄網(wǎng)絡(luò)基于類別型錄網(wǎng)絡(luò),可以完成RTTI,即運(yùn)行時(shí)類型識(shí)別,并可完成對(duì)象的動(dòng)態(tài)創(chuàng)建(Dynamic Creation),水到渠成,Persistence是必然的結(jié)果。在MFC中,類別型錄網(wǎng)絡(luò)是通過(guò)宏DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC創(chuàng)建出來(lái),類別型錄網(wǎng)絡(luò)的建立為消息映像和消息路由仿真奠定了基礎(chǔ)。3.2 MFC消息映像表與映像鏈的建立為每一個(gè)類定

6、義一個(gè)具有messageMap結(jié)構(gòu)的消息映像表,如圖3所示。該結(jié)構(gòu)包括兩個(gè)指針項(xiàng),其一指向父類的消息映像表messageMap結(jié)構(gòu),另一個(gè)指針項(xiàng)指向一個(gè)數(shù)據(jù)類型為AFX_MSGMAP_ENTRY的結(jié)構(gòu)數(shù)組,數(shù)組中的每一項(xiàng)均包含一個(gè)消息函數(shù)指針,指向一個(gè)類型為CCmdTarget的成員函數(shù)指針的消息回調(diào)函數(shù)。然后,我們定義宏#define DECLARE_MESSAGE_MAP()staticAFX_MSGMAP_ENTRY _messageEntries;staticAFX_MSGMAP messageMap;virtualAFX_MSGMAP* GetMessageMap() ;這樣就聲明了

7、虛線框“”中的數(shù)據(jù)結(jié)構(gòu)。圖3 消息映像表數(shù)據(jù)結(jié)構(gòu)接著,需要填充圖3虛框“”中的數(shù)據(jù)結(jié)構(gòu)內(nèi)容,即要完成Item_1,Item_2,Item_n等的填充工作。同樣,可以定義宏來(lái)完成,定義如下:#defineBEGIN_MESSAGE_MAP(theClass, baseClass)AFX_MSGMAP*theClass:GetMessageMap() const /return &theClass:messageMap; AFX_MSGMAPtheClass:messageMap = /&(baseClass:messageMap),(AFX_MSGMAP_ENTRY* ) &(theClass:

8、_messageEntries );AFX_MSGMAP_ENTRY theClass:_messageEntries = /BEGIN_MESSAGE_MAP宏結(jié)束#defineON_COMMAND(id, memF)WM_COMMAND,0, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memF,/ON_COMMAND宏結(jié)束#defineEND_MESSAGE_MAP()0,0,0,0,Afxsig_end, (AFX_PMSG)0 ;/END_MESSAGE_MAP宏結(jié)束定義了3個(gè)宏,實(shí)現(xiàn)了對(duì)消息映像表中數(shù)據(jù)結(jié)構(gòu)內(nèi)容的填充。其中第一個(gè)和第三個(gè)宏是必不

9、可少的,而中間的宏ON_COMMAND(id,memFn)實(shí)現(xiàn)了對(duì)消息映射項(xiàng)Item_1的填充,是可選宏。但該宏實(shí)現(xiàn)了消息ID和處理函數(shù)memF的關(guān)聯(lián)。所以,MFC程序員只需要在類的頭文件中聲明DECLARE_MESSAGE_MAP()宏,便建立了圖3虛框“”中的數(shù)據(jù)結(jié)構(gòu)。然后,在類的實(shí)現(xiàn)文件中加入:BEGIN_MESSAGE_MAP(theClass,baseClass)ON_COMMAND(id,memFn)END_MESSAGE_MAP()便完成了圖3虛框“”中的數(shù)據(jù)結(jié)構(gòu)的填充。故而,在MFC的類層次結(jié)構(gòu)中的所有可允許接收和處理消息的類中都加入相應(yīng)的宏便可完成消息映像表和消息映像鏈的建立

10、。3.3 MFC消息路由仿真現(xiàn)在消息映像表與消息映像鏈已經(jīng)建立起來(lái)。消息進(jìn)來(lái)之后,需要搞清楚在消息泵推動(dòng)下的消息流動(dòng)機(jī)制。 MFC對(duì)消息循環(huán)的處理規(guī)定MFC對(duì)消息循環(huán)的處理是如下規(guī)定的:如果是一般的Windows消息(WM_xxx),則一定是由派生類流向基類。如果是WM_COMMAND消息,則有如下路線:若WM_COMMAND消息接收者為Frame窗口,則處理次序?yàn)椋篤iew窗口Frame窗口本身CWinApp對(duì)象若WM_COMMAND消息接收者為View窗口,則處理次序?yàn)椋篤iew本身Document若WM_COMMAND消息接收者為Document,則處理次序?yàn)椋篋ocument本身Doc

11、ument Template消息路由仿真方案基于3.2消息映像表及映像鏈的定義,依據(jù)3.3MFC對(duì)消息循環(huán)的處理規(guī)定,設(shè)計(jì)消息路由仿真方案。圖4給出了整個(gè)框架。圖4 消息路由仿真框架圖4分兩類分別闡述了普通Window消息及WM_COMMAND命令消息的處理機(jī)制,給出了兩類消息的路由過(guò)程。說(shuō)明如下:對(duì)于普通Windows消息,處理非常簡(jiǎn)單,僅需要遍歷整個(gè)消息映像鏈。從派生類到基類,依次遍歷類的消息映像表,查詢消息映射項(xiàng)。若存在與消息對(duì)應(yīng)的消息處理函數(shù),則調(diào)用該消息處理函數(shù),若無(wú),則調(diào)用默認(rèn)的消息處理函數(shù)DefWindowProc(),然后返回。對(duì)于WM_COMMAND消息,處理起來(lái),稍顯復(fù)雜。

12、視接收消息的對(duì)象不同,消息路由路徑也不相同。若是CMyFrame框架窗口接收到命令消息,則需要分別從CMyView、CMyDocment、CMyFrame、CMyWinApp開(kāi)始遍歷消息映像鏈4次。圖4已從CMyFrame開(kāi)始標(biāo)出了路由路徑。若是CMyView視對(duì)象接收到命令消息,則需要分別從CMyView、CMyDocment開(kāi)始遍歷消息映像鏈2次。同樣,圖4已從CMyView開(kāi)始標(biāo)出了路由路徑。若是CMyDocument接收到消息,則需從CMyDocment開(kāi)始遍歷消息映像鏈1次即可。 MFC console程序編寫(xiě)首先,類別型錄仿真網(wǎng)絡(luò);然后,建立消息映像表與映像鏈;接著,依據(jù)消息路由仿真方案編寫(xiě)MFC console仿真程序。經(jīng)過(guò)仿真,實(shí)現(xiàn)了MFC運(yùn)行時(shí)動(dòng)態(tài)類型識(shí)別,實(shí)現(xiàn)了一般Windows消息的路由,并按規(guī)劃方案實(shí)現(xiàn)了WM_COMMAND消息的消息路由,驗(yàn)證了MFC的消息路由機(jī)制。4. 結(jié)論通過(guò)設(shè)計(jì)類別型錄仿真網(wǎng)絡(luò),構(gòu)造消息映像表與映像鏈,并依據(jù)消息路由仿真方案設(shè)計(jì)console仿真程序。完成了對(duì)MFC的消息映像與消息路由的仿真,驗(yàn)證了MFC的消息映像與消息路由機(jī)制。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論