RichEdit只打印选定的文本

字体大小: 中小 标准 ->行高大小: 标准
...print only the selected Text of TRichedit?

uses

Richedit;

procedure TForm1.Button1Click(Sender: TObject);

var

printarea: TRect;

richedit_outputarea: TRect;

printresX, printresY: Integer;

fmtRange: TFormatRange;

nextChar: Integer;

S: string;

begin

Printer.BeginDoc;

try

with Printer.Canvas do

begin

printresX := GetDeviceCaps(Handle, LOGPIXELSX);

printresY := GetDeviceCaps(Handle, LOGPIXELSY);

printarea :=

Rect(printresX, // 1 inch left margin

printresY * 3 div 2, // 1.5 inch top margin

Printer.PageWidth - printresX, // 1 inch right margin

Printer.PageHeight - printresY * 3 div 2 // 1.5 inch

Bottom Margin);

// Define a rectangle for the rich edit text. The height is set

to the

// maximum. But we need to convert from device units to twips,

// 1 twip = 1/1440 inch or 1/20 point.

richedit_outputarea :=

Rect(printarea.Left * 1440 div printresX,

printarea.Top * 1440 div printresY,

printarea.Right * 1440 div printresX,

printarea.Bottom * 1440 div printresY);

// Tell rich edit to format its text to the printer. First set

// up data record for message:

fmtRange.hDC := Handle; // printer handle

fmtRange.hdcTarget := Handle; // ditto

fmtRange.rc := richedit_outputarea;

fmtRange.rcPage := Rect(0, 0,

Printer.PageWidth * 1440 div printresX,

Printer.PageHeight * 1440 div printresY);

// set range of characters to print to selection

fmtRange.chrg.cpMin := richedit1.selstart;

fmtRange.chrg.cpMax := richedit1.selStart + richedit1.sellength - 1;

// remove characters that need not be printed from end of

selection.

// failing to do so screws up the repeat loop below.

S := Richedit1.SelText;

while (fmtRange.chrg.cpMax > 0) and

(S[fmtRange.chrg.cpMax] <= ' ') do Dec(fmtRange.chrg.cpMax);

repeat

// Render the text

nextChar := richedit1.Perform(EM_FORMATRANGE, 1, Longint(@fmtRange));

if nextchar < fmtRange.chrg.cpMax then

begin

// more text to print

printer.newPage;

fmtRange.chrg.cpMin := nextChar;

end; { If }

until nextchar >= fmtRange.chrg.cpMax;

// Free cached information

Richedit1.Perform(EM_FORMATRANGE, 0, 0);

end;

finally

Printer.EndDoc;

end;

end;

{

The richedit1.perform( EM_FORMATRANGE call returns the index of the

last character that could be fitted into the passed fmtrange.rc, + 1.

So if multiple pages are required one repeats with fmtrange.chrg.cpMin

set to this value, until all characters have been printed.

}

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/68020.html