| Code: |
| procedure TMainFrm.Printgraph(aPrintPreview: TPrintPreview; aScale: real);
var R: TRect; ImageSize, PrintSize: TPoint; x, y: integer; begin aPrintPreview.BeginDoc; R := aPrintPreview.PrinterPageBounds; PrintSize.X := R.Right-R.Left; PrintSize.Y := R.Bottom-R.Top; ImageSize.X := Trunc(PrintSize.X * aScale); { aScale is [0.1 - 2] } ImageSize.Y := Trunc(PrintSize.Y * aScale); if (ImageSize.X > PrintSize.X) or (ImageSize.Y > PrintSize.Y) then begin { multipage printing } x := 0; y := 0; while (x < ImageSize.X) and (y < ImageSize.Y) do begin R := Rect(0, 0, ImageSize.X, ImageSize.Y); OffsetRect(R, -x, -y); FGraph.Print(aPrintPreview.Canvas, R); { or some other stretched drawing thing } { step horizontally } if (x + PrintSize.X < ImageSize.X) then begin Inc(x, PrintSize.X); aPrintPreview.NewPage; end else begin x := 0; Inc(y, PrintSize.Y); { step vertically } if (y < ImageSize.Y) then begin aPrintPreview.NewPage; end else begin y := 0; Break; end; end; end; end else begin { centered single page printing } InflateRect(R, -(PrintSize.X - ImageSize.X) div 2, -(PrintSize.Y - ImageSize.Y) div 2); FGraph.Print(aPrintPreview.Canvas, R); end; aPrintPreview.EndDoc; end; |
| Code: |
|
procedure TMainFrm.Printgraph( aPrintPreview: TPrintPreview; aScale: real; aCenter: boolean; aOverlapMultipage: real); var R: TRect; ImageSize, PrintSize: TPoint; Centering: TPoint; x, y: integer; begin aPrintPreview.BeginDoc; R := aPrintPreview.PrinterPageBounds; PrintSize.X := R.Right-R.Left; PrintSize.Y := R.Bottom-R.Top; ImageSize.X := Trunc(PrintSize.X * aScale); ImageSize.Y := Trunc(PrintSize.Y * aScale); FillChar(Centering, SizeOf(Centering), #0); if (ImageSize.X > PrintSize.X) or (ImageSize.Y > PrintSize.Y) then begin { multipage printing } if (aOverlapMultipage < 0) then aOverlapMultipage := 0; if (aOverlapMultipage > 0.5) then aOverlapMultipage := 0.5; if (aCenter) then begin Centering.X := (PrintSize.X - (ImageSize.X mod PrintSize.X)) div 2; Centering.Y := (PrintSize.Y - (ImageSize.Y mod PrintSize.Y)) div 2; end; x := 0; y := 0; while (x < ImageSize.X) and (y < ImageSize.Y) do begin R := Rect(0, 0, ImageSize.X, ImageSize.Y); OffsetRect(R, -x + Centering.X, -y + Centering.Y); FGraph.Print(aPrintPreview.Canvas, R); { step horizontally } if (x + PrintSize.X < ImageSize.X) then begin Inc(x, trunc(PrintSize.X * (1-aOverlapMultiPage))); aPrintPreview.NewPage; end else begin x := 0; Inc(y, trunc(PrintSize.Y * (1-aOverlapMultipage))); { step vertically } if (y < ImageSize.Y) then begin aPrintPreview.NewPage; end; end; end; end else begin { single page printing } InflateRect(R, -(PrintSize.X - ImageSize.X) div 2, -(PrintSize.Y - ImageSize.Y) div 2); if (not aCenter) then OffsetRect(R, -(PrintSize.X - ImageSize.X) div 2, -(PrintSize.Y - ImageSize.Y) div 2); FGraph.Print(aPrintPreview.Canvas, R); end; aPrintPreview.EndDoc; end; |
output generated using printer-friendly topic mod. All times are GMT