【问题标题】:MFC catch Control's Message of child from parent without create class handler for child?MFC从父级捕获控件的子级消息而不为子级创建类处理程序?
【发布时间】:2013-09-16 21:12:34
【问题描述】:

我有一个名为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 中声明消息映射来捕获子对话框 BUT 的控件消息 IDC_BTN1 的问题,例如:

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

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

【问题讨论】:

    标签: c++ mfc dialog cdialog message-map


    【解决方案1】:

    简而言之:你不能。

    这不可能有两个原因:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      相关资源
      最近更新 更多