Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Центрирование текста внутри прямоугольной области в Delphi

Delphi , Синтаксис , Текст и Строки

При разработке приложений на Delphi часто возникает необходимость отображения текста внутри определенной области, при этом текст должен быть центрирован как по вертикали, так и по горизонтали. Кроме того, если текст не помещается в одну строку, он должен быть перенесен на несколько строк, а если и это не помогает, к концу текста должен быть добавлен символ многоточия.

Проблема

В Delphi задача центрирования текста в прямоугольной области (TRect) может показаться сложной из-за ограничений функции Windows.DrawText(). Функция позволяет центрировать текст, разбивать его на несколько строк и добавлять многоточие, но при этом вертикальное центрирование и многострочный вывод несовместимы.

Решение

Для решения этой задачи можно использовать функцию DrawText() с определенными флагами, которые позволяют управлять выводом текста. Важно использовать флаги DT_CENTER, DT_WORDBREAK, DT_END_ELLIPSIS, DT_EDITCONTROL для центрирования, переноса слов, добавления многоточия и отображения только полных строк соответственно.

Пример кода

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 = 'Это очень длинный текст для тестирования функции рисования текста.';
var
  R: TRect;
begin
  SetRect(R, 100, 100, 200, 140);
  Canvas.Rectangle(R);
  InflateRect(R, -1, -1);
  DrawTextCentered(Canvas, R, S);
  Caption := Format('%d символов нарисовано', [DrawTextCentered(Canvas, R, S)]);
end;

При использовании этого кода важно понимать, что функция DrawTextCentered сначала вычисляет размеры текста для центрирования по вертикали, а затем рисует текст с учетом заданных флагов.

Альтернативные варианты

В качестве альтернативы можно использовать компонент TLabel, который уже имеет необходимые функции для центрирования текста. Однако, если у вас уже есть холст для рисования, использование TLabel может быть нецелесообразно.

Заключение

Центрирование текста в прямоугольной области в Delphi требует внимания к деталям, но с правильным применением функции DrawText() и соответствующих флагов можно добиться желаемого результата. Приведенный выше код является рабочим примером, который можно адаптировать под свои нужды.

Создано по материалам из источника по ссылке.

Центрирование текста внутри прямоугольной области с переносом на несколько строк и добавлением многоточия в случае необходимости в среде разработки Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Текст и Строки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 17:03:59/0.0032289028167725/0