TMetafileCanvas示例

时间:2014-03-18 16:39:55

标签: delphi delphi-xe3 metafile

我打算使用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,然后我复制了上面的例子,但是当执行代码并且表单保持不变时没有发生任何事情!

显然我做错了什么! 我必须做的那个例子应该正确吗?

1 个答案:

答案 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;