我打算使用TMetafileCanvas,所以我已经开始寻找示例了。 在Embarcadero side我找到了以下示例:
var
MyMetafile: TMetafile;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyMetafile := TMetafile.Create;
with TMetafileCanvas.Create(MyMetafile, 0) do
try
Brush.Color := clRed;
Ellipse(0, 0, 100, 200);
// ...
finally
// Free;
end;
Form1.Canvas.Draw(0, 0, MyMetafile); {1 red circle }
PaintBox1.Canvas.Draw(0, -50, MyMetafile); {1 red circle }
end;
我已经创建了一个新项目并放置了Form,Button和PaintBox,然后我复制了上面的例子,但是当执行代码并且表单保持不变时没有发生任何事情!
显然我做错了什么! 我必须做的那个例子应该正确吗?
答案 0 :(得分:4)
在释放MetaFileCanvas之前,MetaFile不会自动更新。 (您发布的代码实际上显示了这一点,但对Free
的调用已被注释掉。)
Embarcadero的例子在另一种意义上也是错误的。所有对表单的绘制都应该在OnPaint
事件中完成,而不是从其他任何地方完成。 (我责怪大部分文档示例代码都是由用户提供的,而且只是由文档团队而不是开发团队AFAICT审核。)
procedure TForm1.FormPaint(Sender: TObject);
var
MetaFile: TMetafile;
MFCanvas: TMetafileCanvas;
begin
MetaFile := TMetafile.Create;
try
MetaFile.SetSize(200, 200);
try
MFCanvas := TMetafileCanvas.Create(MetaFile, Canvas.Handle);
MFCanvas.Brush.Color := clRed;
MFCanvas.FloodFill(0, 0, clRed, fsBorder);
MFCanvas.Rectangle(10, 10, 190, 190);
finally
MFCanvas.Free;
end;
Self.Canvas.StretchDraw(Rect(0, 0, 200, 200), MetaFile);
finally
MetaFile.Free;
end;
end;