??????????????????????? 先對對于mfc中的命令消息路由的機制原理作個簡單的總結:
????? CCmdTarget 為 模板 ,提供: CCmdTarget::OnCmdMsg() 這個函數(shù) 對 其派生類 的消息結構數(shù)組(它是靜態(tài)的)做搜索 并向上(基類)的結構數(shù)組做搜索并調用相應的成員函數(shù)。
?? 派生類使用
?DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(本類, 基類)
?ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
END_MESSAGE_MAP()
加入鏈表
??????? AfxWndProc (只有發(fā)向窗口才會被調用),此函數(shù) 將使用HWND 在 mfc庫的全局變量中
找到句柄映射表,轉為 CWnd 型 ,最終使用 派生類的對OnCmdMsg()的重載 來實現(xiàn) 不同的路由
???? 以上原理
?????????? 做為一個例子,將給出個示例:
?1
class?CMan?:?public?CCmdTarget
?2

{
?3
????DECLARE_DYNAMIC(CMan)
?4
?5
public:
?6
????CMan();
?7
????virtual?~CMan();
?8
?9
protected:
10
????DECLARE_MESSAGE_MAP()
11
public:
12
????afx_msg?void?OnAppAbout();
13
????virtual?BOOL?OnCmdMsg(UINT?nID,?int?nCode,?void*?pExtra,?AFX_CMDHANDLERINFO*?pHandlerInfo);
14
????int?m_id;
15
????CString?m_name;
16
};/**/////////////自定義的c++類
17
18
19
////////////////重載?onCmdMsg,(m_man為CMainFram的成員)20
BOOL?CMainFrame::OnCmdMsg(UINT?nID,?int?nCode,?void*?pExtra,?AFX_CMDHANDLERINFO*?pHandlerInfo)
21

{
22
????//?TODO:?在此添加專用代碼和/或調用基類
23
??????????if?(m_man.OnCmdMsg(nID,?nCode,?pExtra,?pHandlerInfo?))
24
??????????
{
25
??????????????return?true;
26
27
??????????}else
28
????return?CFrameWnd::OnCmdMsg(nID,?nCode,?pExtra,?pHandlerInfo);
29
}
30
/**///////////////給CMan?加個命令響應31
BEGIN_MESSAGE_MAP(CMan,?CCmdTarget)
32
????ON_COMMAND(ID_APP_ABOUT,?OnAppAbout)
33
END_MESSAGE_MAP()
34
35
36
37
//?CMan?消息處理程序
38
39
void?CMan::OnAppAbout()
40

{
41
????//?TODO:?在此添加命令處理程序代碼
42
????CString?str;
43
????str.Format("%d?",m_id);
44
????str+=m_name;
45
????AfxMessageBox(str);
46
}
47
/**////////////48
49
運行后就會發(fā)現(xiàn)?此命令將由CMan::onAppAbout()?來?
50
響應
posted on 2006-07-27 11:27
黃大仙 閱讀(2846)
評論(2) 編輯 收藏 引用 所屬分類:
c++