![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вертикальный TLablel [D7]
Tima © (2009-08-05 17:38:00)Каким образом выводить текст вертикально?
Точнее под углом 90 градусов.
PZ (2009-08-07 17:29:00) [1]> [21] Юрий Зотов © (07.08.09 16:28)
Спасибо, ясно
Юрий Зотов (2009-08-07 16:28:00) [2]> PZ (07.08.09 14:41) [20]
Можно и ничего не добавлять - есть Инспектор Объектов.
PZ (2009-08-07 14:41:00) [3]> [16] Юрий Зотов © (07.08.09 10:13)
Действительно 2.
Добавил две строчки:
Font.CharSet := DEFAULT_CHARSET;
Font.Name := 'Times New Roman';
и текст повернулся куда надо.
Спасибо
Юрий Зотов (2009-08-07 13:18:00) [4]> Tima (07.08.09 13:09) [18]
type
TMyPanel = class(TPanel)
protected
procedure Paint; override;
end;
procedure TMyPanel.Paint;
begin
inherited;
// А здесь можно рисовать хоть малиновых слонов.
end;
Tima (2009-08-07 13:09:00) [5]
> Ошибочка вкралась, невнимательно посмотрел, что возвращает
> GetObject. Вот так лучше будет:
>
> procedure TForm1.FormPaint(Sender: TObject);
> var
> LogFont: TLogFont;
> NewFont: HFont;
> begin
> GetObject(Font.Handle, SizeOf(TLogFont), @LogFont);
> LogFont.lfEscapement := 900; // Угол в десятых долях градуса
> NewFont := CreateFontIndirect(LogFont);
> SelectObject(Canvas.Handle, NewFont);
> Canvas.TextOut(50, 50, 'Привет');
> SelectObject(Canvas.Handle, Font.Handle);
> DeleteObject(NewFont)
> end;
Этот пример конечно же работает, но как мне заставить таким образом рисовать на панели, которая в свою очередь лежит на закладке (TTabSheet)?
Юрий Зотов (2009-08-07 10:29:00) [6]Выдержка из MSDN:
lfEscapement
Specifies the angle, in tenths of degrees, between the escapement vector and the x-axis of the device. The escapement vector is parallel to the base line of a row of text.
Windows NT/2000/XP:
When the graphics mode is set to GM_ADVANCED, you can specify the escapement angle of the string independently of the orientation angle of the string's characters.
When the graphics mode is set to GM_COMPATIBLE, lfEscapement specifies both the escapement and orientation. You should set lfEscapement and lfOrientation to the same value.
Windows 95/98/Me:
The lfEscapement member specifies both the escapement and orientation. You should set lfEscapement and lfOrientation to the same value.
lfOrientation
Specifies the angle, in tenths of degrees, between each character's base line and the x-axis of the device.
================
Если верить той же MSDN, то по умолчанию в XP стоит GM_COMPATIBLE - значит, lfEscapement и lfOrientation надо выставлять одинаковыми. Тем не менее, у меня работает и без этого.
Юрий Зотов (2009-08-07 10:13:00) [7]Пример может не работать по 2-м причинам:
1. Форме не назначен обработчик OnPaint.
2. Форме не выставлен TrueType шрифт.
И то, и другое - невнимательность экспериментатора. Мы с XP в ней не виноваты, чес-слово.
PZ (2009-08-07 07:18:00) [8]> [8] Юрий Зотов © (05.08.09 18:48)
А пример-то не работает.
Нашел аналогичный пример
http://www.zoonman.com/library/rotatetext.htm
так там примечание : "под WinXP почему-то не работает".
Есть ли этому объяснение?
brother (2009-08-07 04:39:00) [9]> Через букву добовлять #13
#13#10
AIK (2009-08-06 12:54:00) [10]Через букву добовлять #13
Label1.Caption:='a'+#13+'b'+#13+'c';
)))
Юрий Зотов (2009-08-06 07:56:00) [11]> Rouse_ © (05.08.09 23:45) [11]
> лучше возвращать на место то, что выдал первоначальный SelectObject
Э-э-э... вообще-то я в курсе стандартов.... только в нашем случае заранееизвестно, что же выдаст первоначальный SelectObject:
OldFont := SelectObject(Canvas.Handle, NewFont);
Caption := Format('%x %x', [Font.Handle, OldFont]);
А раз так, то лишняя переменная ни к чему. Именно поэтому так и было написано.
Rouse_ (2009-08-05 23:45:00) [12]
> Юрий Зотов © (05.08.09 18:48) [8]
> Вот так лучше будет:
Ну на всякий случай лучше возвращать на место то, что выдал первоначальный SelectObject. Например:
OldFont := SelectObject(Canvas.Handle, NewFont);
Canvas.TextOut(50, 50, 'Привет');
DeleteObject(SelectObject(Canvas.Handle, OldFont));
Amoeba (2009-08-05 23:11:00) [13]
> Tima (05.08.09 17:38)
>
> Каким образом выводить текст вертикально?
> Точнее под углом 90 градусов.
Написать свой компонент или использовать готовый - их в сети вагон и маленькая тележка.
Kolan (2009-08-05 22:43:00) [14]Зачем писать текст вертикально, его не удобно читать :)
Юрий Зотов (2009-08-05 18:48:00) [15]Ошибочка вкралась, невнимательно посмотрел, что возвращает GetObject. Вот так лучше будет:
procedure TForm1.FormPaint(Sender: TObject);
var
LogFont: TLogFont;
NewFont: HFont;
begin
GetObject(Font.Handle, SizeOf(TLogFont), @LogFont);
LogFont.lfEscapement := 900; // Угол в десятых долях градуса
NewFont := CreateFontIndirect(LogFont);
SelectObject(Canvas.Handle, NewFont);
Canvas.TextOut(50, 50, 'Привет');
SelectObject(Canvas.Handle, Font.Handle);
DeleteObject(NewFont)
end;
Юрий Зотов (2009-08-05 18:28:00) [16]Естественно, это уже не TLabel.
А со стандартным TLabel - действительно никак. Он этого не умеет.
Юрий Зотов (2009-08-05 18:25:00) [17]Для шрифтов TrueType - можно:
procedure TForm1.FormPaint(Sender: TObject);
var
LogFont: TLogFont;
OldFont, NewFont: HFont;
begin
OldFont := GetObject(Font.Handle, SizeOf(TLogFont), @LogFont);
LogFont.lfEscapement := 900; // Угол в десятых долях градуса
NewFont := CreateFontIndirect(LogFont);
SelectObject(Canvas.Handle, NewFont);
Canvas.TextOut(50, 50, 'Привет!');
SelectObject(Canvas.Handle, OldFont);
DeleteObject(NewFont)
end;
MonoLife (2009-08-05 18:25:00) [18]не Tlabel, типа такого:
s:string='Text';
Var i, k: integer;
begin
k:=10;
for i:=1 to Length(s) do
begin
self.Canvas.TextOut(20,k,s[i]);
inc(k,15);
end;
end;
Palladin (2009-08-05 18:06:00) [19])) это будет гениально... аффтора зачетно уволят )
{RASkov} (2009-08-05 18:01:00) [20]кстати вертикально малой кровью можно и в Лабеле сделать например так:
В
е
р
т
и
к
а
л
ь
н
ы
й
т
е
к
с
т
!