随笔 - 25  文章 - 29  trackbacks - 0
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(4)

随笔分类(22)

随笔档案(25)

文章分类(2)

文章档案(2)

相册

最新随笔

搜索

  •  

积分与排名

  • 积分 - 55692
  • 排名 - 402

最新评论

阅读排行榜

评论排行榜

                        先对对于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++

FeedBack:
# re: MFC 中 命令消息传递 (原创) 2006-07-30 12:46 saga.constantine
支持原创!  回复  更多评论
  
# re: MFC 中 命令消息传递 (原创) 2007-03-30 09:28 雪の语
我说一句,如果消息宏是自己定义的,一定要放在ON_COMMAND(ID_APP_ABOUT, OnAppAbout)所在的文件里。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理