Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Как правильно вывести метафайл на принтер?   Найти похожие ветки 

 
Курдль ©   (2004-03-11 13:01) [0]

Как правильно вывести метафайл на принтер? Спасибо.


 
Тимохов ©   (2004-03-11 13:18) [1]

Я делал, делаю и буду делать (т.к. справился с проблемами) так

     Printer.Orientation := fPages.Orientation;
     for kI := 0 to fPages.Count - 1 do
     begin
        Printer.BeginDoc();
        with Printer.Canvas do
        begin
           StretchDraw(BOUNDS(0, 0, fPages.PrinterInfo.PrintW, fPages.PrinterInfo.PrintH), fPages[kI].MetaFile);
        end;
        Printer.EndDoc();
     end;


где fPages - список страниц, c метафайлами.
Метафайлы Enhanced = true
PrinterInfo - параметры из принтера:
CODE>constructor TPrinterInfo.Create(aOrientation : TPrinterOrientation);
begin
  Printer.Orientation := aOrientation;
  fDpiX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
  fDpiY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
  fMarginL := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
  fMarginT := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
  fPrintW := GetDeviceCaps(Printer.Handle, HORZRES);
  fPrintH := GetDeviceCaps(Printer.Handle, VERTRES);
  fPhysW := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH);
  fMarginR := fPhysW - fPrintW - fMarginL;
  fPhysH := GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT);
  fMarginB := fPhysH - fPrintH - fMarginT;
end;


 
Курдль ©   (2004-03-11 13:23) [2]

Спасибо!
Но я имел в виду "правильное проигрывание" метафайла.
StretchDraw же его просто рисует побитово.
Сравни:

1. Printer.BeginDoc;
  Printer.Canvas.OutText(0,0, "Test");
  Printer.EndDoc;

2. MetafileCanvas := TMetafileCanvas.Create(Metafile, Printer.Handle);
  MetafileCanvas.OutText(0,0, "Test");
  MetafileCanvas.Free;
  Printer.BeginDoc;
  Printer.Canvas.Draw(0,0, Metafile);
  Printer.EndDoc;


 
Тимохов ©   (2004-03-11 13:28) [3]

Стравнивать нет времени (виноват).
Что значит "правильное проигрывание"?


 
Курдль ©   (2004-03-11 15:01) [4]


> Что значит "правильное проигрывание"?

Метафайл, как известно, хранит не изображения, а инструкции по созданию изображений линий, многоугольников, шрифтов и т.п.
Но если его выводить на принтер с помощью Canvas.Draw, он печатается в растровом виде. А хотелось бы печатать в векторном.
След. рабочий пример помогает заметить разницу:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Printer.BeginDoc;
 Printer.Canvas.TextOut(0,0, "TMetafile is an encapsulation of the Win32 Enhanced metafile.");
 Printer.EndDoc;
end;

procedure TForm1.Button2Click(Sender: TObject);
var MetafileCanvas : TMetafileCanvas; Metafile: TMetafile;
begin
 Metafile := TMetafile.Create;
 MetafileCanvas := TMetafileCanvas.Create(Metafile, 0);
 MetafileCanvas.TextOut(0,0, "TMetafile is an encapsulation of the Win32 Enhanced metafile.");
 MetafileCanvas.Free;
 Printer.BeginDoc;
 //вместо 6396,4896 вставить VERTRES и HORZRES своего принтера
 Printer.Canvas.StretchDraw(Bounds(0,0,6396,4896), Metafile);
 Printer.EndDoc;
 Metafile.Free;
end;


Попробую вывести его на принтер через поток.


 
Тимохов ©   (2004-03-11 16:47) [5]


> Курдль ©   (11.03.04 15:01) [4]

У меня все в векторном.
только я еще после tmetafile.create делаю
fMetaFile.Width := vertres;
fMetaFile.Height := horzres;
соответственно и рассчеты все делаю исходя из dpi принтера.
У меня все векторно.


 
Курдль ©   (2004-03-11 17:24) [6]


> У меня все векторно.

StretchDraw по-любому выводит растрово.
Другое дело, что передаваемая принтеру картинка была создана на основе векторной графики и разница может быть незаметна.
Я все никак не могу услать метафайл прямиком на принтер (что-то подзабыл низкоуровневый доступ), но потом расскажу результат.
(Похоже, что мы уродуемся над одной проблемой - превьюкалкой сложной графики:)


 
WebErr ©   (2004-03-11 17:29) [7]


> StretchDraw по-любому выводит растрово

Метафайл? Растрово? Это из жанра TBitmap.ScanLine[Index] язменяет что-то на устройстве... :))))


 
Тимохов ©   (2004-03-11 17:30) [8]


> Курдль ©   (11.03.04 17:24) [6]

1. Да я в общем-то все проблемы пока решил. Просто рисовать надо lineto, а не fillrect с шинирой 1.
2. Повторюсь, что у меня на принтере выводится все гладенько, кружочки, наклонные линии, никаких растров.


 
Курдль ©   (2004-03-11 17:42) [9]


> WebErr ©   (11.03.04 17:29) [7]
>
> Метафайл? Растрово?


Не передергивайте! Речь шла о процедуре StretchDraw.
Если у Вас иное мнение - изложите!



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
14-1078051680
ABLE
2004-02-29 13:48
2004.03.28
Синий экран


14-1077862572
syte_ser78
2004-02-27 09:16
2004.03.28
Замыкание на себя


6-1073647721
hfa
2004-01-09 14:28
2004.03.28
ClientSocket & ServerSocket


1-1078840598
bn2
2004-03-09 16:56
2004.03.28
непонятное поведение компилятора


7-1073129488
Ilg
2004-01-03 14:31
2004.03.28
Смена разрешения экрана