![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В Label обрезается текст при стиле Italic [D7, WinXP]
Дмитрий_177 © (2006-04-17 23:38:00)При некоторых шрифтах например "Arial Black" при стиле Italic в Label часть текста (справа) обрезается... AutoSize не помогает... Как с этим бороться?
GrayFace (2006-04-25 09:32:00) [1]А ты попробуй сменить цвет фона Label1 - наверное, с одной стороны обрезается, а с другой остается пустое место. При отрисовке надо делать TextOut(x+First.abcfA, y);
Дмитрий_177 (2006-04-23 20:46:00) [2]Попробовал сейчас хотябы просто во втором Label2 отобразить ширину текста из Label1: Arial Black, fsItalic (последний символ обрезается)
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
First, Last: ABCFloat;
begin
s := Label1.Caption;
Canvas.Font := Label1.Font;
GetCharABCWidthsFloat(Canvas.Handle, ord(s[1]), ord(s[1]), First);
GetCharABCWidthsFloat(Canvas.Handle, ord(s[length(s)]), ord(s[length(s)]), Last);
Label2.Caption := FloatToStr(Canvas.TextWidth(Label1.Caption) - First.abcfA - Last.abcfC);
end;
Всеравно в Label2 отображается такая же ширина что и Label1 с AutoSize...
GrayFAce (2006-04-22 09:01:00) [3]Дмитрий_177 (19.04.06 02:52) [5]
> GetCharABCWidthsFloat(Label1.Canvas.Handle, 1, Length(Label1.Caption), F);
Сам подумай - какой смысл подавать Length(Label1.Caption), не подавая самого Label1.Caption? На самом деле параметры FirstChar и LastChar - это коды символов. А буфер должен содержать LastChar-FirstChar+1 структур ABCFloat. Так что пиши примерно так:
var
First, Last: ABCFloat; s:string;
begin
s:=Label1.Caption;
Canvas.Font:=Label1.Font;
GetCharABCWidthsFloat(Canvas.Handle, ord(s[1]), ord(s[1]), First);
GetCharABCWidthsFloat(Canvas.Handle, ord(s[length(s)]), ord(s[length(s)]), Last);
Result:=Canvas.TextWidth(Label1.Caption)-First.abcfA-Last.abcfC;
> А еще от чего A и C отнимать я что-то не понял?
От TextWidth(Label1.Caption).
> проходил мимо (19.04.06 12:35) [6]
> Передавать-то надо указатель на структуру ABCFloat.
Там стоит const ABCFloatStructs. Это значит передача и так идет по ссылке. Кстати, должен стоять var, иначе нелогично.
проходил мимо (2006-04-19 12:35:00) [4]Передавать-то надо указатель на структуру ABCFloat.
Дмитрий_177 (2006-04-19 02:52:00) [5]А как GetCharABCWidthsFloat пользоваться? У меня так AV выскакивает
var
F: ABCFloat;
begin
GetCharABCWidthsFloat(Label1.Canvas.Handle, 1, Length(Label1.Caption), F);
Мне бы определять ширину текста в пикселях... А еще от чего A и C отнимать я что-то не понял?
GrayFace (2006-04-18 09:47:00) [6]Не использовать Autosize.
А чтобы точно вычислить размер надо использовать GetCharABCWidthsFloat. Потом отнять левый отступ (A) первого символа и правый отступ (C) последнего.
kilkennyCat (2006-04-18 09:39:00) [7]
> Юрий Иванов (18.04.06 09:37) [2]
а если в ентой лабели используется перенос строк?
Юрий Иванов (2006-04-18 09:37:00) [8]Проще всего добавить в конец текста Caption один пробел справа.
TUser (2006-04-18 09:16:00) [9]Последняя буква немного режется. Ставь Label1.Width := Label1.Width + Label1.Font.Size div 2; или что-то подобное.