View previous topic :: View next topic |
Author |
Message |
Parcan
Joined: 15 Dec 2004 Posts: 399 Location: Russian
|
(Separately) Posted: Tue Mar 15, 2005 20:19 Post subject: Высота шрифта в пикселах |
|
|
Я имею HFONT для выбранного шрифта, как получить высоту (да и ширину символа) этого шрифта в пикселах с помощью WinAPI?
Требуется для динамического создания окна STATIC под выбранный размер шрифта. |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Tue Mar 15, 2005 21:26 Post subject: |
|
|
Parcan
Размер зависит от символа. Можно использовать GetTextMetrics для получения характеристик шрифта как такового, либо GetTextExtentPoint32 (и соответствующее семейство функций) для получения размеров конкретной строки символов. В обоих случаях HFONT надо подключить к HDC, который будет использоваться в этих функциях в качестве параметра. |
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Wed Mar 16, 2005 03:47 Post subject: |
|
|
Parcan
Code: | ....
var
Sz:TSize;
....
GetTextExtentPoint32(GetDC(MyHandle),PChar(MyCaption),Length(MyCaption), Sz)
.... | Sz.x - ширина твоего текста
Sz.y - высота. И (IMHO) не нужно морочить одно место. .
Предварительно, ессно, известный HFONT нужно присвоить окну, на котором будет текст
Code: | SendMessage(MyHandle,wm_setfont,HFONT ,1); |
|
|
Back to top |
|
|
Parcan
Joined: 15 Dec 2004 Posts: 399 Location: Russian
|
(Separately) Posted: Wed Mar 16, 2005 18:27 Post subject: |
|
|
это получается мне надо создать все окна, установить в них текст, получить параметры, и наконец все свои окна ресайзить и показать?
я думал както попроще будет |
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Thu Mar 17, 2005 03:33 Post subject: |
|
|
Parcan
Гм... Ну если ты пишешь на API, то можно, в принципе и так - один хрен ты их создаешь (окна) в runtime (c VCL делфя эту всю работу за тебя делают). Можно и по другому (хоть на APIах, хоть на Делфях) - создать поверхность (можно окно, можно поверхность - DC, если юзаешь юнит Graphics, то можно и TCanvas обломаться, присвоив MyCanvas.Font.Handle:=HFONT), и выполнять все те-же функции с ней. В качестве примера (это, без обработки всяких искл. ситуевин, "с лету", но пахать должно)
Code: | function GetObjectSize(Fnt:HFont; aCaption:String; var aSize:TSize):boolean;
var
aCanvas:TCanvas;
begin
aCanvas:=TCanvas.Create;
try
aCanvas.Font.Handle:=Fnt;
aSize.X:=0;
aSize.Y:=0;
result:=GetTextExtentPoint32(GetDC(MyHandle),PChar,MyCaption),Length(MyCaption), aSize);
finally
aCanvas.Free;
end;
end; |
Если на АРЯХ, то вместо aCanvas - CreateCompatableDC но, я так думаю, ты с VCL вошкаешься, так что можно не гиммороиться с API |
|
Back to top |
|
|
Parcan
Joined: 15 Dec 2004 Posts: 399 Location: Russian
|
(Separately) Posted: Thu Mar 17, 2005 09:31 Post subject: |
|
|
SCHMaster
я делфи не люблю (синтаксис убивает) потому пишу на vc++6.0 только вот MFC (что-то типа вашего VCL) прилепить не смог потому мучаюсь с WinAPI, но всеравно спасибо общий подход понял |
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Fri Mar 18, 2005 03:10 Post subject: |
|
|
Parcan
Невочто |
|
Back to top |
|
|
Parcan
Joined: 15 Dec 2004 Posts: 399 Location: Russian
|
(Separately) Posted: Mon Mar 21, 2005 19:38 Post subject: |
|
|
SCHMaster
CaptainFlint
посмотрел я эти функции все они возвращают логические размеры, у меня дошло до смешного: создаю окно назначаю ему шрифт размером 12 получаю высоту 16, назначаю ему шрифт размером 20, получаю высоту 16, где я лажаю, писал примерно так:
HFONT hFont12 = ::CreateFont(12, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "MS Sans Serif");
HFONT hFont20 = ::CreateFont(20, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "MS Sans Serif");
HWND MyWnd = ::CreateWindow("STATIC", "", WS_CHILD, rcClient.left, rcClient.top, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, hwndParent, NULL, hInst, NULL);
SIZE MyTextSize12 = {0, 0};
::SendMessage(MyWnd, WM_SETFONT, (WPARAM)hFont12, MAKELPARAM(FALSE, 0));
::SendMessage(MyWnd, WM_SETTEXT, 0, (LPARAM)"hello");
::GetTextExtentPoint32(GetDC(MyWnd), "hello", strlen("hello"), &MyTextSize12);
SIZE MyTextSize20 = {0, 0};
::SendMessage(MyWnd, WM_SETFONT, (WPARAM)hFont20, MAKELPARAM(FALSE, 0));
::SendMessage(MyWnd, WM_SETTEXT, 0, (LPARAM)"hello");
::GetTextExtentPoint32(GetDC(MyWnd), "hello", strlen("hello"), &MyTextSize20);
получаю в обоих случаях
MyTextSize12.cx == 16
MyTextSize20.cx == 16
а шрифты то я назначал окну разные
где я неправ? |
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Tue Mar 22, 2005 03:28 Post subject: |
|
|
Parcan
Черт его знает. Я фонт создавал где-то так (на делфях, но я думаю поймешь)
procedure SetA_FONT(fDC:HDC;NAME:String;CLR:TColor;SIZE:Integer;Bold:Boolean);
var
LFont:LOGFONT;
TmpFont:HFont;
Brush :HBrush;
begin
with LFont do begin
lfHeight := -MulDiv(SIZE, GetDeviceCaps(fDC, LOGPIXELSY), 72);
// lfHeight := SIZE;
lfWidth := 0;
lfEscapement := 0;
if Bold then
lfWeight := FW_BOLD
else
lfWeight := 0;
lfItalic := 0;
lfUnderline := 0;
lfStrikeOut := 0;
lfCharSet := DEFAULT_CHARSET;
lfOutPrecision := OUT_DEFAULT_PRECIS;
lfClipPrecision := CLIP_DEFAULT_PRECIS;
lfQuality := PROOF_QUALITY;
lfPitchAndFamily := DEFAULT_PITCH or FF_DONTCARE;
StrPCopy(lfFaceName, NAME);
end;
TmpFont:=CreateFontIndirect(LFont);
SelectObject(TmpFont, Brush);
SelectObject(fDC, TmpFont); - присвоение шрифта. Попробуй таким образом.
SetTextColor(fDC, CLR);
SetBkMode (fDC, TRANSPARENT);
end; |
|
Back to top |
|
|
Sheridan
Joined: 01 Mar 2005 Posts: 129 Location: Пятигорск
|
|
Back to top |
|
|
Parcan
Joined: 15 Dec 2004 Posts: 399 Location: Russian
|
(Separately) Posted: Tue Mar 22, 2005 18:36 Post subject: |
|
|
SCHMaster
Sheridan
спасибо посмотримс... |
|
Back to top |
|
|
Parcan
Joined: 15 Dec 2004 Posts: 399 Location: Russian
|
(Separately) Posted: Wed Mar 23, 2005 10:01 Post subject: |
|
|
SCHMaster
Sheridan
спасибор вот так заработало, жырным выделил ключевые строки, похоже HDC непременно нужно получить заранее и устанавливать шрифт для этого HDC
//rasschitivaem visotu teksta i izmenim razmer okna
HDC MyHdc = ::GetDC(gp->hWndPercent);
char GetTextSizeString[] = "GetTextSizeString";
SIZE tTextSize = {0, 0};
::SelectObject(MyHdc, gp->hFontN);
::GetTextExtentPoint32(MyHdc, GetTextSizeString, strlen(GetTextSizeString), &tTextSize);
gp->HeightText = tTextSize.cy + 1;
::ReleaseDC(gp->hWndPercent, MyHdc); |
|
Back to top |
|
|
Dest
Joined: 17 Dec 2004 Posts: 44 Location: Беларусь(Минск,Барановичи)
|
(Separately) Posted: Sat Apr 09, 2005 21:28 Post subject: |
|
|
Мдя.
На c# с этим проблем нету .... |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Sat Apr 09, 2005 21:40 Post subject: |
|
|
На C# ни с чем проблем при разработке нету, а потом глюки и тормоза. Сорри за оффтопик, конечно, но не удержался - не люблю я эту поделку. |
|
Back to top |
|
|
Parcan
Joined: 15 Dec 2004 Posts: 399 Location: Russian
|
(Separately) Posted: Sun Apr 10, 2005 12:46 Post subject: |
|
|
Dest
можно и ассемблер с делфи сравнивать, а что толку? |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|