Вопросы и Ответы
11. Можно ли в Delphi вывести строку повернутую под любым углом?
Стандартные средства Delphi не позволяют использовать вывод строки текста под произвольным углом, так как в модуле Graphics поля отвечающие за угол поворота строки принудительно обнуляются. Это приводит к необходимости использовать средства API.
Наверное, лучший способ - это исправить модуль Graphics и разрешить использование произвольного угла поворота во всех объектах сразу. Но такой путь потребует перекомпиляции нескольких модулей и приведет к некорректной работе ваших кодов с другими версиями Delphi. Другой способ - написать процедуру вывода под углом и пользоваться ею при необходимости.
Чтобы не нарушать существующий порядок вывода строки на экран, будем следовать следующим правилам:
Пример:
............
PROCEDURE
FreeTextOut(Canvas: TCanvas; X, Y, A: Integer; S: String); OldFont,
NewFont: hFont; BEGIN
{Создаем описание для нового шрифта.} {Устанавливаем текущие для объекта Font
параметры, кроме углов.} else
lfWeight := FW_NORMAL; lfItalic
:= Byte(fsItalic in Font.Style); end; END; ............ Созданную процедуру лучше
всего оформить в виде модуля. Процедура работает аналогично
процедуре TextOut, единственное - ей необходимо явно
передавать контекст отображения:
VAR
lf : TLogFont;
WITH lf, Canvas DO BEGIN
lfHeight := Font.Height;
lfWidth := 0;
lfEscapement := A*10; {Угол наклона строки
в 0.1 градуса}
lfOrientation := A*10; {Угол
наклона символов в строке в 0.1 градуса}
if fsBold in Font.Style then lfWeight := FW_BOLD
lfUnderline := Byte(fsUnderline in Font.Style);
lfStrikeOut := Byte(fsStrikeOut in Font.Style);
lfCharSet := DEFAULT_CHARSET;
StrPCopy(lfFaceName, Font.Name);
lfQuality := DEFAULT_QUALITY;
lfOutPrecision := OUT_DEFAULT_PRECIS;
lfClipPrecision := CLIP_DEFAULT_PRECIS;
lfPitchAndFamily := DEFAULT_PITCH;
{Создаем новый
шрифт}
NewFont := CreateFontIndirect(lf);
{Выбираем новый шрифт в контекст
отображения}
OldFont := SelectObject(Canvas.Handle, NewFont);
{Выводим текст на экран ПОД
ЗАДАННЫМ УГЛОМ}
Canvas.TextOut(X, Y, S);
{Восстанавливаем в контексте
старый шрифт}
SelectObject(Canvas.Handle, OldFont);
{Удаляем новый шрифт}
DeleteObject(NewFont);
procedure FreeTextOut(Canvas: TCanvas; X, Y, A: Integer; S: String);
где ............ FreeTextOut(Canvas, 100, 100, 45,
'Пример вывода под углом'); ............ P.S. Поворачивать можно только
векторные и масштабируемые (True Type) шрифты. А шрифт
System, используемый Delphi по умолчанию -
растровый!
...предыдущая страница следующая...
оглавление