Страница: 1 | 2 |
Вопрос: Получить размер шрифта.
Добавлено: 19.03.05 15:07
Автор вопроса: CyRax | Web-сайт:
Ответы
Всего ответов: 21
Номер ответа: 16
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #16
Добавлено: 19.03.05 21:21
Т.е. в чём трабла. Т.к. SelectObject с хендлом нового шрифта не срабатывает вне оконной процедуры, то размеры в GetTextExtentPoint32 расчитываются с тем шрифтом что был (это умолчальный System) и соответственно получаются не такими, которые отрисовываются уже новым, тултипным шрифтом, установливаемым (кстати каждый раз) в окнной процедуре с помощью того же SelectObject.
Надеюсь не сильно путанно?
Номер ответа: 17
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #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
 ispatchMessage msg
Loop
End If
Самое интересное что SelectObject не выдаёт ошибку, но не срабатывает почему то.
Номер ответа: 18
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #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 одним лишь разом - с помощью банального "логического флажка", описанного в разделе "eclarations" формы и доступного как из Form_Load, так и из Form_Activate. Взводят его когда надо в True - и повторное выполнение блокируется IF'ом...
Тоже надеюсь, что не слишком путанно )
Номер ответа: 20
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #20
Добавлено: 20.03.05 13:17
ведь ничто не мешает расчёт размеров делать только один раз - грубо говоря, "при самом первом paint'е" или при какой-нить "инициализации"
Точно, я так с ходу и не сообразил. Наверное по правилам это нужно делать при сообщении %WM_CREATE. Буду пробовать, спасибо.
Номер ответа: 21
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #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. Спасиюо.