Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Получить размер шрифта. Добавлено: 19.03.05 15:07  

Автор вопроса:  CyRax  | Web-сайт: basicproduction.nm.ru | ICQ: 204447456 
Как можно получить размер шрифта в устройстве. Только не WM_GETFONT (у меня не работает) и не GetTextMetrics - он ширину не покзывает.

Вобщем может я не туда копаю? Мне нужно у одного окна получить размер шрифта, а другому этот размер задать.

Ответить

  Ответы Всего ответов: 21  

Номер ответа: 1
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #1 Добавлено: 19.03.05 16:51
получить размер шрифта в устройстве

А что за устройство? просто окно?
Мне нужно у одного окна получить размер шрифта

ага, похоже, всё-таки, окно...
Только не WM_GETFONT (у меня не работает)

...но тогда непонятно, почему не работает данное сообщение!
Вобщем может я не туда копаю?

Да вроде туда. По крайней мере, твою задачу (для окон) я решал всегда через WM_GETFONT/WM_SETFONT. Могешь поподробнее об "устройстве"?! (и вообще - об условиях задачи)

Ответить

Номер ответа: 2
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #2
Добавлено: 19.03.05 16:58
Ну я создаю окно и рисую в нём с помошью DrawText.
В 98-й всё нормально, а в 2000-й шрифт очень большой. Пытался приравнять размер шрифта, к тому окну, на которое у меня ловушка, с помощью WM_GETFONT, но оно возвращает ноль. Хотя хендл правильный.


 Могешь поподробнее об "устройстве"?!

 Устройство (Device) называется DYSPLAY :)
 Контекст его для окна можно получить с помощью GetDC.

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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()
    ;Dim res As Long
    ;Dim 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
Пытался приравнять размер шрифта, к тому окну, на которое у меня ловушка, с помощью WM_GETFONT, но оно возвращает ноль. Хотя хендл правильный.


Лезем в MSDN (раздел WM_GETFONT Message):

The return value is a handle to the font used by the control, or NULL if the control is using the system font.


Значит, DesktopWindow - с которого, насколько я понял, ты "читаешь" шрифт - просто использует системный шрифт. Что ж, это похоже на правду.

Буду думать дальше...

Ответить

Номер ответа: 6
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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
Что мне тогда ноль в GetObject передавать?

Ну зачем же? я ж грю, что "задача изменяется - нужно определить системный шрифт и "превратить" его в 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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #15
Добавлено: 19.03.05 21:14
Получилось, но не совсем.
SelectObject срабатывает почему то только в оконной процедуре, в то время как размеры окна расчитываются предварительно перед показом.
Ведь не расчитывать же мне каждый раз размеры после BeginPaint?
Что делать? Может где то в классе это можно прописать. Класс окна кустарный - WNDCLASSEX.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам