Как получить текстовый экстент 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...