Страница: 1 | 2 |
Вопрос: Получить размер шрифта.
Добавлено: 19.03.05 15:07
Автор вопроса: CyRax | Web-сайт:
Как можно получить размер шрифта в устройстве. Только не WM_GETFONT (у меня не работает) и не GetTextMetrics - он ширину не покзывает.
Вобщем может я не туда копаю? Мне нужно у одного окна получить размер шрифта, а другому этот размер задать.
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #1
Добавлено: 19.03.05 16:51
А что за устройство? просто окно?
ага, похоже, всё-таки, окно...
...но тогда непонятно, почему не работает данное сообщение!
Да вроде туда. По крайней мере, твою задачу (для окон) я решал всегда через WM_GETFONT/WM_SETFONT. Могешь поподробнее об "устройстве"?! (и вообще - об условиях задачи)
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 19.03.05 16:58
Ну я создаю окно и рисую в нём с помошью DrawText.
В 98-й всё нормально, а в 2000-й шрифт очень большой. Пытался приравнять размер шрифта, к тому окну, на которое у меня ловушка, с помощью WM_GETFONT, но оно возвращает ноль. Хотя хендл правильный.
Могешь поподробнее об "устройстве"?!
Устройство (Device) называется DYSPLAY
Контекст его для окна можно получить с помощью GetDC.
Номер ответа: 3
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #3
Добавлено: 19.03.05 16:59
Конечно же не DYSPLAY, а DISPLAY
Номер ответа: 4
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #4
Добавлено: 19.03.05 17:11
Может так:
Private Declare Function GetTextExtentPoint32 Lib "gdi32.dll" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, ByRef lpSize As Size) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Type Size
cx As Long
cy As Long
End Type
Private Sub Command1_Click()
 im res As Long
 im s As Size
res = GetTextExtentPoint32(GetDC(Command1.hwnd), Command1.Caption, Len(Command1.Caption), s)
End Sub
Номер ответа: 5
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #5
Добавлено: 19.03.05 17:16
Лезем в MSDN (раздел WM_GETFONT Message):
Значит, DesktopWindow - с которого, насколько я понял, ты "читаешь" шрифт - просто использует системный шрифт. Что ж, это похоже на правду.
Буду думать дальше...
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 19.03.05 17:44
Нет, окно не десктопное, только что проверял хенд правильный. Наверное это окно WM_GETFONT просто не обрабатывает (или ещё что).
Вобщем я сказал с самого начала что WM_GETFONT не подходит. Есть другие варианты?
Mihalыch,
А как мне потом это использовать? Смотреть ширину всего алфавита? Что мне в структуру LOGFONT (это для CreateFontInDirect) передавать?
Номер ответа: 7
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #7
Добавлено: 19.03.05 18:14
Ты часом не с консоли хочешь шрифт прочитать?!
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 19.03.05 18:20
Ты часом не с консоли хочешь шрифт прочитать?!
Рассмешил
Номер ответа: 9
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #9
Добавлено: 19.03.05 18:40
А что ж тут смешного?! Есть же фукнции GetCurrentConsoleFont, GetConsoleFontSize и т.д.
Ну а вообще - я в тупике... ты уверен, что WM_GETFONT именно НЕ ОБРАБАТЫВАЕТСЯ твоим загадочным окном?! м.б. - как и сказано в МСДН - твоё окно просто использует системный шрифт (и именно поэтому возвращает ноль)? (если да, то задача изменяется - нужно определить системный шрифт и "превратить" его в LOGFONT; правда, пока не знаю, как это сделать).
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 19.03.05 18:45
The return value is a handle to the font used by the control, or NULL if the control is using the system font.
Не, ну по этому поводу ты конечно прав. Я смотрел шрифт с помощью GetTextFace и он - System. А мне ноль не подходит, я хотел hFont в GetObject передать, а результат потом LOGFONT скопировать. Что мне тогда ноль в GetObject передавать?
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 19.03.05 18:49
А в GetObject ноль не предусмотрен.
hgdiobj
Handle to the graphics object of interest. This can be a handle to one of the following: a logical bitmap, a brush, a font, a palette, a pen, or a device independent bitmap created by calling the CreateDIBSection function.
Номер ответа: 12
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #12
Добавлено: 19.03.05 18:54
Ну зачем же? я ж грю, что "задача изменяется - нужно определить системный шрифт и "превратить" его в LOGFONT".
Варианты:
1. Найти какое-нить окно, в котором всегда и стопудово сидит системный шрифт, и прочитать его с помощью WM_GETFONT. Так себе вариантец (
2. Найти АПИ, которая вернёт "logical font" для системного шрифта.
В обоих вариантах получим на выходе hFont (As Long). Можно его и не превращать потом в LOGFONT -если конечное окно понимает сообщение WM_SETFONT.
Т.к. мне всё равно щас не фиг делать, то пытаюсь найти решение через п.2. Всё пошло в ход: Google, API Guide, ... пока голяк...
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 19.03.05 18:57
Вобщем окно моё - что то типа тултипа.
Может тогда лучше не парится, а получить из системы размер шрифта для тултиптекста? Как оно там, не помнишь?
Номер ответа: 14
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #14
Добавлено: 19.03.05 19:18
Не помню (да и не знал никогда), но нашёл Гуглом:
http://vbnet.mvps.org/index.html?code/screen/systemparaminfononclientarea.htm
Из этого кода несложно вырезать только то, что относится к тултипам.
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 19.03.05 21:14
Получилось, но не совсем.
SelectObject срабатывает почему то только в оконной процедуре, в то время как размеры окна расчитываются предварительно перед показом.
Ведь не расчитывать же мне каждый раз размеры после BeginPaint?
Что делать? Может где то в классе это можно прописать. Класс окна кустарный - WNDCLASSEX.