Delphi - рисовать текстовые мультилинии в центре прямоугольника - PullRequest
8 голосов
/ 10 августа 2011

В Delphi я хочу нарисовать текст внутри TRect.Я надеюсь на следующую функциональность:

  1. Нарисуйте текст по центру вертикально в пределах TRect
  2. Нарисуйте текст по центру по горизонтали в пределах TRect
  3. Если есть место длябольше чем 1 строка текста (используя высоту TRect), нарисуйте текст многострочным
  4. Если текст не помещается в TRect (ни на одной, ни на нескольких строках), тогда добавьте к тексту многоточие.

Я вижу, что функция Windows.DrawText () почти охватывает эту функцию, однако при написании текста многострочные и вертикально центрированные взаимоисключающие.

Мне было интересно,эта функциональность встроена в windows (2000+)?Если нет, то есть ли способ сделать это без написания моей собственной функции?

Ответы [ 2 ]

18 голосов
/ 10 августа 2011

Извините, это комбинация всех предыдущих ответов и комментариев. Но, похоже, ОП нуждается в большей помощи.

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;
5 голосов
/ 10 августа 2011

Сначала измерьте текст, используя DT_CALCRECT.Передайте DT_WORDBREAK, чтобы указать, что перенос слов включен.Это позволит вам найти необходимую высоту для вашего текста.Затем вы можете в своем коде рассчитать вертикальное смещение, которое дает вам вертикально центрированный текст, и нарисовать с этим смещением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...