代码之家  ›  专栏  ›  技术社区  ›  Alan Clark

如何获取Delphi中richedit的文本范围

  •  3
  • Alan Clark  · 技术社区  · 14 年前

    有人知道如何在trichedit控件中获取文本的宽度和高度吗,就像在tcavas上使用text width和text height一样?

    我之所以需要知道这一点,是因为我在一个不可见的表单上有一个richedit,使用richedit.perform(em_formatrange,…)将的内容复制到画布上。问题是,em_FormatRange需要指定目标rect的tformatRange类型的参数,但我不知道rect应该是什么,因为我不知道richedit中内容的大小。希望这是合理的。

    1 回复  |  直到 10 年前
        1
  •  6
  •   Community CDub    10 年前

    再次使用em_格式范围进行测量,请参见 EM_FORMATRANGE Message 关于MSDN:

    沃帕姆 指定是否呈现 文本。如果此参数为非零 值,将呈现文本。 否则,文本将被测量。

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

    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预览/打印代码…