【问题标题】:How to get text extent of RichEdit in Delphi如何在 Delphi 中获取 RichEdit 的文本范围
【发布时间】:2010-07-14 07:31:08
【问题描述】:

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

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

【问题讨论】:

  • 我应该补充一下,我使用的是 Delphi 2007。

标签: delphi richedit


【解决方案1】:

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

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


有关更完整的示例,请参阅 this article,或者一般来说任何 RichEdit 预览/打印代码...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 2021-04-25
  • 1970-01-01
相关资源
最近更新 更多