Осведомленность о DPI: можно ли мне сказать, когда мне нужно пересчитать высоту текста, чтобы мне не приходилось делать это все время? И SM_CYSMICON/checkbox heights тоже?
Частой операцией в моем элементе управления Windows Table, которую я переделываю и перемещаю в DLL, является получение высоты строки. Это максимум
- высота текста в текущем шрифте, в пикселях
- текущая высота иконки в пикселях (
GetSystemMetrics(SM_CYSMICON)
) - высота флажков в пикселях (определяется на
WM_THEMECHANGED
, когда информация о флажке пересчитывается)
Для расчета высоты текста, насколько мне известно, требуется получить DC, выбрать шрифт (и получить SYSTEM_FONT
если это NULL
), получая текстовые метрики, выбирая шрифт и освобождая DC, все из которых может выдавать ошибку / сбой / и т.д. Это означает, что практически каждая функция, находящаяся под моим контролем, может выйти из строя.
Я могу избежать этого, сохраняя высоту текста в другом месте, вычисляя ее только при изменении. Я знаю, что высота текста - это свойство, относящееся к DPI контроллера домена, которое GetDC(hwnd)
возвращается. Я хотел бы, чтобы мой элемент управления не зависел от DPI, потому что осведомленность о DPI зависит от процесса, а не от DLL/ окна.
В то же время, зная, когда GetSystemMetrics(SM_CYSMICON)
Изменения также будут полезны.
Так что мои вопросы просты:
- Есть ли сообщение, которое я могу найти, которое сообщит мне, что мой DPI изменился и что мне нужно пересчитать мою высоту текста?
- Есть ли сообщение, которое скажет мне, что
SM_CYSMICON
изменилось и что мне нужно все пересчитать? Это тот же самый? (Я знаю, что нет надежного способа обнаружитьGetSystemMetrics()
ошибка (так как 0 - верное возвращение, и он не устанавливает последний код ошибки), поэтому я предполагаю, что это не может произойти сбой с допустимым параметром, и просто вызываю его каждый раз, когда мне нужно вычислить высоту строки; это просто, чтобы я мог поставить в очередь перерисовку, когда значение действительно меняется.) Будет ли это работать дляSM_CXSMICON
? - Кроме того, оглядываясь на мой код,
GetThemePartSize()
также принимает DC; элементы темы, такие как изображения-флажки, масштабируются с помощью DPI? И если да, то какие сообщения я ищу в этом случае? Тот самый? - Альтернатива: есть ли надежный способ получить высоту текста, о которой я не знаю, учитывая только
HWND
а такжеHFONT
?
Я буду рад принять решение, которое было представлено в Windows XP или Windows Vista; если есть решение, которое было представлено в более новой версии Windows, то знание о нем также может быть полезным.
Благодарю.