2010-08-17 2 views
3

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

ответ

5

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

+0

спасибо за ссылку –

+0

Спасибо, но я уже был там. На самом деле это не то, что я ищу, так как включение разрешения dpi вызывает слишком много проблем, особенно при 144 dpi. Знаете ли вы, почему приложения ведут себя так, как будто они работают с разрешением 160 dpi (например, без виртуализации и, следовательно, без масштабирования в стиле xp)? В статье также не упоминается, возможно ли узнать, что представляет собой реальная настройка DPI системы (без учета разрешения dpi). – humbagumba

+1

Виртуализация DPI не срабатывает, пока DPI не достигнет 120. Поиск реального DPI требует отключения виртуализации. –

Смежные вопросы