2010-08-25 38 views
4

我有一个对话框,我需要显示标准信息图标。这里是我的RC代码:Win32:在高DPI下的对话框中显示股票图标

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大:静态控件显示一个32×32像素的图标。

然而,当我(在桌面通过单击鼠标右键,选择屏幕分辨率,并单击制作或其他物品或大或小)切换到高DPI的图标不结垢!由于其他一切都很好地缩放,图标看起来在视觉上比相邻文本小得多。我预计144 DPI(150%)的图标尺寸将为48x48像素。我确实通过XML清单将我的应用程序声明为DPI。

最令人头疼的是,当我使用我自己定制的图标(也来自RC文件)时,一切都完美地缩放。此外,使用MB_ICONINFORMATION标志调用的MessageBox函数也会显示图标的缩放版本。

鉴于这些想法,我认为以下几点:

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

我做错了什么呢?

+0

貌似'LoadIconWithScaleDown'功能(在Vista及更高版本),可以做的工作的注释部分的例子。任何其他想法? – Kerido 2010-08-25 11:24:04

回答

0

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

或者,也许只是宣布你的应用程序为DPI意识可能够了?您可以通过简单地创建一个使其成为清单文件的文本文件轻松尝试。 见的SetProcessDPIAware API

+0

尝试了所有这些。该程序已通过清单识别DPI。这是写在原来的问题。 – Kerido 2010-08-25 17:57:11