

下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、DECLARE_MESSAGE_MAP0與消息傳遞網一總體結構首先,在.h文件中:DECLARE_MESSAGE_MAP()然后在.CPP文件中:BEGIN_MESSAGE_MAP(CView,CWnd)ON_COMMAND(CViewid,0)END_MESSAGE_MAP()上面.h中的宏的聲明是:#defineDECLARE_MESSAGE_MAPstaticAFX_MSGMAP_ENTRY_messageEntries;staticAFX_MSGMAPmessageMap;virtualAFX_MSGMAP*GetMessageMap()const;該宏相當于在類中聲明兩個static
2、數據成員和一個虛成員函數。它們的定義由.CPP中的三個宏實現:#defineBEGIN_MESSAGE_MAP(class_name,base_class)AFX_MSGMAP*class_name:GetMessageMap()constreturn&class_name:message;AFX_MSGMAPmessageMap=&base_class:messageMap,class_name:_messageEntriesAFX_MSGMAP_ENTRY_messageEntries=#defineON_COMMAND(id,memFunc)WM_COMMAND,0,id,id,AFx_
3、sig_vv,(AFX_PMSG)memFunc,#defineEND_MESSAGE_MAP()0,0,0,0,AfxSig_end,(AFX_PMSG)0;注意這三個宏中的內容共同完成了一個AFX_MSGMAP_ENTRY結構體數組的填寫,其花括號上面用紅色斜體標了出來。因此這三個宏必須連在一起調用,且前后順序必須正確。總體來說,就是DECLARE_MESSAGE_MAP負責倆個成員變量與一個成員函數的聲明,BEGIN_MESSAGE_MAP、ON_COMMAND、END_MESSAGE_MAP、負責聲明所對應的實現。二關于聲明至于其中聲明的成員變量,如下:1.AFX_MSGMAP。該結構
4、體負責存儲兩個指針,分別指向基類的AFX_MSGMAP,以及本類的消息映射表AFX_MSGMAP_ENTRYstructAFX_MSGMAPAFX_MSGMAP*pBaseMessageMap;/仔旨向基類的本結構。AFX_MSGMAP_ENTRY*lpEntries;/體類的消息映射表。;2消息映射表AFX_MSGMAP_ENTRY。該結構體可以存儲一條消息的所有相關信息。在類中,使用了該結構體類型的數組,因此本類有多少消息,就需要在數組中存多少元素。structAFX_MSGMAP_ENTRYUINTnMessage;UINTnCode;UINTnID;UINTnLastID;UINTnS
5、ig;AFX_PMSGpfn;該結構體最后的成員AFX_PMSG也是個結構體,其聲明如下:3函數指針typedefvoid(CCmdTarget:*AFX_PMSG)(void);很明顯,AFX_PMSG指向的函數指針是相應消息的處理函數。當觸發某個消息時,就會調用該消息所對應的函數旨針。以上聲明,展開就是:ClassCView:publicCWndPublic:staticAFX_MSGMAP_ENTRY_messageEntries;staticAFX_MSGMAPmessageMap;virtualAFX_MSGMAP*GetMessageMap()const;三關于實現CPP中的三個宏
6、,負責對.h聲明的兩個成員變量與一個成員函數進行實現。展開后:AFX_MSGMAP*class_name:GetMessageMap()constreturn&class_name:message;AFX_MSGMAPmessageMap=&base_class:messageMap,class_name:_messageEntriesAFX_MSGMAP_ENTRY_messageEntries=WM_COMMAND,0,id,id,AFx_sig_vv,(AFX_PMSG)memFunc,0,0,0,0,AfxSig_end,(AFX_PMSG)0;可見,本類中主要的數據成員只有一個,就是
7、消息映射表AFX_MSGMAP_ENTRY數組。AFX_MSGMAP的兩個成員變量,一個指向基類的AFX_MSGMAP_ENTRY,個指向本類的AFX_MSGMAP_ENTRY。而那個成員函數GetMessageMap()則是用來獲取本類的AFX_MSGMAP的。因此,若有派生關系:CCmdeTarget-CWnd-CView-CMyView則:可以通過GetMessageMap()用來獲取CMyView的AFX_MSGMAP,從而得到CMyView的AFX_MSGMAP_ENTRY和基類的AFX_MSGMAP(也就是CView的AFX_MSGMAP)。由于得到了CView的AFX_MSGMA
8、P,于是又有了CView的AFX_MSGMAP_ENTRY和基類的AFX_MSGMAP(也就是CWnd的AFX_MSGMAP)。同理,可以獲取CCmdeTarget的AFX_MSGMAP。但CCmdeTarget就是最終消息的源頭類了,不會再上溯。因此CCmdeTarget的AFX_MSGMAP需要單獨實現。故而,一條消息,交給一個派生類對象CMyView后,可以不斷上溯,直到到達CCmdeTarget。這,就是消息傳遞網。這張網為消息在基類與派生類之間傳遞提供了通道。但現在僅僅是架設了一張網,消息進來后,還是不能自行傳遞或流動,缺乏一個推動消息前進的動力。該動力屬于Windows程序設計的工
9、作。特別注意,在這張網中,消息一定是由派生類流向基類的,縱向流動,而不能逆流(基類流向派生類)或者橫流(流向兄弟類)。對于一般的Windows消息(WM_xxx),定遵循此規則。但對于命令消息WM_COMMAND,消息流動則可能有其他路線。夾在BEGIN_MESSAGE_MAP與END_MESSAGE_MAP之間的宏,上面是ON_COMMAND。該宏的作用是將消息與消息處理函數綁定。但除了ON_COMMAND之外,還有很多其他的宏也用于這里。比如ON_WM_CREATEON_WM_LBUTTONDOWN,ON_WM_PAINT等。不同之處在于,ON_COMMAND宏可以將很多不同類型的消息與處理函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業園區規劃與產業升級研究
- 工業大數據在智能工廠的應用
- 工業污染治理技術與實踐
- 工業機器人與智能制造的關系研究
- 工業機器人技術及其應用案例分享
- 工業污染防治與環境保護措施
- 工業機器人發展現狀及趨勢分析
- 工業自動化系統的能效管理與優化
- 工業物聯網安全保障方案
- 工業設計中的創新設計思維研究
- GB/T 19023-2025質量管理體系成文信息指南
- 多余物管理制度
- 6se70手冊-整流回饋單元
- CA6140車床撥叉831003說明書
- 2023高中自主招生數學模擬試題及答案
- 腳手架常見安全隱患及違反條款
- DB61∕T 1143-2018 陜西省公共安全視頻監控聯網系統工程技術規范
- 安全生產培訓《低壓電工》實操科目一、三復習題
- 郁證--PPT課件(PPT 35頁)
- 1才小型澆注生產線方案
- 半命題作文“-------的你--------的我”寫作指導及范文
評論
0/150
提交評論