Как узнать, какая часть окна нуждается в перерисовке?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как узнать, какая часть окна нуждается в перерисовке?

Сообщение arthur2 » 21.06.2008 (Сб) 13:14

В событии Form_Paint перерисовываю надписи на форме.

Но так как стоит сглаживание шрифтов, если писать несколько раз по одному и тому же месту, надпись становится слегка жирнее и немного корявее.

Поэтому я хочу перерисовать только ту часть окна, которая в этом нуждается (по которой, например, протащили другое окно)

Как это узнать?
Артур
 
   

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Сообщение ndemidov » 21.06.2008 (Сб) 14:39

GetUpdateRect возвращает координаты наим. прямоугольника, требующего перерисовки.
GetUpdateRgn возвращает область окна, нуждающуюся в перерисовке, копируя её в указанный пространственный объект.
InvalidateRect \ ValidateRect переводит прямоугольник в недействительное (или наоборот) состояние (добавляет его в область, требующую перерисовки). Также и ValidateRgn \ InvalidateRgn.
Есть ещё RedrawWindow.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 21.06.2008 (Сб) 15:09

Ага, вроде о том... Но только GetUpdateRect и GetUpdateRgn, вызваные из Form_Paint, почему-то всегда выдают пустые регион и рект :(
Артур
 
   

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Сообщение ndemidov » 21.06.2008 (Сб) 16:23

Может перед перерисовкой своей графики в Form_Paint вызывать cls? Или закрашивать фоновым цветом прямоугольники, а затем на этом выводить текст.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.06.2008 (Сб) 16:30

arthur2
Так надо из WindowProc, из обработчика WM_PAINT.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 22.06.2008 (Вс) 14:40

ndemidovНе-а, тогда мерцать будет. Да и надписи - поверх картинок.

Хакер
В общем, без субклассинга никугда? Ну что-ж, придётся субклассить.

В общем, я так и подумал - получается Form_paint вызывается уже после обработки родной винпрок?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.06.2008 (Вс) 14:45

arthur2
Конечно. WindowProc его и вызывает.

Т.е. нельзя сказать что именно после. WindowProc вызывает обработчик(и) события _Paint, обработчик(и) работает(ют), после возврата из (последнего) обработчика происходит возврат в WindowProc, а оттуда в MessageLoop (родной, или инициированный DoEvents-ом).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Сообщение ndemidov » 22.06.2008 (Вс) 18:27

[quote="arthur2"]Не-а, тогда мерцать будет. Да и надписи - поверх картинок.

Сделай "свой AutoRedraw":
Пусть DC1 используется для хранения "статических прямоугольниклв" (прямоугольников, случайно рисуемых при запуске и не изменяющихся на протяжении работы программы). Затем копируй изображение с DC1 на DC2 и выводи текст на DC2. После копируй изображение с DC2 на форму в Form_Paint.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 23.06.2008 (Пн) 12:36

ndemidov
Приблизительно по такому алгоритму я и предполагал делать сначала. Хотел сохранять для каждого самописного лейбла фон под ним. Но, вроде бы, удалось обойтись без этого :D

Хакер
Странно, но GetUpdateRgn по-прежнему выдаёт пустой регион :(
Впрочем, GetUpdateRect работает, так что проблема решена :D
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 37

    TopList