Форум: "Основная";
Текущий архив: 2003.05.01;
Скачать: [xml.tar.bz2];
ВнизInvalidate vs Refresh при обновлении свойств компонента Найти похожие ветки
← →
NA (2003-04-13 21:26) [0]Встречаются оба случая. Refresh - чаще, Invalidate - очень редко, НО как раз в очень экологически чистых ;) , красивых исходниках, вроде TBtnEdit.
Что правильнее, и каковы доводы? Кратко из хэлпа:
Invalidate используется, когда контрол должен быть перекрашен. Когда нужно перекрашивать более одного региона, Invalidate красит окно за один проход, избегая мерцания.
Нет никаких проблем при многократных вызовах Invalidate, опережающих реальное перекрашивание объекта.
Refresh перекрашивает контрол немедленно. Refresh вызывает метод Repaint. Используйте методы Refresh и Repaint равнозначно.
← →
NA (2003-04-16 09:01) [1].up.
← →
REA (2003-04-16 09:37) [2]В чем вопрос? Invalidate не посылает WM_PAINT, остальные посылают.
← →
NA (2003-04-18 00:22) [3]%/ Каким образом тогда перекрашивается контрол при вызове Invalidate?
И почему тогда именно Invalidate применен в TBtnEdit, написанном наполовину на API (кнопка в компоненте)?
← →
NA (2003-04-18 00:23) [4]%/ Каким образом тогда перекрашивается контрол при вызове Invalidate?
И почему тогда именно Invalidate применен в TBtnEdit, написанном наполовину на API (кнопка в компоненте)?
P.S. ...и к чему тогда было создавать несколько не отличающихся друг от друга методов?
← →
Юрий Зотов (2003-04-18 07:12) [5]Все довольно просто. Сначала смотрим исходники и видим такую цепочку.
В TControl:
Invalidate -> InvalidateControl -> InvalidateRect.
В TWinControl:
Invalidate -> СМ_INVALIDATE -> InvalidateRect.
Причем инвалидируется весь прямоугольник контрола (для оконных контролов - у родительского и своего окна, для графических -только у родительского).
Теперь читаем справку API:
"The InvalidateRect function adds a rectangle to the specified window"s update region. The update region represents the portion of the window"s client area that must be redrawn".
"The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect or ValidateRgn function. Windows sends a WM_PAINT message to a window whenever its update region is not empty and there are no other messages in the application queue for that window".
Итак:
1. Invalidate добавляет прямоугольник контрола в регион обновления окна (своего и/или родительского) и более ничего не делает.
2. Увидев, что регион обновления окна не пустой, Windows пошлет ему сообщение WM_PAINT сразу же, как только опустеет его очередь сообщений и в итоге окно будет перерисовано.
Таким образом, Invalidate не перерисовывает контрол, а лишь ЗАПРАШИВАЕТ у системы его перерисовку. Фактически же перерисовка окна произойдет тогда, когда у него не будет другой, более важной работы. Причем, если Invalidate был вызван несколькими графическими (или прозрачными) контролами, то перерисовка их родительского окна произойдет ОДИН раз - что позволяет избежать лишней работы и лишнего мерцания.
Посмотрев исходники далее и почитав справку по UpdateWindow, несложно убедиться, что, в отличие от Invalidate, методы Repaint, Refresh и Update приводят к НЕМЕДЛЕННОЙ перерисовке. То есть, в этом случае система не ждет, когда опустеет очередь сообщений окна, а посылает ему WM_PAINT сразу же.
Какой механизм лучше использовать - зависит от того, что в данный момент нужно сделать. Совет здесь может быть только один - если не хотите замедлить работу своей программы и увидеть на экране мерцания/моргания, то не злоупотребляйте немедленной перерисовкой, а используйте ее лишь тогда, когда она действительно нужна (то есть, когда требуется перерисовка, но программа в данном месте занята другим делом и Invalidate работает неудовлетворительно). На практике такое встречается довольно нечасто, поэтому пишите сначала Invalidate и проверяйте - если работает плохо, то лишь тогда есть смысл заменить на Refresh или Repaint (а иногда даже и на RecreateWnd, но это уже несколько из другой оперы).
See also:
DoubleBuffered.
Paint.
← →
NA (2003-04-19 01:15) [6]Огромное спасибо!
Все предельно ясно.
(p.s. "я чувствовал, я чувствовал!" :))) )
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c