Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

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

Автор вопроса:  CyRax  | Web-сайт: basicproduction.nm.ru | ICQ: 204447456 

Ответить

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

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #16
Добавлено: 19.03.05 21:21
Т.е. в чём трабла. Т.к. SelectObject с хендлом нового шрифта не срабатывает вне оконной процедуры, то размеры в GetTextExtentPoint32 расчитываются с тем шрифтом что был (это умолчальный System) и соответственно получаются не такими, которые отрисовываются уже новым, тултипным шрифтом, установливаемым (кстати каждый раз) в окнной процедуре с помощью того же SelectObject.

 Надеюсь не сильно путанно? :)

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #17
Добавлено: 19.03.05 21:26
Т.е. допустим у меня есть процедура, в которой создаётся окно класса BP_TOOLTIP и в ней же расчитываются все размеры, показывается окно.
Ну а потом идёт вызов оконной процедуры

    Local msg As tagMSG
    If hToolTip<>0 Then
       UpdateWindow hToolTip
       Do While GetMessage(msg, %NULL, 0, 0)
          TranslateMessage msg
          ;DispatchMessage msg
       Loop
    End If


Самое интересное что SelectObject не выдаёт ошибку, но не срабатывает почему то.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #18
Добавлено: 19.03.05 21:37
Вот код, может где ошибка закралась?

    Dim ncm As NONCLIENTMETRICS, BP_TIP_Font As LOGFONT
    'set the size of the structure
    ncm.cbSize = SizeOf(ncm)
    If SystemParametersInfo(%SPI_GETNONCLIENTMETRICS, ncm.cbSize, ncm, 0) = 1 Then
       BP_TIP_Font=Ncm.lfStatusFont
       hToolTip_Font=CreateFontIndirect(BP_TIP_Font)
    End If


    hToolTip = CreateWindowEx(0, "BP_ToolTip", "", %WS_POPUP Or %WS_BORDER, 0, 0, 100, 100, hWnd, 0, GetModuleHandle("";), ByVal %NULL)


    SelectObject GetDC(hToolTip), hToolTip_Font


В окнной процедуре кстати hDC получается так:

hDC& = BeginPaint(hWnd&, ps)

 Может BeginPaint выдаёт другой hDC чем GetDC?

Ответить

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



Вопросов: 87
Ответов: 459
 Профиль | | #19 Добавлено: 20.03.05 11:58
Имхо: то, что ты рисуешь текст с помощью DrawText, уже накладывает ограничение на способ задания шрифта для этой операции: именно через SelectObject, а не WM_SETFONT. Ну а то, что SelectObject недостаточно выполнить один раз, а приходится делать при каждом paint'е, - объяснить щас с ходу не могу, но с точки зрения "ресурсов" это не так уж и смертельно; я бы плюнул на это дело. Однако, тебе из-за этого приходится тащить в оконную процедуру и GetTextExtentPoint32 и расчёт размеров - вот это уже плохо. НО: ведь ничто не мешает расчёт размеров делать только один раз - грубо говоря, "при самом первом paint'е" или при какой-нить "инициализации"; и при этом - есс-с-сно после создания hToolTip_Font! Я не могу вслепую (не видя полностью твоего кода) точно сказать, как именно это можно реализовать, но на ум приходит типичный способ, которым в бэйсике обычно ограничивают выполнение события Form_Activate одним лишь разом - с помощью банального "логического флажка", описанного в разделе ";Declarations" формы и доступного как из Form_Load, так и из Form_Activate. Взводят его когда надо в True - и повторное выполнение блокируется IF'ом...

Тоже надеюсь, что не слишком путанно :))

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #20
Добавлено: 20.03.05 13:17

ведь ничто не мешает расчёт размеров делать только один раз - грубо говоря, "при самом первом paint'е" или при какой-нить "инициализации"

 Точно, я так с ходу и не сообразил. Наверное по правилам это нужно делать при сообщении %WM_CREATE. Буду пробовать, спасибо.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #21
Добавлено: 20.03.05 16:48
Похоже что GetDC всё таки возвращает другой hDC чем BeginPaint.

При таком коде ничего не происходит:

SelectObject GetDC(hToolTip), hToolTip_Font


А это срабатывает:

hDC& = BeginPaint(hWnd&, ps)
 SelectObject hDC&, hToolTip_Font
Call EndPaint(hWnd&, ps)


Всё, проблема решена с помощью BeginPaint...EndPaint. Спасиюо.

Ответить

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

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



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