![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисование растра в метафайл [D7, WinXP]
pasha_golub © (2006-01-24 18:30:00)Здравствуйте.
Есть код:
procedure DrawC(ACanvas: TCanvas; Ax,Ay,Aw,Ah: integer; AGraphic: TGraphic);
var Emf1: TMetafile;
Emf1_Canvas: TMetaFileCanvas;
a: integer;
begin
If ACanvas is TMetafileCanvas then
begin
Emf1 := TMetaFile.Create;
Emf1.Enhanced := True;
Emf1.Width := Aw;
Emf1.Height := Ah;
try
Emf1_Canvas := TMetafileCanvas.Create(Emf1,0);
try
Emf1_Canvas.Draw(0,0,AGraphic);
Emf1_Canvas.MoveTo(0, 0);
for a:=0 to 10 do
Emf1_Canvas.LineTo(Random(Aw),Random(Ah));
finally
Emf1_Canvas.Free;
end;
ACanvas.Draw(Ax,Ay,Emf1);
finally
Emf1.Free;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
Var EMF: TMetafile;
EMF_Canvas: TmetafileCanvas;
x, y: integer;
W, H: integer;
i,j,a: integer;
begin
{$DEFINE PASHA}
x := StrToInt(Edit1.Text);
y := StrToInt(Edit2.Text);
W := image1.Width;
H := image1.Height;
EMF := TMetafile.Create;
try
EMF.Enhanced := True;
EMF.Width := W*x; //размер всего
EMF.Height := H*y; // метафайла
EMF_Canvas := TmetafileCanvas.Create(EMF,0);
try
for i:=0 to x-1 do
for j:=0 to y-1 do
{$IFDEF PASHA}
with EMF_Canvas do
begin
Draw(W*i,H*j,Image1.Picture.Graphic);
MoveTo(W*i,H*j);
for a:=0 to 10 do
LineTo(W*i+Random(W),H*j+Random(H));
end;
{$ELSE}
DrawC(EMF_Canvas,W*i,H*j,W,H,Image1.Picture.Graphic);
{$ENDIF}
finally
EMF_Canvas.Free;
end;
EMF.SaveToFile('e:\debug.emf');
finally
EMF.Free;
end;
ShowMessage('Done');
end;
Функционально делает одно и тоже. Рисует в метафайл сетку из битмапов из Image1 размером x на y .
В каждой ячейке сверху битмапа случайный узор из линий на всякий случай.
Если поставить, например, х = 200, а у = 1. Для того чтобы метафайл (изображение) не помещался на экране.
То код из {$IFDEF PASHA}отрабатывает как задумано. Есть грид 200х1 с ячейками-битмапами и сверху чуток линий.
А код из {$ELSE}отрисовывает только "по размерам" экрана, а все остальное заполнено только линиями (векторы), а битмапов не видно.
Почему так? Извините, если сумбурно, очень устал.
Если вообще не понятно, смогу привести примеры файлов результатных.
pasha_golub (2006-01-25 20:04:00) [1]Спасибо, Борис. Хотя бы за внимание. :0)
MBo (2006-01-25 12:55:00) [2]воспроизвел - действительно, не рисует дальше определенной позиции - но у меня это не размер экрана (800), а больше - около 1000. С чем связано - непонятно :(
pasha_golub (2006-01-25 11:12:00) [3]Думал, что может зависеть от битмапа (палитра, размер и т.д.), перепробовал все что было под рукой. В пределах экрана рисует, за пределами - нет.
ЗЫ Если у кого-то десктоп мультимониторный, проверьте, пожалуйста. Интересно дюже.
pasha_golub (2006-01-24 18:33:00) [4]Добавлю. По идее.
Код из {$IFDEF PASHA} рисует сразу на конечную канву, а код из {$ELSE} создает дополнительно временный метафайл (внутри DrawC), его прорисовывает, и потом выводит временный метафайл на конечную канву.