MFC> Соединение диалога с классом диалога - PullRequest
8 голосов
/ 08 декабря 2008

Я определил новый диалог и его элементы управления в уже существующем файле ресурсов. Я также создал новый файл, который будет обрабатывать события, генерируемые из этого диалога. Но я не уверен, как соединить эти два.

Является ли утверждение enum { IDD=IDD_NEW_DIALOG }; всем, что требуется для соединения двух? Или мы должны добавить какое-то другое утверждение?

Ответы [ 3 ]

14 голосов
/ 08 декабря 2008

Способ, которым это обычно делается в MFC, состоит в том, чтобы определить шаблон диалога в редакторе ресурсов (как вы сделали), затем в C ++ извлечь класс из CDialog и связать его с шаблоном диалога (который звучит так, как вы). сделали - не совсем понятно).

То, что на самом деле связывает эти два, - это конструктор вашего кода CDialog. Если вы посмотрите на связанный с диалогом код, автоматически сгенерированный мастером класса MFC, вы увидите в реализации конструктора что-то вроде этого:

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyDlg::IDD, pParent)

где CMyDlg :: IDD определяется как перечисление со значением идентификатора вашего нового диалогового шаблона. Это то, что делает все это, а не объявление перечисления. Вы можете изменить его на

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) : CDialog(IDD_NEW_DIALOG, pParent)

и все равно будет работать (при условии, что IDD_NEW_DIALOG - это идентификатор шаблона вашего диалога в ресурсах), поскольку все, что происходит, - это то, что идентификатор диалога передается в конструктор.

В общем, всегда стоит помнить, что, несмотря на первоначальные появления, MFC не связывается с Windows через бит магии компилятора - все это делается с C ++ и несколькими макросами.

РЕДАКТИРОВАТЬ: DIALOGEX и DIALOG объявляют слегка различающиеся форматы ресурсов диалога, которые понимает Windows: первый новее, чем второй. Однако оба они существовали, по крайней мере, начиная с Windows 95, так что это не очень существенное различие.

1 голос
/ 08 декабря 2008

Это все, что нужно, когда вы создаете диалог через класс диалога (DoModal() или Create для немодального диалога), что является нормальным способом.

Вам, конечно, нужно наследовать от CDialog и добавить карту сообщений для маршрутизации сообщений в функции вашего обработчика ewvent.

0 голосов
/ 08 декабря 2008

Используйте мастер классов, чтобы создать класс для вновь созданного диалога. Ctrl + W - это сочетание клавиш в представлении ресурсов пользовательского интерфейса.

...