MFC перехватывает управляющее сообщение дочернего элемента от родителя без создания обработчика класса для дочернего элемента?

У меня есть CDialog, созданный мастером по имени CDialogParent, затем создать дочерний шаблон диалога 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()

Проблема в том, что я хочу перехватить сообщение элемента управления IDC_BTN1 дочернего диалога НО объявить карту сообщений в CDialogParent как:

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

Как сделать это без создания нового обработчика класса?
Спасибо за помощь!

0

Решение

Короче говоря, вы не можете.

Есть две причины, почему это невозможно:

  1. Идентификаторы элементов управления уникальны только среди братьев и сестер (то есть элементов управления, использующих одно и то же родительское окно). Различные диалоги могут использовать один и тот же идентификатор для разных элементов управления.
  2. Я предполагаю, что вы имеете в виду Собственный диалог когда ты сказал Дочерний диалог (это разные понятия, но следующее обоснование одно и то же). При настройке отношения окна, принадлежащего владельцу, это отношение основывается на дескрипторах окна (HWND). Нет дополнительной информации о типе C ++. И тип, и указатель на объект требуются для вызова соответствующего члена класса в карте сообщений.

Если вы хотите получать информацию о событии, вызванном в собственном диалоге, внедрите обработчик сообщений в классе собственного диалога и опубликуйте сообщение в собственном диалоге.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]