![](/logo_grey.gif)
Последние записи
- Как в Python+Selenium webdriver открыть новую вкладку в уже открытом браузере?
- Lazarus, проверка существования строки таблице
- BASM и record, обращение к полям записи
- Web PHP Framework Symfony
- Относительный путь для вывода картинки на html странице
- Массовое открытие гиперссылок в браузере
- Скопировать значение строки из таблицы в textarea
- Рамки для страниц отчетов
- Вывод StdOut консоли в TMemo
- Чтение из файла большого размера (нехватка памяти)
![](http://programmersclub.ru/slurm3.jpg)
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
![](http://programmersclub.ru/katajpg.jpg)
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
2nd
Июн
Вывод многострочного текста BitMap
Posted by obzor under Delphi
Стоит задача выводить на произвольной ширины битмапе текст. Текст может быть длиннее, чем ширина битмапа. Нужен алгоритм, который выводит текст, разбивая его на строки (если в одну строку не влезает) и центруя.
В классе TCanvas есть метод TextRect, у которого есть параметр TextFormat. Это обертка над функцией DrawTextEx.
TTextFormats = (tfBottom, tfCalcRect, tfCenter, tfEditControl, tfEndEllipsis,
tfPathEllipsis, tfExpandTabs, tfExternalLeading, tfLeft, tfModifyString,
tfNoClip, tfNoPrefix, tfRight, tfRtlReading, tfSingleLine, tfTop,
tfVerticalCenter, tfWordBreak, tfHidePrefix, tfNoFullWidthCharBreak,
tfPrefixOnly, tfTabStop, tfWordEllipsis, tfComposited);
Я тут набросал процедуру, выводящую текст в рамку с выравниванием по центру. Рисует текст на форме, в событии OnPaint, мнгновенно. TDateTime показывает 0.000-0.015. Попробуйте ее.
procedure TForm1.DrawRectEx(const Canvas: TCanvas; const Rect: TRect;
Text: string);
var
i, oldWidth, Width: Integer;
PoleWidth, PoleWidth2: Integer;
l, t: Integer;
CharHeight: Integer;
s, NewS, TextSpace: string;
begin
i := 1;
s := '';
TextSpace := Text + ' '; // Пробел в коне для правильной работы
// цикла while
CharHeight := Canvas.TextHeight('V'); // Высота символов
oldWidth := 0;
PoleWidth := Rect.Left + Rect.Right; // Длина всего поля для рисования
PoleWidth2 := PoleWidth div 2; // Половина длины поля
t := Rect.Top; // Высота, на которой выводится строка
while PosEx(' ', TextSpace, i) <> 0 do
begin
NewS := Copy(TextSpace, i, PosEx(' ', TextSpace, i) - i + 1);
Width := Canvas.TextWidth(NewS);
if Width + oldWidth < PoleWidth then
begin
s := s + NewS;
Inc(oldWidth, Width);
end
else
begin
if oldWidth > 0 then
begin
// Рисование буфера и очистка его
l := PoleWidth2 - oldWidth div 2 + Rect.Left;
Canvas.TextOut(l, t, s);
s := NewS;
oldWidth := Width;
end
else
begin
// Рисуем одно слово
oldWidth := 0;
s := '';
l := PoleWidth2 - Width div 2 + Rect.Left;
Canvas.TextOut(l, t, NewS);
end;
Inc(t, CharHeight);
if t + CharHeight > Rect.Bottom then
begin
oldWidth := 0;
Break;
end;
end;
// Следующее слово
i := PosEx(' ', TextSpace, i) + 1;
end;
// Вывод остатков текста
if oldWidth > 0 then
begin
l := PoleWidth2 - oldWidth div 2 + Rect.Left;
Canvas.TextOut(l, t, s);
end;
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
![пеллетные котлы](http://programmersclub.ru/respective.jpg)
пеллетные котлы
![пеллетный котел](http://programmersclub.ru/emtas.jpg)
Пеллетный котел Emtas
![форум программистов](http://programmersclub.ru/banf336х280.gif)
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)