у нас проблема с одним из наших приложений MFC, не поддерживающих dpi.
Если вы измените настройку системы на высокое dpi (например, 120 или 144 dpi), значок приложения на панели задач выглядит испорченным. К сожалению, мы должны зарегистрировать наш собственный WNDCLASS
для мэйнфрейма, а в члене WNDCLASS.hIcon
вы должны установить значок. Этот значок загружается с использованием функции LoadIcon
. И эта функция пытается загрузить изображение в стандартном размере (так же, как возвращается GetSystemMetrics(SM_CXICON)
), который для 120 точек на дюйм составляет 40x40 пикселей. Это прискорбно, потому что мы не предоставляем значок в таком размере. Но для этого есть обходной путь: поскольку, как ни странно, виртуализация dpi, по-видимому, не действует для 120 dpi, GetDeviceCaps(..., LOGPIXELSX)
действительно возвращает 120 dpi, а GetSystemMetrics(SM_CXICON)
возвращает 40. Таким образом, мы можем поймать это и просто загрузить значок в разного размера. Но для 144 dpi это не работает, потому что теперь виртуализация, кажется, действует, и мы получаем 96 dpi и 32 пикселя, что опять-таки заставляет значок выглядеть очень некрасиво.
Я обнаружил, что если я просто установил элемент WNDCLASS.hIcon
на NULL
, значок будет отображаться нормально. Но мне интересно, если это нормально, потому что в соответствии с MSDN:
hIcon
Дескриптор к значку класса. это
член должен быть ручкой к иконке
ресурс. Если этот член НЕДЕЙСТВИТЕЛЕН,
Система предоставляет значок по умолчанию.
Так могу ли я рассчитывать на то, что значок всегда будет отображаться, даже если я установил для этого участника значение NULL?
Другой способ - загрузить значок правильного размера, но для этого мне нужно знать, что система на самом деле настроена на 144 dpi. И вот мы на моем первоначальном вопросе.
Кто-нибудь знает, возможно ли определить настройку DPI системы (из виртуального приложения dpi)? Обратите внимание, что я также думал о том, чтобы сделать что-то грязное, например, заставить приложение, поддерживающее dpi, сказать мне фактическое dpi и тому подобное, но я хочу избегать таких вещей, если это возможно.
С уважением,
humbagumba
Обновление:
Я обнаружил, что установка члена WNDCLASS.hIcon
на NULL
не очень хорошая идея, потому что тогда значок мэйнфрейма заменяется значком по умолчанию (даже если он выглядит хорошо на панели задач ...) - я не сделал не заметил, что во время моего первого теста.