Delphi - рисует текст, чтобы он не исчезал после перерисовки изображения под ним - PullRequest
2 голосов
/ 18 декабря 2011

Как мне нарисовать текст на холсте, чтобы текст не исчезал после перекраски / обновления / обновления, не перекрашивая его снова и снова? Как будто оно было нарисовано как изображение и временно не нарисовано.

Ответы [ 4 ]

6 голосов
/ 18 декабря 2011

Если вы говорите, например, о TPaintBox элементе управления или о чем-то подобном, то нет постоянного холста для рисования.Система просто не спроектирована таким образом, и элементы управления VCL отражают базовую платформу Windows.

Обычный подход заключается в следующем:

  1. Сначала рисовать в закадровом точечном рисунке.
  2. Когда система запрашивает перекраску, нарисуйте закадровое изображение на холсте экрана.

Существует множество причин, которые могут привести вас к такому подходу.Часто производительность является фактором.Это может быть дорого для рисования и кэширования изображения может помочь.Иногда информация, необходимая для рисования, может быть временной, и снова кэширование выходных данных может быть решением.

4 голосов
/ 18 декабря 2011

Вы не можете. Картина только показывает изображение на экране один раз; если вы хотите, чтобы оно сохранялось, вы должны перерисовывать его каждый раз, когда ОС запрашивает его.

0 голосов
/ 20 декабря 2011

Вы должны рисовать только тогда, когда система говорит, что вы должны. С этим предметом нужно знать две вещи ...

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;
0 голосов
/ 19 декабря 2011

Используйте TLabel (или некоторую производную) и поместите его на холст.TLabel будет перерисовывать себя всякий раз, когда это необходимо.

...