【问题标题】:Win32: Displaying a Stock Icon in a Dialog Box under High DPIWin32:在高 DPI 下的对话框中显示股票图标
【发布时间】:2011-04-03 16:03:06
【问题描述】:

我有一个对话框,我需要在其中显示标准信息图标。这是我的 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 及更高版本中可用)可以完成这项工作。还有其他想法吗?

标签: user-interface winapi dialog icons dpi


【解决方案1】:

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

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

【讨论】:

  • 都试过了。该程序已经通过清单识别 DPI。这写在原始问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 2016-02-24
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多