![]() |
|
|
![]()
|
|
| MoreHate |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 22.3.2005 Репутация: нет Всего: нет |
Здравствуйте.
Не могу разобраться с ресайзингом объектов. В указанном ниже коде в местах отмеченных (*) вылетает ошибка дебаггера.
То же самое и при ресайзе контролов. Причем в OnInitDialog тот же код работает нормально. Поискал по форуму - ничего нет. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Что такое "ошибка дебаггера"?
-------------------- ... |
|||
|
||||
| MoreHate |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 22.3.2005 Репутация: нет Всего: нет |
Debug Assertion Error. Т.е. программа скомпилировалась, запустилась, но во время работы произошла ошибка
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Окно Assertion обычно предлагает перейти на строку, в которой возник сбой (ASSERT). Нажми Retry и посмотри, на какую строчку укажет отладчик.
Скорее всего ASSERT говорит, что твой StatusBar - Not a Window. Кстати, следует знать, что при создании окна WM_SIZE приходит несколько раз, в том числе и до создания дочерних окон (надо полагать, StatusBar - это дочернее окно диалога). Это значит, что перед тем как что-то делать со StatusBar, нужно проверить, создан ли он:
-------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
CDlg::OnSize
Вызывается у тебя скорее всего до создания твоего StatusBar. Поэтому и вылетает ошибка - объект еще не создан, но ты пытаешься воспользоваться его методом. Сообщение WM_SIZE посылается диалогу одним из первых, еще до отработки таких функций, как InitDialog и др. Поэтому я либо создаю объекты в конструкторе, либо в InitDialog расставляю флаги, которые проверяю в обработчиках WM_SIZE и WMPOSCHANGING. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| MoreHate |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 22.3.2005 Репутация: нет Всего: нет |
Спасибо большое. Все работает.
|
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Пометь как решенный.
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
||||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
что-то вроде, или именно так? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Именно так. Причем, если есть вложенные дочерние окна, которые будут ресайзиться, проверять нужно и их. Скажем, у меня в программе в CView имеется CTabCtrl с двумя вкладками с диалогами. Чтобы ресайзить это хозяйство, я в CView::OnSize проверяю хеадеры дочерних окон. Диалоги, привязанные к CTabCtrl, готовы к работе только к четвертому проходу через CView::OnSize (в моем случае). |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Все же проверять окно лучше через вызов IsWindow, а не сравнивать с 0.
Во-первых, именно это проверяется в MFC-обертках сообщений. Во-вторых, возможна ситуация, когда HWND не 0, но и не "правильный" HWND (скажем, мусор какой-нибудь). Это, конечно, к данному случаю вряд ли относится, но лучше привыкнуть всегда проверять IsWindow, а не != 0, чтобы не думать в каждом случае - а может ли в HWND быть мусор? -------------------- ... |
|||
|
||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |