Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Печать повернутого текста

01.01.2007
procedure AngleTextOut(CV: TCanvas; const sText: string; x, y, angle: integer);
var
 
LogFont: TLogFont;
 
SaveFont: TFont;
begin
 
SaveFont := TFont.Create;
 
SaveFont.Assign(CV.Font);
 
GetObject(SaveFont.Handle, sizeof(TLogFont), @LogFont);
 
with LogFont do
   
begin
      lfEscapement
:= angle * 10;
      lfPitchAndFamily
:= FIXED_PITCH or FF_DONTCARE;
   
end; {with}
  CV
.Font.Handle := CreateFontIndirect(LogFont);
 
SetBkMode(CV.Handle, TRANSPARENT);
  CV
.TextOut(x, y, sText);
  CV
.Font.Assign(SaveFont);
 
SaveFont.Free;
end;

procedure TextOutVertical(var bitmap: TBitmap; x, y: Integer; s: string);
var b1, b2: TBitmap;
  i
, j: Integer;
begin
 
with bitmap.Canvas do
   
begin
      b1
:= TBitmap.Create;
      b1
.Canvas.Font := lpYhFont;
      b1
.Width := TextWidth(s) + 1;
      b1
.Height := TextHeight(s) + 1;
      b1
.Canvas.TextOut(1, 1, s);
      b2
:= TPackedBitmap.Create;
      b2
.Width := TextHeight(s);
      b2
.Height := TextWidth(s);
     
for i := 0 to b1.Width - 1 do
       
for j := 0 to b1.Height do
          b2
.Canvas.Pixels[j, b2.Height + 1 - i] := b1.Canvas.Pixels[i, j];
     
Draw(x, y, b2);
      b1
.Free;
      b2
.Free;
   
end
end;

Некоторое время я делал так: я создавал шрифт, выбирал его в DC...

function CreateMyFont(degree: Integer): HFONT;
begin
 
CreateMyFont := CreateFont(
   
-30, 0, degree, 0, 0,
   
0, 0, 0, 1, OUT_TT_PRECIS,
   
0, 0, 0, szFontName);
end;

....и затем использовал любую функцию рисования для вывода текста.


Приведенное выше решение(1)очень медленно, так как требует рисования текста и содержит, на мой взгляд, неэффективный метод вращения.Попробуйте взамен это:

procedure TForm1.TextUp(aRect: tRect; aTxt: string);
var LFont: TLogFont;
  hOldFont
, hNewFont: HFont;
begin
 
GetObject(Canvas.Font.Handle, SizeOf(LFont), Addr(LFont));
 
LFont.lfEscapement := 900;
  hNewFont
:= CreateFontIndirect(LFont);
  hOldFont
:= SelectObject(Canvas.Handle, hNewFont);
 
Canvas.TextOut(aRect.Left + 2, aRect.Top, aTxt);
  hNewFont
:= SelectObject(Canvas.Handle, hOldFont);
 
DeleteObject(hNewFont);
end;

Взято из Советов по Delphi от Валентина Озерова

Сборник Kuliba