Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Связать Canvas и MetaFile в Delphi

Автор: Borodatu
Дата сообщения: 30.10.2006 13:58
Как нарисованное на канве например PaintBox-а закинуть в MetaFile?
Автор: rain87
Дата сообщения: 30.10.2006 18:15
хм. а это реально?

имхо нет, т.к. метафайл представляет собой векторную графику, а канвас - растровая. разве что может быть можно запомнить его буквально по точкам, если метафайл такое поддерживает
Автор: Simbr
Дата сообщения: 31.10.2006 07:49
Пример вывода в метафайл содержимого панели (должно работато со всеми VC, содержащими TCanvas)

Function TMyPanel.CreateMetafile( Enhanced:Boolean; Const Rect:TRect ):TMetafile;
Var tmpHandle:HMETAFILE;
tmpCanvas:TCanvas;
begin
tmpHandle:=CreateMetafile(nil);
tmpCanvas:=TCanvas.Create;
tmpCanvas.Handle:=tmpHandle;
try
DrawToMetaCanvas(tmpCanvas,Rect);
finally
tmpCanvas.Free;
end;
result:=TMetafile.Create;
With result do
begin
Handle:=CloseMetafile(tmpHandle);
Inch:=Screen.PixelsPerInch;
Width :=Rect.Right-Rect.Left)-1;
Height:=Rect.Bottom-Rect.Top)-1;
end;
end;
Автор: Borodatu
Дата сообщения: 31.10.2006 15:24
Simbr а что за процедурка DrawToMetaCanvas? Плз...

Автор: Simbr
Дата сообщения: 01.11.2006 07:53
DrawToMetaCanvas(tmpCanvas,Rect); -- прорисовка всех графических примитивов в канве, подчекиваю не копирование области экрана, а именно прорисовка. В случае копирования в метафайл будет помещен растр, а не векторный примитив.
Приведенный фрагмент извлечен из исходников, с которыми не работал уже несколько лет, а поскольку функуции DrawToMetaCanvas довольно сложны, то привожу другой вариант.

procedure TForm1.Button1Click(Sender: TObject);
const NP=200;
Pi2=Pi*2;
Var
tmpMetaFile:TMetafile;
tmpMetaFileCanvas:TMetaFileCanvas;
R:TRect;
I, IX, IY:integer;
X, Y:Double;
begin
R.Left:=0; R.Top:=0; R.Right:=640; R.Bottom:=480;
TmpMetaFile:=TMetafile.Create;
tmpMetaFileCanvas:=TMetaFileCanvas.Create(TmpMetaFile, 0);
with tmpMetaFileCanvas do
begin
//------ Здесь происходит рисование. Эту часть следует выделить в отдельую процедуру и вызывать
// ee для выода заданного изображения в случае вывода на экран, принтер, метафайл и т.п.
MoveTo(1,R.Bottom-2); LineTo(R.Right-1, R.Bottom-2);
MoveTo(1,R.Bottom-1); LineTo(1, 1);
MoveTo(1,R.Bottom-1);
for I:=0 to NP-1 do
begin
X:=I/NP; Y:=Sin(Pi2*X); Y:=Y*Y;
IX:=Round(640*X); IY:=480-Round(480*Y);
LineTo(IX, IY);
end;
//--------
end;
tmpMetaFileCanvas.Free;
with TmpMetaFile do
begin
Inch:=Screen.PixelsPerInch;
Width :=R.Right-R.Left;
Height:=R.Bottom-R.Top;
end;
TmpMetaFile.SaveToFile('FPC.emf');
TmpMetaFile.Free;
end;

PS
В Delphi у TPаnel свойтства Canvas нет, я ее перепутал с Lazarus, где оно присутствует
Автор: Borodatu
Дата сообщения: 01.11.2006 11:23
Благодарю за хлопоты Simbr!!!
В общем нечто похожее я и думал, в процедурку рисования ввести новый входной параметр канва на которой рисовать. И затем прорисовывать че надо чи в пайнтбосе чи в метафайле.
Я просто думал можно ли каким нибудь образом уже отрисованное пернести в метафайл... я ето потом в отчет пихаю и на печать.

Страницы: 1

Предыдущая тема: Playlist для MediaPlayer в Delphi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.