![]() |
Rendern von TRichEdit auf TBitmap
Hi,
Ich möchte den Inhalt eines RichEdit in einen rechteckigen Bereich eines Bitmaps rendern. Das Bitmap hat 300 DPI / 300 DPI und die Größe A4 (-> 2480 x 3507 Pixel). Wenn ich den Text auf den Drucker rendern lasse, wird er richtig dargestellt. Wird der Text aber auf das Bitmap gezeichnet, wird er verkleinert (Font.Size = 12 Pt wird dann zu abs(Font.Height) = 16 Px). Wie kann man dafür sorgen, dass der Text gemäß der DPI-Zahl des Ziel-Bitmaps gerendert wird? Hier der Code, den ich zum Rendern benutze:
Delphi-Quellcode:
Beste Grüße,
function TMyRichEdit.RenderText(TargetCanvas: TCanvas; TestMetricsOnly: Boolean): Integer;
//Code based on a sample by P. Below [url]www.swissdelphicenter.com[/url] var fmt: TFormatRange; Flag: Integer; OldBkMode: Integer; begin If TestMetricsOnly then Flag := 0 else Flag := 1; with fmt do begin hdc:= TargetCanvas.Handle; hdcTarget:= hdc; // rect needs to be specified in twips (1/1440 inch) as unit rc:= Rect( FPxLeft * 1440 div PPIx, FPxTop * 1440 div PPIy, (FPxLeft + FPxWidth) * 1440 div PPIx, (FPxTop + FPxHeight) * 1440 div PPIy); rcPage:= rc; chrg.cpMin := 0; chrg.cpMax := Self.GetTextLen; end; OldBkMode := SetBkMode(TargetCanvas.Handle, TRANSPARENT); Result := SendMessage(Self.Handle, EM_FORMATRANGE, Flag, lParam(@fmt)); // next call frees some cached data SendMessage(Self.Handle, EM_FORMATRANGE, 0, 0); SetBkMode(TargetCanvas.Handle, OldBkMode); end; Dani |
Re: Rendern von TRichEdit auf TBitmap
:angel:
|
Re: Rendern von TRichEdit auf TBitmap
Hi,
vielleicht hilft dir das ![]() Oder schau mal auf ![]() |
Re: Rendern von TRichEdit auf TBitmap
Mein Code basiert doch bereits auf dem Beispiel von swissdelphicenter (siehe Kommentar in Z. 2) !? Komponenten die auf der CLX basieren kommen leider nicht in Frage (wegen dem modularen Aufbau - fragt nicht *g*)
Wie gesagt, mit der Printer-Canvas funktioniert es. Kann ich der TargetCanvas irgendwie "beibringen", dass sie mit 300 DPI gerendert wird? Eigentlich müsste das bereits so sein, da die Owner-Bitmap der Canvas laut Header (kann z.B. mit IrfanView angezeigt werden) genau 300 DPI hat. GetDeviceCaps liefert aber 96 DPI :-/ |
Re: Rendern von TRichEdit auf TBitmap
![]() Zitat:
|
Re: Rendern von TRichEdit auf TBitmap
Diese Monströsität stellt das RichEdit zwar richtig dar, aber es ist nicht gerade elegant... egal.
Delphi-Quellcode:
function TMyRichEdit.RenderText(TargetCanvas: TCanvas; TestMetricsOnly: Boolean): Integer;
//Code based on a sample by P. Below [url]www.swissdelphicenter.com[/url] var fmt: TFormatRange; Flag: Integer; OldBkMode: Integer; LogX, LogY: Integer; FactorX, FactorY: Double; BackupRTF: TMemoryStream; i: Integer; begin LogX := GetDeviceCaps(TargetCanvas.Handle, LOGPIXELSX); LogY := GetDeviceCaps(TargetCanvas.Handle, LOGPIXELSY); FactorX := PPIx / LogX; FactorY := PPIy / LogY; BackupRTF := TMemoryStream.Create; try BackupRTF.Position := 0; Self.Lines.SaveToStream(BackupRTF); Self.Lines.BeginUpdate; try for i:=0 to Self.GetTextLen-1 do begin SelStart := i; SelLength := 1; SelAttributes.Height := round(SelAttributes.Height * FactorY); end; If TestMetricsOnly then Flag := 0 else Flag := 1; with fmt do begin hdc:= TargetCanvas.Handle; hdcTarget:= hdc; // rect needs to be specified in twips (1/1440 inch) as unit rc:= Rect( FPxLeft * 1440 div LogX, FPxTop * 1440 div LogY, (FPxLeft + FPxWidth) * 1440 div LogX, (FPxTop + FPxHeight) * 1440 div LogY); rcPage:= rc; chrg.cpMin := 0; chrg.cpMax := Self.GetTextLen; end; OldBkMode := SetBkMode(TargetCanvas.Handle, TRANSPARENT); Result := SendMessage(Self.Handle, EM_FORMATRANGE, Flag, lParam(@fmt)); // next call frees some cached data SendMessage(Self.Handle, EM_FORMATRANGE, 0, 0); SetBkMode(TargetCanvas.Handle, OldBkMode); finally BackupRTF.Position := 0; Self.Lines.LoadFromStream(BackupRTF); Self.Lines.EndUpdate; end; finally BackupRTF.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz