Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WM_SIZE и размер элементов 
V
    Опции темы
MoreHate
Дата 20.1.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Здравствуйте.
Не могу разобраться с ресайзингом объектов. В указанном ниже коде в местах отмеченных (*) вылетает ошибка дебаггера.

Код

void CDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);
    
    CRect rect;
*    StatusBar.GetClientRect(&rect);
    int Widths[5] = { rect.right-375, rect.right-275, rect.right-135, rect.right-25, -1 };
*    StatusBar.SetParts(5, Widths);
}


То же самое и при ресайзе контролов. Причем в OnInitDialog тот же код работает нормально.
Поискал по форуму - ничего нет.
PM MAIL   Вверх
Earnest
Дата 20.1.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Что такое "ошибка дебаггера"?



--------------------
...
PM   Вверх
MoreHate
Дата 20.1.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Debug Assertion Error. Т.е. программа скомпилировалась, запустилась, но во время работы произошла ошибка
PM MAIL   Вверх
Earnest
Дата 20.1.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Окно Assertion обычно предлагает перейти на строку, в которой возник сбой (ASSERT). Нажми Retry и посмотри, на какую строчку укажет отладчик.

Скорее всего ASSERT говорит, что твой StatusBar - Not a Window.
Кстати, следует знать, что при создании окна WM_SIZE приходит несколько раз, в том числе и до создания дочерних окон (надо полагать, StatusBar - это дочернее окно диалога).
Это значит, что перед тем как что-то делать со StatusBar, нужно проверить, создан ли он:
Код

if (::IsWindow(StatusBar))
 ...;





--------------------
...
PM   Вверх
Dreamer_0x01
Дата 20.1.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



CDlg::OnSize
Вызывается у тебя скорее всего до создания твоего StatusBar.
Поэтому и вылетает ошибка - объект еще не создан, но ты пытаешься воспользоваться его методом.
Сообщение WM_SIZE посылается диалогу одним из первых, еще до отработки таких функций, как InitDialog и др. Поэтому я либо создаю объекты в конструкторе, либо в InitDialog расставляю флаги, которые проверяю в обработчиках WM_SIZE и WMPOSCHANGING.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
MoreHate
Дата 20.1.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Спасибо большое. Все работает.
PM MAIL   Вверх
Dreamer_0x01
Дата 20.1.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Пометь как решенный.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
AlexPro
Дата 21.1.2006, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(Dreamer_0x01 @ 20.1.2006, 17:09 Найти цитируемый пост)
в InitDialog расставляю флаги, которые проверяю в обработчиках WM_SIZE и WMPOSCHANGING

Я в OnSize проверяю хеадер окна, что-то вроде if (MyWnd.m_hWnd!=NULL). Пока окно не создано - m_hWnd имеет нулевое значение.

PM MAIL   Вверх
Dreamer_0x01
Дата 21.1.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата(AlexPro @ 21.1.2006, 06:38 Найти цитируемый пост)

что-то вроде if (MyWnd.m_hWnd!=NULL)


что-то вроде, или именно так?




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
AlexPro
Дата 21.1.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(Dreamer_0x01 @ 21.1.2006, 15:32 Найти цитируемый пост)
или именно так?

Именно так. Причем, если есть вложенные дочерние окна, которые будут ресайзиться, проверять нужно и их. Скажем, у меня в программе в CView имеется CTabCtrl с двумя вкладками с диалогами. Чтобы ресайзить это хозяйство, я в CView::OnSize проверяю хеадеры дочерних окон. Диалоги, привязанные к CTabCtrl, готовы к работе только к четвертому проходу через CView::OnSize (в моем случае).
PM MAIL   Вверх
Earnest
Дата 22.1.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Все же проверять окно лучше через вызов IsWindow, а не сравнивать с 0.
Во-первых, именно это проверяется в MFC-обертках сообщений.
Во-вторых, возможна ситуация, когда HWND не 0, но и не "правильный" HWND (скажем, мусор какой-нибудь).
Это, конечно, к данному случаю вряд ли относится, но лучше привыкнуть всегда проверять IsWindow, а не != 0, чтобы не думать в каждом случае - а может ли в HWND быть мусор?



--------------------
...
PM   Вверх
AlexPro
Дата 22.1.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(Earnest @ 22.1.2006, 11:21 Найти цитируемый пост)
Все же проверять окно лучше через вызов IsWindow, а не сравнивать с 0.

Да, пожалуй, так будет правильнее.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.2098 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.