Вы должны рисовать только тогда, когда система говорит, что вы должны. С этим предметом нужно знать две вещи ...
Cache
Вы также можете реализовать свою собственную систему кеширования. Это может быть немного сложно при работе со многими слоями. У вас может быть определенная область, которая, как ожидается, будет меняться с высокой скоростью. И тогда, по-видимому, фон не будет изменен, если он не был изменен, или цвет не изменился и т. Д. Например, игла движется поверх какой-либо фотографии. Просто поддерживайте два разных объекта изображения на заднем плане и объединяйте их, следя за тем, чтобы хотя бы один из них был прозрачным.
Вы также можете сообщить Windows, когда кэш вашего элемента управления признан недействительным (следующая тема ...), с помощью команды Invalidate
. Это скажет Windows, что что-то в вашем управлении изменилось до такой степени, что вам нужно перерисовать все После этого Windows решит, когда она будет готова фактически перерисовать ваш элемент управления, вызвав Paint
процедуру.
Системная краска
Как Дэвид упоминает в своем ответе, если вы работаете с элементом управления, то вам следует перекрасить свой фон, когда система скажет, что вам следует. Это достигается путем наследования процедуры Paint
от TGraphicControl
или TCustomControl
(и некоторых других). Эта процедура вызывается каждый раз, когда система говорит, что вам нужно обновить содержимое вашего элемента управления. Это способ, которым система сообщает вам, когда ваш кэш недействителен.
procedure Paint; override;
...
procedure TMyCustomControl.Paint;
begin
DoSomeDrawingOnCanvas;
end;
С другой стороны, вы можете указать Windows, когда хотите, чтобы она тоже вызывала эту Paint
процедуру ...
procedure TMyCustomControl.SetWidth(const Value: Integer);
begin
if Value <> FWidth then begin //Just a common check for performance reasons
FWidth:= Value;
Invalidate; //This tells Windows that you want to repaint your control
end;
end;