代码之家  ›  专栏  ›  技术社区  ›  GJ.

TMetafileCanvas示例

  •  0
  • GJ.  · 技术社区  · 10 年前

    我打算使用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 回复  |  直到 10 年前
        1
  •  4
  •   Ken White    10 年前

    在释放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;