Определить настройки Windows DPI программно? - PullRequest
3 голосов
/ 17 августа 2010

у нас проблема с одним из наших приложений 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 не очень хорошая идея, потому что тогда значок мэйнфрейма заменяется значком по умолчанию (даже если он выглядит хорошо на панели задач ...) - я не сделал не заметил, что во время моего первого теста.

1 Ответ

5 голосов
/ 17 августа 2010

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

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Это вряд ли вызовет несколько новых проблем.Все, что вы хотели бы знать об этом, очень хорошо освещено в этой статье библиотеки MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...