0

我打算使用 TMetafileCanvas 所以我已经开始寻找例子。在Embarcadero 方面,我找到了以下示例:

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,然后我复制了上面的示例,但是执行代码时没有任何反应并且表单保持不变!

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

4

1 回答 1

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;
于 2014-03-18T17:10:24.720 回答