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

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

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

Сообщение Parcan »

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

Требуется для динамического создания окна STATIC под выбранный размер шрифта.
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Parcan
Размер зависит от символа. Можно использовать GetTextMetrics для получения характеристик шрифта как такового, либо GetTextExtentPoint32 (и соответствующее семейство функций) для получения размеров конкретной строки символов. В обоих случаях HFONT надо подключить к HDC, который будет использоваться в этих функциях в качестве параметра.
Аватара пользователя
SCHMaster
Сообщения: 296
Зарегистрирован: Ср дек 15, 2004 02:32
Откуда: Киев
Контактная информация:

Сообщение 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);
Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

Сообщение Parcan »

это получается мне надо создать все окна, установить в них текст, получить параметры, и наконец все свои окна ресайзить и показать?

я думал както попроще будет
Аватара пользователя
SCHMaster
Сообщения: 296
Зарегистрирован: Ср дек 15, 2004 02:32
Откуда: Киев
Контактная информация:

Сообщение 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
Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

Сообщение Parcan »

SCHMaster

я делфи не люблю (синтаксис убивает) потому пишу на vc++6.0 только вот MFC (что-то типа вашего VCL) прилепить не смог потому мучаюсь с WinAPI, но всеравно спасибо общий подход понял
Аватара пользователя
SCHMaster
Сообщения: 296
Зарегистрирован: Ср дек 15, 2004 02:32
Откуда: Киев
Контактная информация:

Сообщение SCHMaster »

Parcan
Невочто :)
Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

Сообщение 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
а шрифты то я назначал окну разные

где я неправ?
Аватара пользователя
SCHMaster
Сообщения: 296
Зарегистрирован: Ср дек 15, 2004 02:32
Откуда: Киев
Контактная информация:

Сообщение 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;
Аватара пользователя
Sheridan
Сообщения: 129
Зарегистрирован: Вт мар 01, 2005 07:47
Откуда: Пятигорск
Контактная информация:

Сообщение Sheridan »

Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

Сообщение Parcan »

SCHMaster
Sheridan

спасибо посмотримс...
Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

Сообщение 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);
Dest
Сообщения: 44
Зарегистрирован: Пт дек 17, 2004 20:58
Откуда: Беларусь(Минск,Барановичи)
Контактная информация:

Сообщение Dest »

Мдя.
На c# с этим проблем нету ....
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

На C# ни с чем проблем при разработке нету, а потом глюки и тормоза. Сорри за оффтопик, конечно, но не удержался - не люблю я эту поделку.
Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

Сообщение Parcan »

Dest

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