![]() |
|
|
![]()
|
|
| eniac |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 2.6.2009 Репутация: нет Всего: нет |
Всем привет.
Можна ли создать шаблон MFC класса? Как правильно написать карту сообщений? |
|||
|
||||
| eniac |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 2.6.2009 Репутация: нет Всего: нет |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Забавный метод, но уже очень геморройный. Переписывать 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. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |