Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
Delphi 10.1 Berlin Starter
|
Re: Komplettes Formular ausdrucken?
1. Nov 2007, 16:15
als Anregung hier ne Procedure, mit der ein RichEdit, das ein Bild enthält, gedruckt wurde:
Delphi-Quellcode:
procedure TfrmPrintPreview.BtnPrintClick(Sender: TObject);
const A4_width=210;
A4_height=297;
A5_width=148;
A5_height=210;
var offset_x,
offset_y: integer;
dpi_x, dpi_y: integer;
rc: TRect;
rgn: HRGN;
off_x, off_y: integer;
b: TBitmap;
Info : PBitmapInfo;
InfoSize : DWORD;
Image : Pointer;
ImageSize : DWORD;
Bits : HBITMAP;
begin
dpi_X := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
dpi_Y := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
off_X := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
off_Y := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
// assume A4 as default format
// get offset for a5 printing
offset_x:=(A4_width-A5_width) div 2;
offset_y:=(A4_height-A5_height) div 2;
Printer.Title:='Schreibwerkstatt';
Printer.BeginDoc;
if (RahmenFileName<>'') then begin
// draw frame if selected ( this complex code is needed as using StretchDraw() does not work on all printers, e.g. Acrobat)
b := tbitmap.create;
b.loadfromfile(RahmenFileName);
// assume frame were created using 100dpi
// todo: adjust by off_x, off_y?
rc:=Rect((Printer.PageWidth-b.width*dpi_x div 100) div 2,
(Printer.PageHeight-b.height*dpi_y div 100) div 2,
(Printer.PageWidth-b.width*dpi_x div 100) div 2+b.width*dpi_x div 100,
(Printer.PageHeight-b.height*dpi_y div 100) div 2+b.Height*dpi_y div 100);
Bits := b.Handle; // bmp is passed as a parameter
GetDIBSizes(Bits, InfoSize, ImageSize);
Info := AllocMem(InfoSize);
try
Image := AllocMem(ImageSize);
try
GetDIB(Bits, 0, Info^, Image^);
StretchDIBits(Printer.Canvas.Handle,
rc.left, rc.top, rc.Right-rc.left, rc.Bottom-rc.top,
0, 0, b.Width, b.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Image, ImageSize);
end;
finally
FreeMem(Info, InfoSize);
end;
b.free;
end;
rc:=Rect(round(offset_x/25.4*dpi_x)-off_x,
round(offset_y/25.4*dpi_y)-off_y,
round((offset_x+A5_width)/25.4*dpi_x)-off_x,
round((offset_y+A5_height)/25.4*dpi_y)-off_y+dpi_y);
// FEHLER: das Rendern des RichEdits auf das Device des Druckers funktioniert
// nicht korrekt, der Parameter Bottom wird nicht korrekt verwendet
// daher wird hier von Hand der gültige Zeichenbereich festgelegt
rgn:=CreateRectRgn(rc.left, rc.top, rc.Right, rc.Bottom);
// SelectClipRgn(Printer.Canvas.Handle, rgn);
RichEditToCanvas(FrmSWMain.RE, Printer.Canvas, dpi_x, dpi_y, rc);
Printer.EndDoc;
close;
end;
Die wird in der Form zwar nicht funktionieren, weil Vars und andere Proceduren fehlen, aber vielleicht kann man das ja umbauen
Karl-Heinz Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
|