先对对于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![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
3
DECLARE_DYNAMIC(CMan)
4![](/Images/OutliningIndicators/InBlock.gif)
5
public:
6
CMan();
7
virtual ~CMan();
8![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
};/**/////////////自定义的c++类
17![](/Images/OutliningIndicators/InBlock.gif)
18![](/Images/OutliningIndicators/InBlock.gif)
19
////////////////重载 onCmdMsg,(m_man为CMainFram的成员)20
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
21![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
22
// TODO: 在此添加专用代码和/或调用基类
23
if (m_man.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo ))
24![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
25
return true;
26![](/Images/OutliningIndicators/InBlock.gif)
27
}else
28
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
29
}
30![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**///////////////给CMan 加个命令响应31
BEGIN_MESSAGE_MAP(CMan, CCmdTarget)
32
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
33
END_MESSAGE_MAP()
34![](/Images/OutliningIndicators/None.gif)
35![](/Images/OutliningIndicators/None.gif)
36![](/Images/OutliningIndicators/None.gif)
37
// CMan 消息处理程序
38![](/Images/OutliningIndicators/None.gif)
39
void CMan::OnAppAbout()
40![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
41
// TODO: 在此添加命令处理程序代码
42
CString str;
43
str.Format("%d ",m_id);
44
str+=m_name;
45
AfxMessageBox(str);
46
}
47![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**////////////48![](/Images/OutliningIndicators/None.gif)
49
运行后就会发现 此命令将由CMan::onAppAbout() 来
50
响应
posted on 2006-07-27 11:27
黄大仙 阅读(2817)
评论(2) 编辑 收藏 引用 所属分类:
c++