Mit der Methode Print drucke ich in einem Programm den Inhalt einer RichEdit-Komponente aus. Dabei wird allerdings in der linken oberen Ecke des Blattes mit dem Druck begonnen. Wie bekomme ich Ränder auf das Papier?!
Announcement
Collapse
No announcement yet.
keine Ränder beim Drucken von RichEdit
Collapse
X
-
Hallo,
das folgende Beispiel demonstriert, wie man eine Preview-Funktion mit TRichEdit implementieren kann, bei der auch ein Rand berücksichtigt wird. Das aufgerufene zweite Formular enthält nur eine TImage-Instanz. <br>
Auf dem gleichen Weg sollte auch der Ausdruck möglich sein:
<pre>
unit PreviewFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ExtCtrls, ToolWin, ActnList, ImgList;
type
TForm1 = class(TForm)
ToolBar1: TToolBar;
ToolButton1: TToolButton;
RichEdit1: TRichEdit;
ToolButton2: TToolButton;
OpenDialog1: TOpenDialog;
ImageList1: TImageList;
ActionList1: TActionList;
ActionFileOpen: TAction;
ActionPreview: TAction;
procedure ActionFileOpenExecute(Sender: TObject);
procedure ActionPreviewExecute(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses Printers, RichEdit, PreviewFrmPreview;
procedure TForm1.ActionFileOpenExecute(Sender: TObject);
begin
if OpenDialog1.Execute then
Richedit1.Lines.LoadFromFile(OpenDialog1.Filename) ;
end;
procedure TForm1.ActionPreviewExecute(Sender: TObject);
var
rZoom : Single;
xScale : Single;
yScale : Single;
aPageRect : TRect;
aOutputRect : TRect;
aFmtRange : TFormatRange;
begin
// 50% der Originalgröße
rZoom := 0.5;
xScale := Screen.PixelsPerInch / GetDeviceCaps(Printer.Handle, LOGPIXELSX);
yScale := Screen.PixelsPerInch / GetDeviceCaps(Printer.Handle, LOGPIXELSY);
// Preview-Fläche mit weißem Hintergrund ausfüllen
with FormPreview.ImagePreview.Picture.Bitmap do
begin
Width := Round(Printer.Pagewidth * rZoom * xScale);
Height:= Round(Printer.PageHeight * rZoom * yScale);
with Canvas do begin
Brush.Color := clWhite;
Brush.Style := bsSolid;
FillRect(Cliprect);
end;
end;
// Zoomfaktor berücksichtigten
with FormPreview.ImagePreview.Picture.Bitmap.Canvas do
begin
SetMapMode(Handle, MM_ANISOTROPIC);
SetWindowExtEx(Handle, Screen.PixelsPerInch, Screen.PixelsPerInch, nil);
SetViewportExtEx(Handle, Round(Screen.PixelsPerInch * rZoom),
Round(Screen.PixelsPerInch * rZoom), nil);
end;
// Ausgabebereich in TWIPS (1/1440 inch) festlegen
with FormPreview.ImagePreview.Picture.Bitmap do
aPageRect := Rect(0, 0,
Round(Width * 1440 / Screen.PixelsPerInch / xScale),
Round(Height * 1440 / Screen.PixelsPerInch / yScale));
aOutputRect := aPageRect;
// Rand berücksichtigen
InflateRect(aOutputRect, -720, -720 );
// EM_FORMATRANGE-Parameter zusammensetzen
FillChar(aFmtRange, SizeOf(aFmtRange), 0);
with aFmtRange do
begin
hDC := FormPreview.ImagePreview.Picture.Bitmap.Canvas.Han dle;
hdcTarget := hDC;
rc := aOutputRect;
rcPage := aPageRect;
chrg.cpMin := 0;
chrg.cpMax := Richedit1.GetTextLen-1;
end;
// Richedit-Text für die Bildschirmausgabe rendern
Richedit1.Perform(EM_FORMATRANGE, 1, Longint(@aFmtRange));
// Wichtig! Cache-Daten wieder löschen
Richedit1.Perform(EM_FORMATRANGE, 0, 0);
with FormPreview do
begin
Width := ImagePreview.Picture.Bitmap.Width;
Height := ImagePreview.Picture.Bitmap.Height;
ShowModal;
end;
end;
end.
</pre>
Comment
Comment