![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Столкнулся тут с одной особенностью применения ScrollWindow. Эта функция не хочет сдвигать изображение в область, которая только что появилась. Конечно, это не проблема, но тому, у кого есть варианты устранения этой неприятности так, чтобы не приходилось потом перерисовывать вновь появившуюся область, я буду премного благодарен.
Мое предположение основано на работе следующей программки:
Как ею пользоваться? Появляется окно, выкрашенное в оранжевый цвет. Теперь попробуйте увеличить его размеры по горизонтали. В обработчике WM_SIZE я сдвигаю изображение в окне так, чтобы его нижняя граница совпала с новой нижней границей окна. В результате в верху окна появляется белая область, но это нормально. Обратите внимание на то, что белая область появляется и внизу, чего быть не должно. Заметьте, что я применяю ValidateRect к вновь появившейся области. Это гарантирует, что по ней не пройдется реализация WM_ERASEBKGND в DefWindowProc. PS Как тут можно exe-шник прикрепить? Это сообщение отредактировал(а) 0x07L - 24.7.2006, 07:20 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Хм...
Попробуй делать ScrollWindow не прямо в WM_SIZE, а после (пошли сам себе асинхронное сообщение). И еще, чтобы быть уверенным насчет EraseBackgnd, перехвати его сам, и ничего не делай. Файл можно прикрепить в полной форме ответа, или если будешь редактировать свой пост, там тоже будет поле для файла. -------------------- ... |
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
WM_ERASEBKGND перехватил. Результаты те же.
А посылка асинхронного сообщения, пожалуй, действительно лучший способ решить эту проблему. PS Интересно, почему FillRect действует, а ScrollWindow - нет. Добавлено @ 08:30 Кстати, пробовал также ставить ValidateRect перед ScrollWindow и вызывать перед ScrollWindow функцию UpdateWindow. Не помогает. |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
|
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Не пойдет. Во-первых, GetClientRect здесь возвращает старые координаты. Во-вторых, ScrollWindow не захочет двигать изображение в пока не видимую область. Это нужно делать в обработчике WM_SIZE (что не получается) или немного позже.
|
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
||||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Я проверял. У меня не пошлО
|
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
немножко изменил цикл сообщений, а остальное сам заметишь.
|
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Все заметил. Я предвзято отнесся к коду в Вашем первом посте и не стал его просто копировать, справедливо полагая, что в таком виде, в каком он был приведен, он недееспособен, за что и поплатился
MSDN: "The WM_GETMINMAXINFO message is sent to a window when the size or position of the window is about to change". Это сообщение отредактировал(а) 0x07L - 8.8.2006, 21:19 |
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Мой код даже более недееспособен, согласен.
Спасибо, Fixin. Спасибо, Earnest. Тема закрыта. |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
У тебя прямо талант находить глюки
|
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Это не талант. Просто редкое невезение
|
|||
|
||||
![]()
|
| Правила форума "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. |