![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Описал WndProc в классе, для "регистрации" класса данная функция должна быть статической. Однако из WndProc хотелось бы вызывать другие нестатически функции класса - для это нужно передать ссылку на конкретный объект этого класса, но тогда опять возникают проблемы с регистрацией!
Кто что может посоветовать - не делать же все функции и данные статическими? --------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
никто передавать ссылку на объект в WndProc не будет, потому что вызывает её Windows, а она/оно/он про какие-то дополнительные объекты ничего не знает так что нужно каким-либо образом внутри WndProc узнать адрес объекта один раз туда можно передать свои данные - при создании окна (последний аргумент CreateWindow) один из вариантов - в CreateWindow передавать адрес "управляющего" объекта, а в обработке WM_CREATE сопоставлять окну этот адрес с помощью (к примеру) SetProp, а потом при последующих вызовах WndProc брать этот адрес и вызывать уже методы соответствующего объекта правда, в таком подходе есть проблема: сообщение WM_CREATE - не первое сообщение, которое приходит при создании окна (точно не помню, но там их около 3-х) Добавлено @ 13:02 кстати, когда-то рылся в исходниках VCL там увидел другое решение этой задачи (надеюсь, я его правильно понял) при каждом создании формы они вызывают MakeObjectInstance для метода функция интересная: она выделяет кусок памяти и пишет туда вызов метода для того объекта, для которого она создаётся (т.е. внутри функции адрес объекта - простая константа) этакая лямбда-функция -------------------- qqq |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Мне тут подсказали такую штуку как SetWindowLong и GetWindowLong, с помощью которой и можно сохранить, потом получить для данного контрола указатель на его объект!
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
...
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Это решается с помощью регистрации двух процедур окна. Первая - инициирует объект (как в VCL, через глобальную пременную) и устанавливает вторую, регулярную процедуру окна. А вторая - перенаправляет данные из статической функции в метод объекта. PS: кажись что-то подобное я уже писал, поиском пользуйтесь. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
через глобальную переменную, кстати, можно ещё проще
можно при создании окна (перед вызовом CreateWindow) сохранять адрес создаваемого объекта, а в диспетчере при приходе первого же сообщения цеплять этот адрес создаваемому окну но тут есть другой недостаток - если два окна будут одновременно создаваться в разных потоках, могут полезть глюки -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "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. |