先对对于mfc中的命令消息路由的机制原理作个简单的总结:
CCmdTarget 为 模板 ,提供: CCmdTarget::OnCmdMsg() 这个函数 对 其派生类 的消息结构数组(它是静态的)做搜索 并向上(基类)的结构数组做搜索并调用相应的成员函数。
派生类使用
DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(本类, 基类)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
END_MESSAGE_MAP()
加入链表
AfxWndProc (只有发向窗口才会被调用),此函数 将使用HWND 在 mfc库的全局变量中
找到句柄映射表,转为 CWnd 型 ,最终使用 派生类的对OnCmdMsg()的重载 来实现 不同的路由
以上原理
做为一个例子,将给出个示例:
1class CMan : public CCmdTarget
2{
3 DECLARE_DYNAMIC(CMan)
4
5public:
6 CMan();
7 virtual ~CMan();
8
9protected:
10 DECLARE_MESSAGE_MAP()
11public:
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的成员)20BOOL 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 加个命令响应31BEGIN_MESSAGE_MAP(CMan, CCmdTarget)
32 ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
33END_MESSAGE_MAP()
34
35
36
37// CMan 消息处理程序
38
39void 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
黄大仙 阅读(2829)
评论(2) 编辑 收藏 引用 所属分类:
c++