Win32: отображение значка акции в диалоговом окне при высоком разрешении

У меня есть диалоговое окно, в котором мне нужно отобразить стандартный значок информации. Вот мой код 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 точек на дюйм все работает отлично: статический элемент управления отображает значок размером 32x32 пикселя.

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

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

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

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

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


person Kerido    schedule 25.08.2010    source источник
comment
Похоже, с этой задачей справится функция LoadIconWithScaleDown (доступная в Vista и выше). Есть другие идеи?   -  person Kerido    schedule 25.08.2010


Ответы (1)


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

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

person Stefan    schedule 25.08.2010
comment
Все это пробовал. Программа уже поддерживает DPI через manifest. Это написано в исходном вопросе. - person Kerido; 25.08.2010