Win32:在高DPI下的对话框中显示股票图标

Ker*_*ido 5 user-interface winapi icons dialog dpi

我有一个对话框,我需要显示标准信息图标.这是我的RC代码:

ICON    "",IDC_ICON_INFORMATION,18,70,21,20
Run Code Online (Sandbox Code Playgroud)

我按如下方式处理WM_INITDIALOG消息:

HICON aIcn = LoadIcon(NULL, IDI_INFORMATION);
SendDlgItemMessage(m_hWnd, IDC_ICON_INFORMATION, STM_SETICON, (WPARAM) aIcn, 0);
Run Code Online (Sandbox Code Playgroud)

在96 DPI下一切都很好:静态控件显示一个32x32像素的图标.

但是,当我切换到更高DPI时(通过右键单击桌面,选择屏幕分辨率,然后单击Make或其他更大或更小的项目),图标不会缩放!由于其他所有内容都很好地缩放,因此图标看起来比相邻文本小得多.我预计在144 DPI(150%)上,图标尺寸将为48x48像素.我确实通过XML清单将我的应用程序声明为DPI感知.

最糟糕的是,当我使用我自己的定制图标(也来自RC文件)时,一切都完美无缺.此外,MessageBox使用MB_ICONINFORMATION标志调用的函数也会显示图标的缩放版本.

鉴于这些想法,我假设如下:

  1. 具有SS_ICON样式的静态控件可以显示图标的缩放版本.
  2. 包含标准信息图标的图标资源具有图标的缩放版本(48x48).

那我做错了什么?

Ste*_*fan 0

使用LoadImage () 而不是 LoadIcon(),并使用从 GetSystemMetrics(SM_CYICON) 和 GetSystemMetrics(SM_CXICON) 获取的值指定 cxDesired 和 cyDesired 参数。

或者也许只是将您的应用程序声明为 DPI 感知就足够了?您可以通过简单地创建一个文本文件使其成为清单文件来轻松尝试。请参阅SetProcessDPIAware API备注部分中的示例