先对对于mfc中的命令消息路由的机制原理作个简单的总结:
CCmdTarget 为 模板 ,提供: CCmdTarget::OnCmdMsg() 这个函数 对 其派生类 的消息结构数组(它是静态的)做搜索 并向上(基类)的结构数组做搜索并调用相应的成员函数。
派生类使用
DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(本类, 基类)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
END_MESSAGE_MAP()
加入链表
AfxWndProc (只有发向窗口才会被调用),此函数 将使用HWND 在 mfc库的全局变量中
找到句柄映射表,转为 CWnd 型 ,最终使用 派生类的对OnCmdMsg()的重载 来实现 不同的路由
以上原理
做为一个例子,将给出个示例:
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
运行后就会发现 此命令将由CMan::onAppAbout() 来
50
响应
posted on 2006-07-27 11:27
黄大仙 阅读(2837)
评论(2) 编辑 收藏 引用 所属分类:
c++