| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. |