![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetTextExtentPoint32 при [fsItalic]
Krants © (2007-08-31 16:15:00)есть функция(
GetTextExtentPoint32) выдающая размеры форматированного текста,
function TForm1.GetPWithStr(str:string; const ufont:TFont): integer;
var
DC : HDC;
size : TSize;
SaveFont : HFONT;
begin
DC:=GetDC(0);
SaveFont:=SelectObject(DC,uFont.Handle);
GetTextExtentPoint32(DC,PChar(str),Length(str),size);
SelectObject(DC,SaveFont);
ReleaseDC(0,DC);
result:=size.cx;
end;
(исходный код есть в StdCtrls)
решил проверить работу данной функции:
var
s:ShortString;
i:integer;
begin
randomize;
s:='hfghfhawetjytjkli;pADFd,nmfgfyutyut';
s[0]:=Char(random(20));
label1.Caption:=s;
label1.Repaint;
memo1.Text:=memo1.Text//+s
+' '+inttostr(Label1.Width)
+' '+inttostr(GetPWithStr(s,label1.Font))
+' '+inttostr(Label1.Width-GetPWithStr(s,label1.Font))
+#13#10;
refresh;
canvas.MoveTo(Label1.Left,Label1.Top+20);
canvas.LineTo(Label1.Left+GetPWithStr(s,label1.Font),Label1.Top+20);
хорошо работает при различных шрифтах и высоте теста, но вот при изменении стиля на fsBold или fsItalic имеются небольшие различия. можете проверить, выше представлен весь код.
помогите плз разобраться в чем может быть причина такой вот некорректности функции)
Krants (2007-08-31 16:57:00) [1]
> Dib@zol © (31.08.07 16:36) [1]
> Возможно, проблема в том, что ты проставляешь италик уже
> после измерения. У меня всё точно.
италик ставлю заранее, и в десигне и в р-тайме... хотя заметил что эта неточность бевает не для всех шрифтов.
FontDialog1.Font:=Label1.Font;
if not FontDialog1.Execute then exit;
caption:=FontDialog1.Font.Name;
Label1.Font:=FontDialog1.Font;
Полазил на делфикиндом, там не однократно рассматривался, этот вопрос, но конкретного и нормально работающего решения не имеется(
Хотя странно, функцияGetTextExtentPoint32также исп. в ТLabel, и выводит с пом. ее полный текст.
Dib@zol (2007-08-31 16:36:00) [2]Возможно, проблема в том, что ты проставляешь италик уже после измерения. У меня всё точно.