Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

TLogFont (вывод текста по 90 градусов)   Найти похожие ветки 

 
DelphiLexx ©   (2005-11-07 16:40) [0]

Перед мной встала следующая задача:
Есть прямоугольник (в вертикальном расположении) известна его ширина - width и высота - height. Есть текст, хрянящийся в переменной fRawName. Необходимо вывести этот текст в этот прямоугольник см.рис. http://www.rsdn.ru:80/File/26841/picture.bmp
Как все это реализовать программно желательно в виде процедуры (с параметрами height: integer; width: integer; fRawName: text)?


 
Джо ©   (2005-11-07 16:48) [1]

Предлагаю такой подход. Вывести перевернутую надпись на канву метафайла (TMetafileCanvas). Для разворота шрифта можно использовать примерно такую функцию:

procedure RotateFont (AFont: TFont; Angle: Integer);
var
 LogFont : TLogFont;
begin
 GetObject(AFont.Handle, SizeOf(TLogFont), @LogFont);
 LogFont.lfEscapement := Angle*10;
 AFont.Handle := CreateFontIndirect(LogFont);
end;

Затем этот метафайл вывести с растяжением/сжатием в целевой прямоугольник, используя StretchDraw. Масштабироваться будет векторная картинка, поэтому "артефактов" сжатия/растяжения видно не будет.


 
DelphiLexx ©   (2005-11-07 17:17) [2]


>  Вывести перевернутую надпись на канву метафайла (TMetafileCanvas).
>  

А на PaintBox"е это реально сделать, если да, то как.


 
Джо ©   (2005-11-07 17:37) [3]

Вся возня с метафайлом нужна только для того, чтобы "вписывать" строку в заданный прямоугольник. Если достаточно просто вывести развернутый текст начиная с определенной позиции, то не нужно ничего усложнять, достаточно RotateFont. Т.е, процедура вывода надписи на канву с заданным направлением текста в указанную точку будет выглядеть как-то так:

type
 // направление надписи: сверху-вниз или снизу-вверх
 TVerticalDirection = (vdUpBottom,vdBottomUp);

procedure DrawTextVertically (X,Y: Integer; AText: string; ACanvas: TCanvas;
 Direction: TVerticalDirection);
var
 Angle: Integer;
 SavedDC: HDC;
begin
 // сохраняем состояние канвы
 SavedDC := SaveDC (ACanvas.Handle);
 try
   Angle := 90;
   if Direction = vdUpBottom then
     Angle := -Angle;
   // описание этой процедуры я привел выше
   RotateFont(ACanvas.Font,Angle);
   ACanvas.TextOut(X,Y,AText);
 finally
   // восстановим предыдущее состояние канвы, т.е, до разворота шрифта
   RestoreDC(ACanvas.Handle,SavedDC);
 end;
end;

Пример вывода на TImage:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Image1.Canvas.Font.Name := "Tahoma";
 Image1.Canvas.Font.Size := 16;
 DrawTextVertically(50,50,"Брюква",Image1.Canvas,vdUpBottom);
end;


 
Джо ©   (2005-11-07 17:40) [4]


> [2] DelphiLexx ©   (07.11.05 17:17)
> А на PaintBox"е это реально сделать, если да, то как.

Отчего же нереально? Реально. Нужно всего-лишь представлять принцип работы с этим компонентом.


 
DelphiLexx ©   (2005-11-07 17:43) [5]


> Вся возня с метафайлом нужна только для того, чтобы "вписывать"
> строку в заданный прямоугольник

Мне как раз-то и нужно вписать в заданный прямоугольник. В качестве прямоугольника выступает TPanel на которой лежит TPaintBox.Align := alClient. А у PaintBox"a TMetafileCanvas нету, да и входные параметры
TMetafileCanvas.Create не очень меня устраивают. Так как быть.


 
DelphiLexx ©   (2005-11-07 17:44) [6]


> Отчего же нереально? Реально. Нужно всего-лишь представлять
> принцип работы с этим компонентом.

Програмно не могли бы показать?



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.065 c
14-1131963464
nbv
2005-11-14 13:17
2005.12.04
Security Component


2-1132331602
Дева
2005-11-18 19:33
2005.12.04
Добавить строки в SQL


2-1132231417
md
2005-11-17 15:43
2005.12.04
узнать разницу между числами


2-1132349761
Юра Войтюк
2005-11-19 00:36
2005.12.04
Как проверить содержание ячейки...


6-1124781103
tomkat
2005-08-23 11:11
2005.12.04
Как в INDY SMTP вложить атач ?