![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: 1 Всего: 1 |
Решил реализовать класс диалог ,чтобы на его основе создавать другие диалоги:
Но в static методе класса нельзя вызывать не static методы, тем более virtual. Подскажите как это можно реализовать. |
|||
|
||||
| zhgutov |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 14.12.2004 Репутация: 1 Всего: 2 |
Можно, например, хранить множество пар (дескриптор окна; объект*), а DialogProc будет осуществлять вызов соответствующей виртуальной функции. Хотя это несколько криво, но работать будет. Так или иначе, вряд ли в программе одновременно будет открыто много диалоговых окон, поэтому будет быстро. А еще надо придумать механизм для добавления непредусмотренных обработчиков сообщений. МФЦ для этого использует т.н. «карты сообщений», но это не очень удобно (имхо). В свою очередь, реализация всех возможных обработчиков слишком накладна.
Еще можно наследовать класс от класса, добавляя свою специфическую функцию-обработчик, и вызывая для остальных сообщений предусмотренную базовым классом. Но это тоже криво. Если чего еще придумаю — напишу... Это сообщение отредактировал(а) zhgutov - 27.4.2005, 01:26 --------------------
Приполз. Увидел. Укусил. |
|||
|
||||
| maxim1000 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
для этого нужно действительно построить соответствие "окно-объект" только можно не заводить массив пар у каждого окна есть дополнительная информация (4 байта) она передается с сообщением WM_CREATE и потом может быть прочитана с помощью "не помню какой функции" правда, я не уверен, что в случае с диалогами эта информация может быть все так же свободно использована есть еще один механизм - свойства окна: функции GetProp/SetProp с помощью них у каждого окна поддерживается массив пар (строка,указатель) можно при обработке первого сообщения писать SetProp("OBJECT",PointerToObject),а при обработке остальных PointerToObject=GetProp("OBJECT"); ну и потом, соответственно, PointerToObject->ProcessMessage... только есть еще одна проблема с наследованием: предположим, унаследовали мы от такого диалога свой класс пишем свой специализированный конструктор, который, конечно же, должен вызвать конструктор предка и тут появляется беда: конструктор предка вызывает функцию DialogBoxParam эта функция создает окно диалога и посылает ему сообщение WM_CREATE и ЖДЕТ, пока оно обработается что здесь плохого: на момент создания окна объект не полностью создан создан только объект-предок, и в виртуальной таблице находится адрес старой виртуальной функции (соответствующей предку), а значит, чтобы мы ни переопределяли в обработчике сообщений, для WM_CREATE все равно вызовется старая версия (что довольно-таки печально, т.к. немало специфическихдействий производится именно при создании)... Добавлено @ 02:02
а кто его заполнять будет ;) дело в том, что функция DialogBoxParam не вернет дескриптор окна, пока не обработается WM_CREATE, а значит, будет непонятно, какой объект должен его обрабатывать если же заполнять его в WM_CREATE, то все равно надо передавать адрес объекта как-то с помощью DialogBoxParam (например, в последнем аргументе)
а почему криво? вполне нормальный подход (ИМХО для API-шных приложений в MSDN тоже рекомендуется в обработчике обрабатывать те сообщения, которые интересны, а потом вызывать DefWindowProc да и вообще это - способ наследования классов (subclassing) окон в WinAPI... -------------------- qqq |
||||||
|
|||||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
А в MFC лень глянуть, а ведь там это нормально реализованно
|
|||
|
||||
| zhgutov |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 14.12.2004 Репутация: 1 Всего: 2 |
Заполнять при обработке WM_INITDIALOG. З.Ы. Согласен, можно обойтись без «мапы».
Без применения какой-либо элегантной методы — криво, так как все-равно придется писать функцию обработчик.
Создание окна лучше выполнять не в конструкторе, а в чем-нить типа virtual create () — тогда объект будет правильно сконструирован. Это сообщение отредактировал(а) zhgutov - 27.4.2005, 07:34 --------------------
Приполз. Увидел. Укусил. |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |