Высота шрифта в пикселах
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
Высота шрифта в пикселах
Я имею HFONT для выбранного шрифта, как получить высоту (да и ширину символа) этого шрифта в пикселах с помощью WinAPI?
Требуется для динамического создания окна STATIC под выбранный размер шрифта.
Требуется для динамического создания окна STATIC под выбранный размер шрифта.
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
Parcan
Размер зависит от символа. Можно использовать GetTextMetrics для получения характеристик шрифта как такового, либо GetTextExtentPoint32 (и соответствующее семейство функций) для получения размеров конкретной строки символов. В обоих случаях HFONT надо подключить к HDC, который будет использоваться в этих функциях в качестве параметра.
Размер зависит от символа. Можно использовать GetTextMetrics для получения характеристик шрифта как такового, либо GetTextExtentPoint32 (и соответствующее семейство функций) для получения размеров конкретной строки символов. В обоих случаях HFONT надо подключить к HDC, который будет использоваться в этих функциях в качестве параметра.
Parcan
Sz.x - ширина твоего текста
Sz.y - высота. И (IMHO) не нужно морочить одно место.
.
Предварительно, ессно, известный HFONT нужно присвоить окну, на котором будет текст
Код: Выделить всё
....
var
Sz:TSize;
....
GetTextExtentPoint32(GetDC(MyHandle),PChar(MyCaption),Length(MyCaption), Sz)
....Sz.y - высота. И (IMHO) не нужно морочить одно место.
Предварительно, ессно, известный HFONT нужно присвоить окну, на котором будет текст
Код: Выделить всё
SendMessage(MyHandle,wm_setfont,HFONT ,1);Parcan
Гм... Ну если ты пишешь на API, то можно, в принципе и так - один хрен ты их создаешь (окна) в runtime (c VCL делфя эту всю работу за тебя делают). Можно и по другому (хоть на APIах, хоть на Делфях) - создать поверхность (можно окно, можно поверхность - DC, если юзаешь юнит Graphics, то можно и TCanvas обломаться, присвоив MyCanvas.Font.Handle:=HFONT), и выполнять все те-же функции с ней. В качестве примера (это, без обработки всяких искл. ситуевин, "с лету", но пахать должно)
Если на АРЯХ, то вместо aCanvas - CreateCompatableDC но, я так думаю, ты с VCL вошкаешься, так что можно не гиммороиться с API
Гм... Ну если ты пишешь на 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;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
а шрифты то я назначал окну разные
где я неправ?
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
а шрифты то я назначал окну разные
где я неправ?
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;
Черт его знает. Я фонт создавал где-то так (на делфях, но я думаю поймешь)
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;
- Sheridan
- Сообщения: 129
- Зарегистрирован: Вт мар 01, 2005 07:47
- Откуда: Пятигорск
- Контактная информация:
может http://gzip.rsdn.ru/forum/Message.aspx? ... 139&only=1 поможет?
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);
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);