C++ MFC捕捉控制';没有为子级创建类处理程序的父级的子级消息?

C++ MFC捕捉控制';没有为子级创建类处理程序的父级的子级消息?,c++,mfc,dialog,cdialog,message-map,C++,Mfc,Dialog,Cdialog,Message Map,我有一个由名为CDialogParent的向导创建的CDialog,然后创建一个子对话框模板有IDD=IDD\u child\u DLG1,在这个子对话框中我放了一个按钮IDC\u BTN1(我不为此子对话框创建类处理程序) 通常,我需要为child创建新的类处理程序CDialogChild,并添加如下消息映射: BEGIN_MESSAGE_MAP(CDialogChild, CDialog) ON_BN_CLICKED(IDC_BTN1, &CDialogChild::On

我有一个由名为CDialogParent的向导创建的CDialog,然后创建一个子对话框模板有IDD=IDD\u child\u DLG1,在这个子对话框中我放了一个按钮IDC\u BTN1(我不为此子对话框创建类处理程序)

通常,我需要为child创建新的类处理程序CDialogChild,并添加如下消息映射:

BEGIN_MESSAGE_MAP(CDialogChild, CDialog)
      ON_BN_CLICKED(IDC_BTN1, &CDialogChild::OnBnClickedBtn1)
END_MESSAGE_MAP()
我想通过在CDialogParent中声明消息映射来捕获子对话框的控件消息IDC_BTN1的问题,如:

BEGIN_MESSAGE_MAP(CDialogParent, CDialog)
    ON_BN_CLICKED(IDC_BTN1, &CDialogParent::OnBnClickedBtn1)
END_MESSAGE_MAP()
如何在不创建新类处理程序的情况下执行此操作? 谢谢你的帮助

简而言之:你不能

这不可能有两个原因:

  • 控件ID仅在同级(即共享同一父窗口的控件)之间是唯一的。不同的对话框可以对不同的控件使用相同的ID
  • 当你说“子对话”时,我假设你指的是拥有的对话(这些是不同的概念,但下面的基本原理是相同的)。设置所有者拥有的窗口关系时,该关系基于窗口句柄(
    HWND
    )。没有可用的附加C++类型信息。在消息映射中调用适当的类成员需要类型指针和对象指针
  • 如果您希望了解在所属对话框中引发的事件,请在所属对话框的类中实现消息处理程序,并向所属对话框发布消息

    BEGIN_MESSAGE_MAP(CDialogParent, CDialog)
        ON_BN_CLICKED(IDC_BTN1, &CDialogParent::OnBnClickedBtn1)
    END_MESSAGE_MAP()