如何在Delphi中获取RichEdit的文本范围

Ala*_*ark 3 delphi richedit

有没有人知道如何在TRichEdit控件中获取文本的宽度和高度,就像在TCanvas上使用TextWidth和TextHeight一样?

我需要知道这样做的原因是我在一个不可见的表单上有一个RichEdit,我使用Richedit.Perform(EM_FORMATRANGE,...)将内容复制到画布.问题是EM_FORMATRANGE需要一个TFormatRange类型的参数,其中指定了目标rect,但我不知道rect应该是什么,因为我事先并不知道RichEdit中内容的大小.希望有道理.

Ser*_*yuz 6

再次使用EM_FORMATRANGE进行测量,请参阅MSDN上的EM_FORMATRANGE消息:

wParam指定是否呈现文本.如果此参数是非零值,则呈现文本.否则,文本只是测量.

通常,您已经有一个目标区域,它具有宽度和高度,您可以在其中进行绘图,例如在纸上打印或在预定义表面上生成预览.获得所需高度的预定义宽度的最简单示例可以是:

var
  Range: TFormatRange;
  Rect: TRect;
  LogX, LogY, SaveMapMode: Integer;
begin
  Range.hdc := ACanvas.Handle;
  Range.hdcTarget := ACanvas.Handle;

  LogX := GetDeviceCaps(Range.hdc, LOGPIXELSX);
  LogY := GetDeviceCaps(Range.hdc, LOGPIXELSY);

  Range.rc.Left := 0;
  Range.rc.Right := RichEdit1.ClientWidth * 1440 div LogX; // Any predefined width
  Range.rc.Top := 0;
  Range.rc.Bottom := Screen.Height * 1440 div LogY; // Some big number
  Range.rcPage := Range.rc;
  Range.chrg.cpMin := 0;
  Range.chrg.cpMax := -1;
  RichEdit1.Perform(EM_FORMATRANGE, 0, Longint(@Range));

  ShowMessage(IntToStr(Range.rc.Bottom * LogY div 1440)); // Get the height
  RichEdit1.Perform(EM_FORMATRANGE, 0, 0); // free cache
Run Code Online (Sandbox Code Playgroud)


有关更完整的示例,请参阅本文,或者通常任何RichEdit预览/打印代码...