![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Ant |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 3.9.2006 Репутация: нет Всего: нет |
Собственно есть код заполнения структуры класса окна:
Что делать, если функция WinProc является членом класса Х? Как указатель на нее привести в необходимую форму? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
||||
|
||||
| Ant |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 3.9.2006 Репутация: нет Всего: нет |
Все перерыл. Нигде не нашел однозначного ответа
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
||||
|
||||
| Ant |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 3.9.2006 Репутация: нет Всего: нет |
Вобщем, как я вышел из ситуации. Покурив ссылку Daevaornа (спасибо вам огромное за подсказку) решил сделать две функции, одна статическая (WndProc), в нее, при помощи CreateWindowExA передавался указатель на объект. А из нее и вызывается обычный метод класса обработки сообщений. Вообще, тема закрыта, но если у кого есть идеи или конструктивная критика готов выслушать
Это сообщение отредактировал(а) Ant - 6.8.2008, 10:08 |
|||
|
||||
| vaddsm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
А это как это так? lParam служебный параметр процедуры оконных сообщений, содержит данные в зависимости от типа msg. Откуда уверенность в том, что он всегда будет хранить указатель на твой объект. При сабклассе окна на лету обычно подобный указатель запихивают в GWL_USERDATA.
Можно пожалуйста, поподробнее описать как ты указатель на экземпляр CGLWindow передаешь. |
|||
|
||||
| Supersedes |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
да, я считаю что в этом месте можно сделать лучше... только не совсем понимаю чего ты хочешь добиться.. |
|||
|
||||
| Ant |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 3.9.2006 Репутация: нет Всего: нет |
Пожалуйста. Вот конструктор класса CGLWindow:
Согласно "Саймон Р. Windows 2000 API" Описание функции WindowsCreateEx:
собственно, нас интересует только последний параметр. И вот что говорит г-н Саймон: "lpvParam: LPVOID указатель на данные, которые должны быть переданы в качестве параметра lParam сообщения WM_CREATE." Вот немного пофиксеная функция WndProc:
Указатель на объект win сделал глобальным. Вчера обнаружил эту неточность и пофиксил. Хотя, как не странно, работало все и тогда. Добавлено @ 07:27 Supersedes, Я хочу, чтобы функция обработки сообщений была членом класса CGLWindow. Это пока единственный способ, который я смог обнаружить. Проблема в том, что указатель на не статический член класса не передать в структуру класса окна, во всяком случае я не смог. Это сообщение отредактировал(а) Ant - 7.8.2008, 07:41 |
||||||
|
|||||||
| vaddsm |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Ага, и все же я думаю разница между этим:
и этим:
весьма серьезная. Про то с каким грохотом и почему будет вылетать программа в первом случае я писать не буду ибо ты и сам уже разобрался введя проверку if (msg == WM_CREATE) и сделав win глобальной. Однако у такого приема сабклассирования есть один и очень серьезный недостаток. Если ты создашь еще один экземпляр подобного класса, то во время вызова CreateWindowEx глобальная переменная win примет значения адреса вновь созданного экземпляра класса, при этом прочие окна, созданные до, будут работать уже с ним, а не адресом экземпляра их породившим. Иными словами здесь надо использовать другой механизм, однозначно привязывающий к окну адрес экземпляра класса его породившего. |
||||
|
|||||
![]()
|
| Правила форума "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. |