Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > template for MFC


Автор: eniac 9.7.2009, 11:47
Всем привет.
Можна ли создать шаблон MFC класса? 
Как правильно написать карту сообщений?

Автор: eniac 9.7.2009, 12:40
короче. Проблема решена 
http://www.codeproject.com/KB/cpp/templates.aspx

Автор: Earnest 10.7.2009, 07:35
Забавный метод, но уже очень геморройный. Переписывать MFC-макросы... брр...
Я обычно делаю так (это не уверсально, но в конкретных частных случаях работает хорошо).
1) Пишем базовый класс (не CWnd), но со всей нужной функциональностью (большой) и, разумеется, не как шаблон: всю реализацию засовываем в cpp, Доступ к окну можно получить по-разному: через dynamic_cast<CWnd*>, с помощью виртуальной функции, с помощью переданнй в конструктор переменной... в зависимости от ощущения мировой гармонии на момент написания кода...
2) Пишем шаблон, уже оконного класса, аргумент шаблона - конкретный оконный базовый класс, и наследуемся от нашего выше-описанного класса:
template <class BASE> class MyCoolWnd: public BASE, public CMyCoolFunc
{
...

}
В шаблоне нельзя писать MESSAGE_MAP, но можно написать свою версию WindowProc и других виртуальных функций (обычно еще требуется OnCmdMsg), передав в них управление не-оконному базовыму классу.
Ну и еще что-нибуь в зависимости от задачи. Мне кажется, этот подход проще и нагляднее.

Еще, из той же серии (хотя немного сбоку). Часто возникают проблемы с вложенным оконным классом, если у него есть макросы (DYNCREATE или MESSAGE_MAP), причем не на определении, а на реализации: компилятор матерится по тем же причинам (непредусмотренные двоеточия и прочая). Обходится элементарно: перед реализацией достаточно написать: using CMyOuterClass::CMyInnerClass.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)