Einzelnen Beitrag anzeigen

Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#11

Re: Komplettes Formular ausdrucken?

  Alt 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)
  Mit Zitat antworten Zitat