2013-09-12 2 views
0

У меня есть CDialog, созданный мастером по имени CDialogParent, а затем создать шаблон диалога ребенка IDD = IDD_CHILD_DLG1, в этом диалоге ребенка я положил одну кнопку IDC_BTN1 (я не создать класс обработчика для этого ребенка) ,MFC catch Контрольное сообщение ребенка от родителя без создания обработчика класса для ребенка?

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

Вкратце: вы не можете.

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

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

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