Как получить текстовый экстент RichEdit в Delphi

Кто-нибудь знает, как получить ширину и высоту текста в элементе управления TRichEdit, так же, как вы использовали бы TextWidth и TextHeight на TCanvas?

Для этого мне нужно знать, что у меня есть RichEdit в невидимой форме, в которую я копирую содержимое на холст, используя Richedit.Perform(EM_FORMATRANGE, ...). Проблема в том, что EM_FORMATRANGE требует параметр типа TFormatRange, в котором указывается целевой прямоугольник, но я не знаю, каким должен быть прямоугольник, потому что я заранее не знаю размер содержимого в RichEdit. Надеюсь, что это имеет смысл.

1 ответ

Решение

Снова используйте EM_FORMATRANGE для измерения, см. Сообщение EM_FORMATRANGE на MSDN:

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


Для более полного примера см. Эту статью, или вообще любой код предварительного просмотра / печати RichEdit...

Другие вопросы по тегам