我的事件处理程序如下:
procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject);
begin
Canvas.Rectangle(40, 40, 400, 200);
Canvas.Rectangle(80, 80, 360, 160);
Canvas.Ellipse(150, 50, 290, 190);
Canvas.Ellipse(100, 100, 340, 140);
end;
我正在使用Mac OS X
您必须阅读有关图形窗口系统的基础知识。无论是Windows,MacOS还是UNIX X窗口。
几乎普遍来说,不是由应用程序来决定何时,什么以及在何处绘制。是由操作系统决定的,并询问应用程序何时进行操作。应用程序可以做的所有事情-是使窗口的某些部分无效-就是通知OS窗口的某些部分不再有效,然后等到OS希望重新粉刷那部分(也许永远不会, (如果无效的窗口已最小化或被另一个窗口覆盖),然后-并且只有这样-进行绘制。
那你怎么办呢?
方法1:精通资源并接近实际的OS工作流程。
你把TPaintbox
你的整体form
。
您可以将矩形和圆形保留为表单变量内的不可见记录或类。当这些数字更改时(例如:您添加了另一个矩形,或者增加了一些圆直径),您将调用MyForm.MyPaintBox.Invalidate
以通知操作系统该痛苦框的图像不再有效。当操作系统认为及时刷新图像时,它将调用MyForm.MyPaintBox.OnPaint
event,在这种情况下,您将像那样进行调用MyPaintBox.Canvas.Rectangle(40, 40, 400, 200);
。注意-您将重新绘制绘画盒的画布,而不是表单的画布!
procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject);
begin
MyPaintBox.Invalidate();
end;
procedure TfrmCanvasMethods.MyPaintBoxPaint(Sender: TObject);
var Canvas: TCanvas;
begin
Canvas := MyPaintbox.Canvas;
Canvas.Rectangle(40, 40, 400, 200);
Canvas.Rectangle(80, 80, 360, 160);
Canvas.Ellipse(150, 50, 290, 190);
Canvas.Ellipse(100, 100, 340, 140);
end;
方法2:懒惰和资源膨胀
你把TImage
你的整体form
。
该图像将具有包含您想要的任何图片的隐式位图。更重要的是,它将跟踪您绘制的图片并自动调用Invalidate
,并自动处理OS的重画请求。
procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject);
var Canvas: TCanvas;
begin
MyImage.Picture.Bitmap.SetSize( MyImage.ClientWidth, MyImage.ClientHeight );
Canvas := MyImage.Picture.Bitmap.Canvas;
Canvas.Rectangle(40, 40, 400, 200);
Canvas.Rectangle(80, 80, 360, 160);
Canvas.Ellipse(150, 50, 290, 190);
Canvas.Ellipse(100, 100, 340, 140);
end;
但是代价是,您可能会分配多达几兆的内存,而仅仅是为了在操作系统需要刷新表格图片的相对罕见的情况下保留图片。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句