![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TLogFont (вывод текста по 90 градусов)
DelphiLexx © (2005-11-07 16:40:00)Перед мной встала следующая задача:
Есть прямоугольник (в вертикальном расположении) известна его ширина - width и высота - height. Есть текст, хрянящийся в переменной fRawName. Необходимо вывести этот текст в этот прямоугольник см.рис. http://www.rsdn.ru:80/File/26841/picture.bmp
Как все это реализовать программно желательно в виде процедуры (с параметрами height: integer; width: integer; fRawName: text)?
DelphiLexx (2005-11-07 17:44:00) [1]
> Отчего же нереально? Реально. Нужно всего-лишь представлять
> принцип работы с этим компонентом.
Програмно не могли бы показать?
DelphiLexx (2005-11-07 17:43:00) [2]
> Вся возня с метафайлом нужна только для того, чтобы "вписывать"
> строку в заданный прямоугольник
Мне как раз-то и нужно вписать в заданный прямоугольник. В качестве прямоугольника выступает TPanel на которой лежит TPaintBox.Align := alClient. А у PaintBox'a TMetafileCanvas нету, да и входные параметры
TMetafileCanvas.Create не очень меня устраивают. Так как быть.
Джо (2005-11-07 17:40:00) [3]
> [2] DelphiLexx © (07.11.05 17:17)
> А на PaintBox'е это реально сделать, если да, то как.
Отчего же нереально? Реально. Нужно всего-лишь представлять принцип работы с этим компонентом.
Джо (2005-11-07 17:37:00) [4]Вся возня с метафайлом нужна только для того, чтобы "вписывать" строку в заданный прямоугольник. Если достаточно просто вывести развернутый текст начиная с определенной позиции, то не нужно ничего усложнять, достаточно 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;
DelphiLexx (2005-11-07 17:17:00) [5]
> Вывести перевернутую надпись на канву метафайла (TMetafileCanvas).
>
А на PaintBox'е это реально сделать, если да, то как.
Джо (2005-11-07 16:48:00) [6]Предлагаю такой подход. Вывести перевернутую надпись на канву метафайла (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. Масштабироваться будет векторная картинка, поэтому "артефактов" сжатия/растяжения видно не будет.