Пример 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;