我应该如何在画布上绘制文本,以便在重新绘制/更新/刷新后不会一次又一次地重新绘制文本时文本不会消失?就像它被画成图像而不是暂时画的那样。
答案 0 :(得分:6)
如果您正在谈论,例如,TPaintBox
控件或类似的东西,则没有持久画布可以绘制。系统根本就不是这样设计的,VCL控件反映了底层的Windows框架。
正常方法如下:
有多种原因可能会导致您采用这种方法。通常表现是一个因素。绘制和缓存图像可能会有所帮助。有时,绘制所需的信息可能是暂时的,并且再次缓存输出可能是一种解决方案。
答案 1 :(得分:4)
你做不到。绘画只在屏幕上显示一次图像;如果你想要它持久存在,那么你每次操作系统请求时都必须重新绘制它。
答案 2 :(得分:0)
使用TLabel(或某些衍生物)并将其放在画布上。 TLabel会在必要时重新绘制。
答案 3 :(得分:0)
你只需要在系统说你应该画画时画画。关于这个主题,有两件事需要了解......
<强>缓存强>
您还可以实现自己的缓存系统。使用多个图层时,这可能会有点棘手。您可能有一个特定的区域,预计会以很高的速度变化。然后大概不会改变背景,除非它已经调整大小,或者颜色已经改变等等。例如针在一些照片上移动。只需在背景中保留两个不同的图像对象并将它们组合起来,确保至少顶部的图像对象是透明的。
您还可以使用Invalidate
命令告知Windows何时控件的缓存无效(下一个主题...)。这将告诉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;