![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Royan |
|
||||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Такой вопрос:
У меня есть класс, вот его конструктор:
При создании окна один из его методов становиться продедурой обработки сообщений окна, а именно:
Понятное дело CMyWin::MainWndProc является статическим членом этого класса, и мне приходится выдирать экземпляр класса с помощью GetWindowLong, но вот беда я заполняю карту сообщений еще в конструкторе и точно знаю количество (длину) карты, но когда я получаю экземпляр моего класса через GetWindowLong, длина карты равна нулю! Я уже кучу вариантов перепробовал для второго параметра GetWindowLong но к сожалению все безрезультатно, может кто-нибудь в курсе как возвратить экземпляр класса? Может для этого нужно как-то хитро воспользоваться SetWindowLong? -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
||||
|
|||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Что означает последний параметр функции DoMainCreate ? Нужно после создания окна вызвать SetWindowLong(hWnd, GWL_USERDATA, (LONG)this), а в MainWndProc проверять GWL_USERDATA с пом. GetWindowLong. Начальное значение этой константы - ноль, поэтому нужно подумать, не придут ли в оконную процедуру какие-то сообщения до вызова SetWindowLong
-------------------- ![]() |
|||
|
||||
| Royan |
|
||||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Последний параметр в DoMainCreate это lParam, из него я все-таки научился вытаскивать экземпляр класса вот как я это делаю:
где архитектура CMyWin выглядит следующим образом:
InitWndProc нужна только для того, чтобы сохранить адрес моего класса создавшего текущее окно, и переприсвоить адрес адрес процедуры обработки сообщений. MainWndProc должна обрабатывать сообщения. Вроде бы в таком раскладе все должно работать но по какой-то адской причине после отрабатывания OnMyPaint, карта обнуляется! То есть OnMyCreate, вызывается и отрабатывает без каких либо упреков а здесь такая вот беда. Я пробовал сделать карту константой, но тогда как ее проинициализировать? Это сообщение отредактировал(а) Royan - 30.3.2004, 13:30 -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
||||
|
|||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Это можно объяснить только тем, что где-то повторно вызывается InitWndProc с нулём в lParam, и обнуляется не карта, а LONG-константа, ассоциированная с окном. ИМХО, стоит поставить брякпоинт на OnMyPaint, и когда дебаггер остановится - вставить брякпоинт на InitWndProc... З.Ы. только что подумал, а может деструктор CMyWin вызывается где-то, где не надо ? Тогда понятно, почему карта обнуляется. -------------------- ![]() |
|||
|
||||
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Нет не помогло. Поставил brakepoint на строку
Тут на лицо изменения только карты... а ее вобще возможно сделать константой? -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
1) исходный код OnMyPaint - в студию!
2) насчёт непредвиденного вызова деструктора - попробуй поставить на него брякпоинт -------------------- ![]() |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Извиняюсь, что влез не по теме, но хочу заметить, что lpCreateParams структуры CREATESTRUCT для MDI окон должен хранить указатель на структуру MDICREATESTRUCT. Поэтому такой способ передачи указателя на объект в оконную функцию не подходит. Может, имеет смысл всегда передавать для всех окон в lpCreateParams MDICREATESTRUCT, а сам указатель на объект записывать в член lParam этой структуры?
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
OnMyPaint выглядит так:
Ничего преступного, повоторюсь, что после return 1; карта еще существует Я могу в принципе весь проект на мыло послать ;) 2 srd, как-то хитро получается -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Пошли на mr_duda|@|tut.by, интересно посмотреть, где там баг может вылезти... -------------------- ![]() |
|||
|
||||
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Благодаря неоценимым стараниям mr.DUDA были найдены причины сего глюка. Оказалась что Объект уничтожается после блока try, в функции WinMain, вследствии чего следует создавать таковой объект динамически. Вот к чему свелось решение (остальной код оказался не подвержен изменениям):
-------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |