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