uses RichEdit;
{將RichEdit1的內容儲存為圖片,此函數也適合於RxRichEdit,即RichEdit: TRxRichEdit}
procedure RichEditToCanvas(RichEdit: TRichEdit; Canvas: TCanvas; PixelsPerInch: Integer);
var
ImageCanvas: TCanvas;
fmt: TFormatRange;
begin
ImageCanvas := Canvas;
with fmt do
begin
hdc:= ImageCanvas.Handle;
hdcTarget:= hdc;
rc:= Rect(0, 0,
ImageCanvas.ClipRect.Right * 1440 div PixelsPerInch,
ImageCanvas.ClipRect.Bottom * 1440 div PixelsPerInch
);
rcPage:= rc;
chrg.cpMin := 0;
chrg.cpMax := RichEdit.GetTextLen;
end;
SetBkMode(ImageCanvas.Handle, TRANSPARENT);
RichEdit.Perform(EM_FORMATRANGE, 1, Integer(@fmt));
RichEdit.Perform(EM_FORMATRANGE, 0, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEditToCanvas(RichEdit1, Image1.Canvas, Self.PixelsPerInch);
Image1.Refresh;
end;
TRichEdit的預覽列印
Rich Edit控制項(我們說的是標準的Windows控制項,不是一個Delphi構件)包含內建的列印特性,可以使用這個特性向印表機傳送格式化的文本,或是通過程式員稍微地努力就可將它的內容繪製到任何Canvas上。
當然,標準的Delphi TRichEdit構件封裝了這一特性。我們可以使用這一可能性來製作一個快速的比例縮放的預覽列印,或者將Rich Text繪製到任何Delphi控制項上。
將Rich Edit控制項繪製到任何Canvas上,涉及使用標準Rich Edit控制項訊息EM_FORMATRANGE。
這個訊息的lParam參數是一個指向TFormatRange紀錄的指標。在將訊息傳遞給RichEdit之前,必須填充這個記錄。
TFORMATRANGE記錄包含一個rich edit控制項用于格式化輸出它的內容到特定裝置的資訊。這裡的
hdc —— 要渲染的裝置。
HdcTarget —— 要格式化的目標裝置。
rc —— 要渲染的地區。使用的測量單位是緹。緹是一種不受螢幕約束(screen-independent)的單位,以確保螢幕元素的比例在所有顯示系統上都相同。一緹被定義為一英寸的1/1440。
RcPage —— 渲染裝置的整個地區。使用的測量單位是緹。
chrg —— TCHARRANGE記錄指定了格式化文本的範圍。
這個記錄通常被EM_EXGETSEL和EM_EXSETSEL訊息使用,它包含兩個域:cpMin和cpMax。
cpMin 是一個字元位置索引,直接位於範圍內第一個字元之前。
cpMax 是一個字元位置索引,直接位於範圍內最後一個字元之後。
列印一個Rich Edit控制項到一個位元影像上用於預覽
完整頁代碼:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, RichEdit;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
RichEdit1: TRichEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function PrintRTFToBitmap(ARichEdit : TRichEdit; ABitmap : TBitmap) : Longint;
var
range : TFormatRange;
begin
FillChar(Range, SizeOf(TFormatRange), 0);
// 渲染我們要測量的相同DC。
Range.hdc := ABitmap.Canvas.handle;
Range.hdcTarget := ABitmap.Canvas.Handle;
// 設定頁。
Range.rc.left := 0;
Range.rc.top := 0;
Range.rc.right := ABitmap.Width * 1440 div Screen.PixelsPerInch;
Range.rc.Bottom := ABitmap.Height * 1440 div Screen.PixelsPerInch;
// 列印文本的預設範圍為整個文檔。
Range.chrg.cpMax := -1;
Range.chrg.cpMin := 0;
// 格式化文本。
Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range));
// 釋放緩衝資訊。
SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
//Image1.Refresh;
end;
// 接下來的執行個體顯示了不只是如何將Rich Edit繪製到任何Canvas上,還包括如何只繪製選擇的文本範圍。
function PrintToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
ARichEdit : TRichEdit; AWidth, AHeight : integer) : Longint;
var
Range : TFormatRange;
begin
FillChar(Range, SizeOf(TFormatRange), 0);
Range.hdc := ACanvas.handle;
Range.hdcTarget := ACanvas.Handle;
Range.rc.left := 0;
Range.rc.top := 0;
Range.rc.right := AWidth * 1440 div Screen.PixelsPerInch;
Range.rc.Bottom := AHeight * 1440 div Screen.PixelsPerInch;
Range.chrg.cpMax := ToChar;
Range.chrg.cpMin := FromChar;
Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range));
SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
end;
{use PrintRTFToBitmap function}
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
bmp.Width := RichEdit1.ClientWidth;
bmp.Height := RichEdit1.ClientHeight;
PrintRTFToBitmap(RichEdit1, Bmp);
Image1.Canvas.Draw(0, 0, Bmp);
bmp.Free;
end;
{use PrintToCanvas function}
procedure TForm1.Button2Click(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
bmp.Width := RichEdit1.ClientWidth;
bmp.Height := RichEdit1.ClientHeight;
PrintToCanvas(bmp.Canvas, 0, Length(RichEdit1.Text), RichEdit1, Bmp.Width, Bmp.Height);
Image1.Canvas.Draw(0, 0, Bmp);
bmp.Free;
end;
end.