Осведомленность о 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, то знание о нем также может быть полезным.

Благодарю.

0 ответов

Другие вопросы по тегам