TForm.Canvas和TImage.Canvas有何不同?(50分)

  • 主题发起人 主题发起人 shaofun
  • 开始时间 开始时间
S

shaofun

Unregistered / Unconfirmed
GUEST, unregistred user!
绘制一个复杂一点的图,在TForm.Canvas上是边绘制边显示,而在TImage.Canvas上
却是全部绘制完后才一起显示出来,这是为什么?怎样才能使TImage.Canvas也象
TForm.Canvas一样边绘制边显示?
 
可能是我说的不清楚,那就看代码:
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: integer;
begin
for i := 1 to 300 do
for j := 1 to 1000 do
begin
Canvas.MoveTo(i, 0);
Canvas.LineTo(i,50);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
begin
for i := 1 to 300 do
for j := 1 to 1000 do
begin
Image1.Canvas.MoveTo(i, 0);
Image1.Canvas.LineTo(i,50);
end;
end;
运行一下就知道我想问什么了。
 
有一个最基本的不同是Tform由TWinControl继承而来,而TImage由TControl继承而来.
 
TImage由TGraphicControl继承而来.
 
我是问:TForm.Canvas和TImage.Canvas的不同,不是:TForm和TImage的区别,还有是什
么原因产生它们的显示效果不同
 
根本点可能就是在这里:
因为TImage不是一个窗口,它的所有消息都是有TForm来处理的。所以他有可能并不是象TForm本身一接到绘制消息就重绘本身,
TForm可能在Click事件结束后,才重绘窗体来显示image。

应该是这样吧。
 
你在Image1.Canvas.LineTo(i,50);后面加上一句:Image1.Update; 就可以得到你要的效果了。
 
procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
begin
Image1.Canvas.Pen.Color :=clBlue;
Image1.Canvas.Pen.Style :=psSolid;
for i := 1 to 300 do
begin
Image1.Repaint;//[red]加上这句就可以看到效果[/red]
for j := 1 to 1000 do
begin
Image1.Canvas.MoveTo(i, 0);
Image1.Canvas.LineTo(i,50);
end;
end;
end;
 
其实在Image上绘图,是首先在内存中绘好,然后再整个画到Image.Canvas上;
直接在Image.Canvas绘图会产生闪烁。
 
后退
顶部