Delphi - 绘制文本,以便在重新绘制其下的图像后不会消失

时间:2011-12-18 18:44:41

标签: delphi canvas delphi-7 paint

我应该如何在画布上绘制文本,以便在重新绘制/更新/刷新后不会一次又一次地重新绘制文本时文本不会消失?就像它被画成图像而不是暂时画的那样。

4 个答案:

答案 0 :(得分:6)

如果您正在谈论,例如,TPaintBox控件或类似的东西,则没有持久画布可以绘制。系统根本就不是这样设计的,VCL控件反映了底层的Windows框架。

正常方法如下:

  1. 首先绘制到屏幕外位图。
  2. 当系统要求重新绘制时,将屏幕外位图绘制到屏幕画布上。
  3. 有多种原因可能会导致您采用这种方法。通常表现是一个因素。绘制和缓存图像可能会有所帮助。有时,绘制所需的信息可能是暂时的,并且再次缓存输出可能是一种解决方案。

答案 1 :(得分:4)

你做不到。绘画只在屏幕上显示一次图像;如果你想要它持久存在,那么你每次操作系统请求时都必须重新绘制它。

答案 2 :(得分:0)

使用TLabel(或某些衍生物)并将其放在画布上。 TLabel会在必要时重新绘制。

答案 3 :(得分:0)

你只需要在系统说你应该画画时画画。关于这个主题,有两件事需要了解......

<强>缓存

您还可以实现自己的缓存系统。使用多个图层时,这可能会有点棘手。您可能有一个特定的区域,预计会以很高的速度变化。然后大概不会改变背景,除非它已经调整大小,或者颜色已经改变等等。例如针在一些照片上移动。只需在背景中保留两个不同的图像对象并将它们组合起来,确保至少顶部的图像对象是透明的。

您还可以使用Invalidate命令告知Windows何时控件的缓存无效(下一个主题...)。这将告诉Windows您控件中的某些内容已更改为您需要重绘所有内容的位置。然后,Windows将通过调用Paint过程来决定何时可以实际告知您的控件再次被绘制。

系统涂料

正如大卫在他的回答中提到的,如果你正在使用控件,那么你应该在系统说你应该重新绘制你的背景。这是通过从PaintTGraphicControl(以及其他一些)继承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;