Как вывести текст под углом
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 градуса и затем перерисовывает форму. Мы используем отрицательное приращение, чтобы "колесо" вращалось по часовой стрелке.
Комментарии