Win32:在高DPI下在对话框中显示库存图标

6

我有一个对话框,需要显示标准的信息图标。以下是我的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像素。我已经通过XML清单将我的应用程序声明为DPI感知。
最可恶的是,当我使用自己制作的自定义图标(也来自RC文件)时,一切都可以完美缩放。此外,使用带有MB_ICONINFORMATION标志的MessageBox函数确实显示了缩放后的图标版本。
鉴于这些想法,我认为以下做法是正确的:
1.带有SS_ICON样式的静态控件可以显示缩放版本的图标。 2.包含标准信息图标的图标资源具有缩放版本的图标(48x48)。
那么我做错了什么?

看起来 LoadIconWithScaleDown 函数(在 Vista 及以上版本中可用)可以完成这个任务。还有其他想法吗? - Kerido
1个回答

0

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

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


已经尝试了所有方法。程序已经通过清单文件具备了 DPI 感知功能。这在原始问题中已经写明。 - Kerido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接