2009-10-30 1 views
0

В приложении Win32 GUI мне нужно определить ширину области, занимаемой строкой на панели инструментов, чтобы я соответствующим образом менял ширину кнопки. Панель инструментов проста в старом классе ToolbarWindow32. Я использую следующий код:Зачем мне неправильный размер текста для панели инструментов?

HDC dc = GetDC(toolbarWindowHandle); 
SIZE size; 
GetTextExtentPoint32(dc, stringToMeasure, tcslen(stringToMeasure), &size); 

Для некоторой фиксированной строки (скажем, «Hello») size.cx заполненная сказать 72, но когда я сделать скриншот панели с той же самой строкой отображается на кнопке, я вижу, что строка занимает 56 пикселей.

Разница явно зависит от настроек системных шрифтов. Я использую «большие шрифты», а значение, полученное кодом, больше, чем занято на экране. На машинах с «маленькими шрифтами» полученное значение меньше.

Я думал, что если использовать контекст оконного устройства GetTextExtentPoint32(), он вернет точно правильный размер. Что я делаю не так?

ответ

3

Шрифт, используемый панелью инструментов, не будет выбран в DC, поэтому вам нужно будет выяснить, какой шрифт он использует, создать копию, выбрать ее в DC, получить размер, а затем выбрать шрифт (иначе вы могли бы получить утечку ресурсов). В настоящее время вы получаете размер системного шрифта, который я ожидаю, или независимо от шрифта DC по умолчанию.

Вы можете попробовать найти дескриптор шрифта, который используется при отправке сообщения WM_GETFONT в окно панели инструментов, но это не гарантирует возврата фактического шрифта, используемого при отображении текста. Все зависит от того, как панель инструментов работает внутри.

Однако я уверен, что панель инструментов Win32 использует шрифт меню для текста кнопки рендеринга, который можно открыть с помощью комбинации SystemParametersInfo и структуры NONCLIENTMETRICS.

Если бы я был на работе, я бы опубликовал код.

Вам не нравится только Win32?

BTW, я использую текстовую функцию на панели инструментов и никогда не должен был вручную настраивать кнопку вручную.

http://msdn.microsoft.com/en-us/library/ms724947(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms724506(VS.85).asp

+0

Оказывается, отправка WM_GETFONT получает точно необходимый шрифт. – sharptooth