Карта сайтаСсылкиКонтакты

Как вывести текст под углом

PDF Печать
Статьи

Чтобы создать повернутый (под углом) текст нам не понадобятся дополнительные компоненты. Delphi и Windows API обеспечивают нас функциями для обеспечения этих целей.

Эта функция будет использовать текущий шрифт Canvas.Font холста. Если Вы должны изменить шрифт, делайте это перед применением этой функции.


procedure AngleTextOut(
    ACanvas: TCanvas; Angle, X, Y: Integer; Text: string);
var
  NewFontHandle,
  OldFontHandle: hFont;
  LogRec       : TLogFont;
begin
  GetObject(ACanvas.Font.Handle, SizeOf(LogRec), Addr(LogRec));
  LogRec.lfEscapement := Angle * 10;
  LogRec.lfOrientation := LogRec.lfEscapement;
  NewFontHandle := CreateFontIndirect(LogRec);
  OldFontHandle := SelectObject(ACanvas.Handle, NewFontHandle);
  ACanvas.TextOut(X, Y, Text);
  NewFontHandle := SelectObject(ACanvas.Handle, OldFontHandle);
  DeleteObject(NewFontHandle);
end;

Примечание: Эта процедура будет работать только со шрифтами, которые поддерживают вращение, типа шрифтов True Type. Если Вы используете процедуру с растровыми шрифтами, подобно MS Sans Serif, текст не будет повернут.

Есть подобная процедура DrawAngledText, в Code Snippets Database.

Пример

В этом примере мы отобразим некоторый повернутый жирный текст 14pt Comic Sans MS как говорится "в колесе". Мы заставим "колесо" вращаться, используя таймер, чтобы корректировать угол поворота текста.

Создайте новое приложение VCL. Добавьте поле по имени fAngle в секцию private, как показано ниже:


private
    { Private declarations }
    fAngle: Integer;

Теперь создайте обработчик события OnPaint для формы. Завершите обработчик события следующим образом:


procedure TForm1.FormPaint(Sender: TObject);
const
  cText = 'Hello World!'; // отображаемый текст
  cPadding = 8; // расстояние между текстом и краем "колеса"
  cOffset = 20; // смещение "колеса" от верхнего левого угла клиентской области
var
  Radius: Integer;  // радиус "колеса"
  I: Integer;       // управление циклом
begin
  // устанавливаем шрифт
  Canvas.Font.Name := 'Comic Sans MS';
  Canvas.Font.Size := 14;
  Canvas.Font.Style := [fsBold];
  // вычисляем радиус "колеса"
  Radius := Canvas.TextWidth(cText) + cPadding;
  // рисуем текст
  for I := 0 to 3 do
    AngleTextOut(
      Canvas, fAngle + I * 90, Radius + cOffset,
          Radius + cOffset, cText
    );
  // рисуем "обод колеса"
  Canvas.Brush.Style := bsClear;
  Canvas.Pen.Width := 2;
  Canvas.Ellipse(cOffset, cOffset, 2 * Radius + cOffset,
      2 * Radius + cOffset);
end;

Каждый раз, когда перерисовывается форма, мы рисуем текст четыре раза: каждую часть текста повернутую на 90 градусов от предыдущей. И наконец, мы рисуем круг, чтобы представить "обод колеса".

Все, что остается, это обновлять угол, под которым будет выводиться текст, изменяя fAngle. Поместите TTimer на форму, установите его свойство Interval в 250 и добавьте следующий обработчик события OnTimer.


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Dec(fAngle, 2);
  if fAngle = -90 then
    fAngle := 0;
  Invalidate;
end;

Этот обработчик события просто изменяет fAngle на 2 градуса и затем перерисовывает форму. Мы используем отрицательное приращение, чтобы "колесо" вращалось по часовой стрелке.


 

Комментарии   

 
0 #1 Василий 07.10.2014 16:04
Спасибо большое за пример!
Цитировать
 

Добавить комментарий


Защитный код
Обновить