Присваиваем его дескриптор шрифту канвы
procedure TForm1.FormPaint(Sender: TObject);
var X: Integer; LF: TLogFont; Fnt: HFont; const Text = 'Лучшая в мире система программирования'; begin // Определяем параметры нового шрифта
FillChar(LF, SizeOf(LF), 0);
with LF do
begin lfHeight := 20; lfWeight := fw_Normal; lfUnderline := 1; lfEscapement := 450; StrPCopy(lfFaceName, 'Courier New Cyr');
end; with Form1.Canvas do
begin // Создаем шрифт
Fnt := CreateFontIndirect(LF);
// Присваиваем его дескриптор шрифту канвы
Font.Handle := Fnt; // Выводим текст под углом +45 градусов
TextOut(0, 300, Text);
X := TextWidth(Text);
DeleteObject(Fnt);
// Удаляем ненужный шрифт
// Изменяем параметры шрифта
with LF do
begin lfHeight := 90; lfEscapement := -900; lfWeight := fw_Heavy; StrPCopy(LF.lfFaceName, 'Arial Cyr');
end; Fnt := CreateFontIndirect(LF);
// Создаем новый шрифт Font.Handle := Fnt; Font.Color := clRed; // Выводим с наклоном -90 градусов
TextOut(X-10, 10, 'Delphi 5');
DeleteObject(Fnt);
// Удаляем ненужный шрифт end; end;
Параметр Format функции DrawText может содержать один или несколько флагов (табл. 2.)
Таблица 2. Возможные значения параметра Format функции DrawText
dt_Bottom | Текст прижимается к нижней части области Rect |
dt_CalcRect | Разрешает динамически изменять размеры области Rect |
dt_Center | Текст центрируется по горизонтали |
dt_EditControl | Функция дублирует свойства отображения многострочного тестового редактора. В частности, таким же способом вычисляется средняя ширина символа и не показывается частично видимая последняя строка |
dt_ExpandTabs | Символы табуляции заменяются пробелами |
dt_ExternalLeading | В высоту строки включается высота межстрочного интервала |
dt_Left | Текст прижимается к левой части области Rect |
dt_NoClip | Текст не отсекается границами Rect |
dt_NoPrefix | Символы & не заменяются подчеркиванием |
dt_Right | Текст прижимается к правой части области Rect |
dt_SingleLine | Весь текст выводится единственной строкой, символы EOLN игнорируются |
dt_TabsStop | Символы табуляции не заменяются пробелами |
dt_Top | Текст прижимается к верхней части области Rect |
dt_VCenter | Текст центрируется по вертикали |
dt_WordBreak | Разрешает переход на новую строку при достижении правой границы Rect; разрыв строки — на границе слова; символы EOLN также переводят вывод на следующую строку |
Если установлен флаг dt_CalcRect, функция изменяет высоту и ширину прямоугольника таким образом, чтобы вывести весь текст. Если выводится несколько строк, ширина вывода не меняется. Функция возвращает истинную высоту прямоугольника вывода.
Параметр Options функции ExtTextOut может быть комбинацией следующих значений:
eto_Clipped — текст будет отсекаться границами Rect;
eto_Gliph_Index — блокирует обработку языковым драйвером;
eto_Opaque — фон перерисовывается заново;
eto_RTLReading — вывод для чтения справа налево.
При выводе текста стандартными методами TCanvas всегда заново прорисовывается фон символов (цвет фона возвращает функция GetBkColor). Если цвет фона символов отличается от фона канвы, вывод сопровождается неприятными побочными эффектами. Если в примере из листинга 6 для формы оставить стандартный цвет clFaceBtn, окно вывода будет таким, как на рис. 3.

Рис. 3. Эффект прорисовки фона символов
Конечно, с помощью функции SetBkColor можно установить, чтобы цвет формы совпадал с цветом канвы, однако это не всегда возможно. Для примера на рис. 4. показан экран, который традиционно создают многие программы установки Setup.exe. Фон на таком экране не остается постоянным, а плавно переходит от интенсивного синего к черному. Ясно, что установить переменный цвет функцией SetBkColor невозможно. Более того, заглавные надписи программ Setup.exe также традиционно выводятся утолщенным наклонным шрифтом Times New Roman белыми буквами с черной тенью. Реализовать подобный эффект достаточно просто. Так, нужно вообще отказаться от прорисовки фона, установив с помощью функции SetBkMode режим Transparent, и вывести надпись дважды: первый раз черным цветом, а второй — белым, сместив вторую надпись немного влево и вверх относительно первой. Листинг 7 иллюстрирует сказанное (Setup.dpr)