0

我有一个名为CDialogParent的向导创建的 CDialog ,然后创建一个子对话框模板IDD= IDD_CHILD_DLG1,在这个子对话框中我放了一个按钮IDC_BTN1(我不为这个孩子创建类处理程序)。

BOOL CDialogParent::OnInitDialog()
{
  ....
  CDialog *pChild = new CDialog();
  pChild->Create(IDD_CHILD_DLG1, this);
  pChild->ShowWindow(SW_NORMAL);
}

通常,我需要为子级创建新的类处理程序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()

如何在不创建新的类处理程序的情况下做到这一点?感谢帮助!

4

1 回答 1

0

简而言之:你不能。

无法做到这一点的原因有两个:

  1. 控件 ID 仅在同级之间是唯一的(即共享同一父窗口的控件)。不同的对话框可以为不同的控件使用相同的 ID。
  2. 当您说子对话时,我会假设您是指拥有的对话(这些是不同的概念,但以下基本原理是相同的)。设置所有者拥有的窗口关系时,该关系基于窗口句柄 ( )。没有其他可用的 C++ 类型信息。在消息映射中调用适当的类成员需要类型和对象指针。HWND

如果您想了解在拥有的对话框中引发的事件,请在拥有的对话框的类中实现消息处理程序并将消息发布到拥有的对话框。

于 2013-09-12T14:13:07.157 回答