Announcement

Collapse
No announcement yet.

Druckvorschau zu RichEdit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Druckvorschau zu RichEdit

    Hallo, hat schon jemand zu RichEdit eine Druckvorschau programmiert oder gibt es dazu irgendwo ein Beispiel. Vielen Dank für Tipps.

  • #2
    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&gt

    Comment

    Working...
    X