Как Visual Studio связывает классы диалогов MFC с ресурсами диалогов? - PullRequest
6 голосов
/ 25 января 2010

Мне было интересно, как Visual Studio связывает MFC CDialog производные классы с соответствующими диалоговыми ресурсами. Меня не интересует, как устанавливается соединение во время выполнения (как было сказано здесь ), а скорее во время разработки.

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

Я искал в каталоге проекта строку IDD_SOMEDIALOG, но нашел ее только в SomeDialog.h, resource.h и Project.rc в ожидаемых местах, поэтому я думаю, что это как-то выводит соединение из этих файлов, скорее всего перечисление в SomeDialog.h:

// in class CSomeDialog:
    enum { IDD = IDD_SOMEDIALOG };

Я спрашиваю это в основном из любопытства.

Ответы [ 2 ]

4 голосов
/ 25 января 2010

Зависит от того, какая версия dev studio.

В VS6 все это хранилось в CLW (файл мастера классов).

В более новых версиях dev studio он больше не использует CLW, и я не знаю точно, как он это знает, но я подозреваю, что это живой анализ вместо использования кэшированного CLW.

Что касается нескольких производных диалогов, использующих один и тот же ресурс, это можно сделать вручную. Вы можете продублировать созданные файлы классов, переименовать их, удалить перечисление из заголовка и отредактировать использование перечисления IDD в исходном файле для фактического идентификатора ресурса диалога (IDD_SOMEDIALOG).

AFAIK Dev Studio будет «радостно» обрабатывать только один класс за один раз. По моему опыту, попытка повторного использования диалогового ресурса, подобного этому, просто привела к небольшому сражению с MFC и Dev Studio, поскольку они не были предназначены для этого.

2 голосов
/ 26 января 2010

Добавить к ответу Радди:

Я заметил, что некоторые из моих классов диалогов, в которых я заменил enum { IDD } на static const int IDD, больше не были связаны с его ресурсом диалога. Возврат к перечислению повторно связал их. Таким образом, кажется, что Visual Studio анализирует исходный код, чтобы определить отношения.

Что касается совместного использования ресурсов, было бы неоднозначно, какой класс должен получать код обработчика событий. Совместное использование классов представляется невозможным, поскольку оно основано на IDD, который не может быть назначен одновременно IDD_SOMETHING и IDD_SOMETHING_ELSE.

...