Win32: отображение значка сток в диалоговом окне с высоким DPI - PullRequest
5 голосов
/ 25 августа 2010

У меня есть диалоговое окно, где мне нужно отобразить стандартный значок информации. Вот мой код RC:

ICON    "",IDC_ICON_INFORMATION,18,70,21,20

Я обрабатываю сообщение WM_INITDIALOG следующим образом:

HICON aIcn = LoadIcon(NULL, IDI_INFORMATION);
SendDlgItemMessage(m_hWnd, IDC_ICON_INFORMATION, STM_SETICON, (WPARAM) aIcn, 0);

Все отлично работает при 96 DPI: статический элемент управления отображает значок 32x32 пикселя.

Однако, когда я переключаюсь на более высокое значение DPI (щелкнув правой кнопкой мыши на Рабочий стол , выбрав Разрешение экрана и нажав Сделать или другие элементы больше или меньше ) значок не масштабируется! Поскольку все остальное хорошо масштабируется, значок выглядит визуально намного меньше, чем соседний текст. Я ожидаю, что при 144 DPI (150%) размеры иконки будут 48x48 пикселей. Я объявил свое приложение с поддержкой DPI через XML-манифест.

Самое ужасное, что когда я использую свою собственную иконку (также из файла RC), все отлично масштабируется. Кроме того, функция MessageBox, вызываемая с флагом MB_ICONINFORMATION, также отображает уменьшенную версию значка.

Учитывая эти мысли, я предполагаю следующее:

  1. Статический элемент управления в стиле SS_ICON может отображать уменьшенные версии значков.
  2. Ресурс значка, который содержит стандартный значок информации, имеет уменьшенную версию значка (48x48).

Что я тогда делаю не так?

1 Ответ

0 голосов
/ 25 августа 2010

Используйте LoadImage () вместо LoadIcon () и укажите параметры cxDesired и cyDesired со значениями, которые вы получаете из GetSystemMetrics (SM_CYICON) и GetSystemMetrics (SM_CXICON).

Или возможноможет быть достаточно просто объявить ваше приложение как осведомленное о DPI?Вы можете легко это сделать, просто создав текстовый файл и превратив его в файл манифеста.Смотрите пример в разделе замечаний для SetProcessDPIAware API

...