Delphi - Нарисуйте текстовую мультилинию в центре прямоугольника
В Delphi я хочу нарисовать текст внутри TRect. Я надеюсь на следующую функциональность:
- Нарисуйте текст по центру вертикально внутри TRect
- Нарисуйте текст по центру по горизонтали внутри TRect
- Если есть место для более чем 1 строки текста (с использованием высоты TRect), нарисуйте текст многострочным
- Если текст не помещается в TRect (в одну или в несколько строк), добавьте к тексту многоточие.
Я вижу, что функция Windows.DrawText() почти охватывает эту функцию, однако при написании текста многострочный и вертикально центрированный взаимоисключающие.
Мне было интересно, если эта функциональность встроена в Windows (2000+)? Если нет, то есть ли способ сделать это без написания моей собственной функции?
2 ответа
Извините, это сочетание всех предыдущих ответов и комментариев. Но, похоже, ОП нуждается в большей помощи.
function DrawTextCentered(Canvas: TCanvas; const R: TRect; S: String): Integer;
var
DrawRect: TRect;
DrawFlags: Cardinal;
DrawParams: TDrawTextParams;
begin
DrawRect := R;
DrawFlags := DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK or
DT_EDITCONTROL or DT_CENTER;
DrawText(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags or DT_CALCRECT);
DrawRect.Right := R.Right;
if DrawRect.Bottom < R.Bottom then
OffsetRect(DrawRect, 0, (R.Bottom - DrawRect.Bottom) div 2)
else
DrawRect.Bottom := R.Bottom;
ZeroMemory(@DrawParams, SizeOf(DrawParams));
DrawParams.cbSize := SizeOf(DrawParams);
DrawTextEx(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags, @DrawParams);
Result := DrawParams.uiLengthDrawn;
end;
procedure TForm1.FormPaint(Sender: TObject);
const
S = 'This is a very long text as test case for my paint routine.';
var
R: TRect;
begin
SetRect(R, 100, 100, 200, 140);
Canvas.Rectangle(R);
InflateRect(R, -1, -1);
Caption := Format('%d characters drawn', [DrawTextCentered(Canvas, R, S)]);
end;
Измерьте текст сначала с помощью DT_CALCRECT
, Проходить DT_WORDBREAK
чтобы указать, что перенос слов включен. Это позволит вам найти необходимую высоту для вашего текста. Затем вы можете в своем коде рассчитать вертикальное смещение, которое дает вам вертикально центрированный текст, и нарисовать с этим смещением.