Пример TMetafileCanvas

Я намерен использовать 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;

Я создал новый проект и надел форму, кнопку и PaintBox, затем скопировал верхний пример, но ничего не происходит, когда код выполняется и форма остается прежней!

Очевидно, я делаю что-то не так! Что я должен сделать, чтобы этот пример работал правильно?

1 ответ

Решение

MetaFile не обновляется, пока вы не освободите MetaFileCanvas. (Код, который вы опубликовали, на самом деле показывает это, но призыв к Free был закомментирован.)

Пример Эмбаркадеро тоже неверен в другом смысле. Вся покраска в форму должна быть сделана в 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;
Другие вопросы по тегам