![]() |
|
|
![]()
|
|
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Всё таки я ощутил нехватку знаний в рисовании окна. Давайте сделаем такой топик чтоб не стыдно было его закрепить всерху. Как мне кажется рисовать на обработчике события WM_PAINT вполне логично. А вот обновлять всё окно постоянно не логично, логичней оновить только тот участок в котором произошли изменения.
Для этого существует ряд функций:
Invalidate Делает всю область окна инвалидной и всё окно будет перерисованопри следующем сообщении WM_PAINT. В ходной параметр bErase отвечает за то что будет присланно сообщение WM_ERASEBKGND и будет окно закрашено своим цветом (это зависит от обработчика на событии WM_ERASEBKGND). InvalidateRect и InvalidateRgn Делает тоже что и Invalidate только инвалидейти не всё окно а только определённый прямоугольник или регион. ValidateRect и ValidateRgn Валидейтит прямоугольник или регион на окне, я так понял отменяет операцию Invalidate. UpdateWindow Посылает окну сообщение WM_PAINT. RedrawWindow Может многое, в том числе по разному перерисовать окно включая его не клиентскую часть. Это почти всё что я знаю про обновление окон. И всётаки не незнаю какие функции как себя ведут во время работы программы. RedrawWindow - вроде не прекращается до те пор пока окно не перерисуется. InvalidateRect и InvalidateRgn - просто тупо инвалидейт и программа продолжает работать. UpdateWindow - не прекратит работу пока окно не будет отрисовано. Но я во всём этом я не совсем уверен уверен и хотелось бы услышать другие мнения. В частности я вообще понять такой расклад. К примеру на нажатии левой кнопки мыши я инвалидейтю окно и больше ничего, а окно всётаки перерисовывается, в какой момент почему и ктопослал обработчик для меня это тайна. Люди раскажите всё что знаете о тонкастях отрисовки. Это мой самый длинный вопрос на этом форуме. -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: нет Всего: 95 |
Вот что написано в MSDN по InvalidateRect:
Т.е. если ты сделал части окна инвалидейт и дальше ничего не делаешь - система автоматом посылает WM_PAINT твоему окну из-за того, что его невалидный регион ненулевой... Это сообщение отредактировал(а) ama_kid - 3.5.2007, 15:59 -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 10 Всего: 18 |
Насколько я знаю (опять же, не уверен) Invalidate(Rect/Rgn) помечает область окна невалидной и посылает ему в очередь сообщений WM_PAINT. Чтобы немедленно перерисовать эту область необходимо вызвать еще UpdateWindow()
Это сообщение отредактировал(а) Greeen - 3.5.2007, 15:58 -------------------- Подпись больше не нужна |
|||
|
||||
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
А UpdateWindow() не выполнится пока окно не перерисуется???
-------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Так UpdateWindow() тоже посылает сообщение перерисовки!!! В чём разница? Добавлено через 44 секунды А если не вызвать UpdateWindow(), тогда когда окно перерисуется? -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 10 Всего: 18 |
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty.
Похоже что если область окна не отмечена как невалидная, то не перерисуется. Добавлено через 3 минуты и 55 секунд Перерисуется, но только когда в очереди не останется больше других сообщений. Добавлено через 5 минут и 16 секунд Вот еще что нашел по UpdateWindow: If there is any invalid part of the client area, UpdateWindow sends the WM_PAINT message for the specified window directly to the window procedure. -------------------- Подпись больше не нужна |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: нет Всего: 95 |
Разница в том, что Invalidate(Rect\Rgn) не посылает WM_PAINT окну - это делает сама система, когда очередь сообщений окна очищается...
Лично я воспринимаю Invalidate(...) - как "подготовку материала для заказа" процесса перерисовки, а UpdateWindow - собственно как процесс "выполнения заказа перерисовки" окна, причем немедленное и безусловное выполнение... Если не вызывать UpdateWindow - система "выполнит заказ" автоматически, но только когда сочтет это удобным (когда очередь сообщений очистится) -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 10 Всего: 18 |
ama_kid, полностью согласен
-------------------- Подпись больше не нужна |
|||
|
||||
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
ama_kid, понял философию, спс.
А где ты это нашол? -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 10 Всего: 18 |
-------------------- Подпись больше не нужна |
|||
|
||||
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Greeen, спасибки...
А что особенного в RedrawWindow? В смысле когда надо ей пользоватся а когда инвалидейтить? -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 10 Всего: 18 |
А это по желанию. И по потребностям, т.к. у RedrawWindow гораздо больше возможностей. Вот подробности: RedrawWindow
-------------------- Подпись больше не нужна |
|||
|
||||
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
А есть ли ещё какие-нибудь функции для оновления окон?
-------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |