MFC 中 命令消息传递 (原创)

MFC 中 命令消息传递 (原创)
                        先对对于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
 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的成员)

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 响应

你可能感兴趣的:(MFC 中 命令消息传递 (原创))