Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Высота шрифта в пикселах
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Tue Mar 15, 2005 20:19    Post subject: Высота шрифта в пикселах Reply with quote

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

Требуется для динамического создания окна STATIC под выбранный размер шрифта.
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Tue Mar 15, 2005 21:26    Post subject: Reply with quote

Parcan
Размер зависит от символа. Можно использовать GetTextMetrics для получения характеристик шрифта как такового, либо GetTextExtentPoint32 (и соответствующее семейство функций) для получения размеров конкретной строки символов. В обоих случаях HFONT надо подключить к HDC, который будет использоваться в этих функциях в качестве параметра.
Back to top
View user's profile Send private message
SCHMaster



Joined: 15 Dec 2004
Posts: 296
Location: Киев

Post (Separately) Posted: Wed Mar 16, 2005 03:47    Post subject: Reply with quote

Parcan

Code:
....
var
  Sz:TSize;
....
GetTextExtentPoint32(GetDC(MyHandle),PChar(MyCaption),Length(MyCaption), Sz)
....
Sz.x - ширина твоего текста
Sz.y - высота. И (IMHO) не нужно морочить одно место. Smile.
Предварительно, ессно, известный HFONT нужно присвоить окну, на котором будет текст
Code:
SendMessage(MyHandle,wm_setfont,HFONT ,1);
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Wed Mar 16, 2005 18:27    Post subject: Reply with quote

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

я думал както попроще будет
Back to top
View user's profile Send private message
SCHMaster



Joined: 15 Dec 2004
Posts: 296
Location: Киев

Post (Separately) Posted: Thu Mar 17, 2005 03:33    Post subject: Reply with quote

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
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Thu Mar 17, 2005 09:31    Post subject: Reply with quote

SCHMaster

я делфи не люблю (синтаксис убивает) потому пишу на vc++6.0 только вот MFC (что-то типа вашего VCL) прилепить не смог потому мучаюсь с WinAPI, но всеравно спасибо общий подход понял
Back to top
View user's profile Send private message
SCHMaster



Joined: 15 Dec 2004
Posts: 296
Location: Киев

Post (Separately) Posted: Fri Mar 18, 2005 03:10    Post subject: Reply with quote

Parcan
Невочто Smile
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Mon Mar 21, 2005 19:38    Post subject: Reply with quote

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
View user's profile Send private message
SCHMaster



Joined: 15 Dec 2004
Posts: 296
Location: Киев

Post (Separately) Posted: Tue Mar 22, 2005 03:28    Post subject: Reply with quote

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
View user's profile Send private message
Sheridan



Joined: 01 Mar 2005
Posts: 129
Location: Пятигорск

Post (Separately) Posted: Tue Mar 22, 2005 08:26    Post subject: Reply with quote

может http://gzip.rsdn.ru/forum/Message.aspx?mid=909139&only=1 поможет?
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Tue Mar 22, 2005 18:36    Post subject: Reply with quote

SCHMaster
Sheridan

спасибо посмотримс...
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Wed Mar 23, 2005 10:01    Post subject: Reply with quote

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
View user's profile Send private message
Dest



Joined: 17 Dec 2004
Posts: 44
Location: Беларусь(Минск,Барановичи)

Post (Separately) Posted: Sat Apr 09, 2005 21:28    Post subject: Reply with quote

Мдя.
На c# с этим проблем нету ....
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Sat Apr 09, 2005 21:40    Post subject: Reply with quote

На C# ни с чем проблем при разработке нету, а потом глюки и тормоза. Сорри за оффтопик, конечно, но не удержался - не люблю я эту поделку.
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Sun Apr 10, 2005 12:46    Post subject: Reply with quote

Dest

можно и ассемблер с делфи сравнивать, а что толку?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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