Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > WM_SIZE, Invalidate & CompatibleDC


Автор: Nastya 22.11.2006, 13:31
Вот в чем вопрос. Ко мне пришел WM_SIZE и так складываются отбстоятельство что мне надо перерисовать все окно со всеми контролами на них.
Как сделать так:
1. создаею временное DC
2. Все перерисовываю в него (?) т.е. Invalidate(true) - Как-то направить в мое HDC
3. Блитаю

В общем проблема в основном во 2-м пункте

Автор: Earnest 22.11.2006, 17:36
Если окно твое, и ты сама его рисуешь, то в чем проблема? Выдели функцию рисования в заданный контекст из OnPaint, и пользуйся.
Но вообще-то как-то плохо звучит, перерисовка на OnSize. Чтобы тебе не сделать Invalidate? И пусть перерисовывается, когда виндовсу удобно... Или вообще в стиль класса добавить CS_HREDRAW | CS_VREDRAW, тогда само будет...

Автор: Nastya 23.11.2006, 09:31
Я наверное не понятно объяснила. 
Вот сомтри. у меня идет WM_SIZE - при этом меняются размеры положения/кучи контролов, многие из них сами по себе тяжеловаты в отрисовки. И получается что у меняна WM_SIZE - именно потому что куче контролов приходит WM_PAINT, и идет множетсво блитов на один DC.
Как бы исхитрится так: чтобы сказать что вот сейчас все блиты идут в совместимое устройство, а потом я их проресую ?

Автор: Earnest 23.11.2006, 11:06
Все равно не очень поняла, в чем проблема.
Но если в том, что resize, скажем, диалога приводит к каскадному перемещению множества контролов, что выражается в подергивании, то попробуй вместо MoveWindow\SetWindowPos отложенное перемещение: BeginDeferWindowPos\DeferWindowPos\EndDeferWindowPos. Это гарантирует, что все будут перерисовано один раз, на завершение. 

Автор: Nastya 23.11.2006, 11:53
Цитата

BeginDeferWindowPos\DeferWindowPos\EndDeferWindowPos

Я даже раньше про такие не слышала - класс, стало немного лучше smile))) Тебе как всегда от меня респект smile 

Еще вопрос в дагонку. когда я максимизирую окно, оно 
1. Мувет его в точку 0;0
2. Перерисовывает со старым размером
3. Резайзит 
4. перерисовывает сновым.
ОТ таго в этом месте все торомзит. smile 
При этом твои три волшебные функции тут не помогают smile
Есть какая еще идея?

Автор: Earnest 23.11.2006, 15:07
Боюсь, нет идеи...  smile я и не знала, что максимайз так по свински себя ведет...

Добавлено @ 15:08 
А можь его сначала скрыть, а потом восстановить максимизированным?

Автор: Nastya 23.11.2006, 17:00
Цитата

Боюсь, нет идеи...   я и не знала, что максимайз так по свински себя ведет...
Добавлено @ 12:08 А можь его сначала скрыть, а потом восстановить максимизированным?

Вся проблема в том, что в XP c разными вариантами настроек системы(лучший вид/лучшее быстродействие) система ведет себя по разному, и шлет разную поледовательность сообщени smile 
Но spy++ мне показал именно такую последовательность сообщений smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)