Страница 1 из 2

Высота шрифта в пикселах

Добавлено: Вт мар 15, 2005 19:19
Parcan
Я имею HFONT для выбранного шрифта, как получить высоту (да и ширину символа) этого шрифта в пикселах с помощью WinAPI?

Требуется для динамического создания окна STATIC под выбранный размер шрифта.

Добавлено: Вт мар 15, 2005 20:26
CaptainFlint
Parcan
Размер зависит от символа. Можно использовать GetTextMetrics для получения характеристик шрифта как такового, либо GetTextExtentPoint32 (и соответствующее семейство функций) для получения размеров конкретной строки символов. В обоих случаях HFONT надо подключить к HDC, который будет использоваться в этих функциях в качестве параметра.

Добавлено: Ср мар 16, 2005 02:47
SCHMaster
Parcan

Код: Выделить всё

....
var
  Sz:TSize;
....
GetTextExtentPoint32(GetDC(MyHandle),PChar(MyCaption),Length(MyCaption), Sz)
....
Sz.x - ширина твоего текста
Sz.y - высота. И (IMHO) не нужно морочить одно место. :).
Предварительно, ессно, известный HFONT нужно присвоить окну, на котором будет текст

Код: Выделить всё

SendMessage(MyHandle,wm_setfont,HFONT ,1);

Добавлено: Ср мар 16, 2005 17:27
Parcan
это получается мне надо создать все окна, установить в них текст, получить параметры, и наконец все свои окна ресайзить и показать?

я думал както попроще будет

Добавлено: Чт мар 17, 2005 02:33
SCHMaster
Parcan
Гм... Ну если ты пишешь на API, то можно, в принципе и так - один хрен ты их создаешь (окна) в runtime (c VCL делфя эту всю работу за тебя делают). Можно и по другому (хоть на APIах, хоть на Делфях) - создать поверхность (можно окно, можно поверхность - DC, если юзаешь юнит Graphics, то можно и TCanvas обломаться, присвоив MyCanvas.Font.Handle:=HFONT), и выполнять все те-же функции с ней. В качестве примера (это, без обработки всяких искл. ситуевин, "с лету", но пахать должно)

Код: Выделить всё

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

Добавлено: Чт мар 17, 2005 08:31
Parcan
SCHMaster

я делфи не люблю (синтаксис убивает) потому пишу на vc++6.0 только вот MFC (что-то типа вашего VCL) прилепить не смог потому мучаюсь с WinAPI, но всеравно спасибо общий подход понял

Добавлено: Пт мар 18, 2005 02:10
SCHMaster
Parcan
Невочто :)

Добавлено: Пн мар 21, 2005 18:38
Parcan
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
а шрифты то я назначал окну разные

где я неправ?

Добавлено: Вт мар 22, 2005 02:28
SCHMaster
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;

Добавлено: Вт мар 22, 2005 07:26
Sheridan

Добавлено: Вт мар 22, 2005 17:36
Parcan
SCHMaster
Sheridan

спасибо посмотримс...

Добавлено: Ср мар 23, 2005 09:01
Parcan
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);

Добавлено: Сб апр 09, 2005 21:28
Dest
Мдя.
На c# с этим проблем нету ....

Добавлено: Сб апр 09, 2005 21:40
D1P
На C# ни с чем проблем при разработке нету, а потом глюки и тормоза. Сорри за оффтопик, конечно, но не удержался - не люблю я эту поделку.

Добавлено: Вс апр 10, 2005 12:46
Parcan
Dest

можно и ассемблер с делфи сравнивать, а что толку?