Hallo, hat schon jemand zu RichEdit eine Druckvorschau programmiert oder gibt es dazu irgendwo ein Beispiel. Vielen Dank für Tipps.
Announcement
Collapse
No announcement yet.
Druckvorschau zu RichEdit
Collapse
X
-
Hallo,
das folgende Beispiel demonstriert eine Druckvorschau, die allerdings schlicht und einfach ist. Das RichEdit-Control von Microsoft wird über EM_FORMATRANGE beauftragt, sich selbst darzustellen, wobei Delphi über ein TImage nur die Anzeige übernimmt:
<pre>
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;
// Scalierung
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;
</pre>
Das dynamisch erzeugte Preview-Formular sieht so aus:
<pre>
unit PreviewFrmPreview;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
type
TFormPreview = class(TForm)
ImagePreview: TImage;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
FormPreview: TFormPreview;
implementation
{$R *.DFM}
end.
</pre>
Comment