我需要制作多大尺寸的ImageList图标&加载我的应用程序(考虑更高的DPI)?

时间:2014-06-15 01:28:20

标签: c++ windows winapi gdi dpi

我使用CListCtrl样式创建了ListView控件(或Win32中的LVS_REPORT)。

我打算在其项目中显示图标:

enter image description here

但问题是我需要制作和加载多大的图标?

让我解释一下。从旧的Win32示例中,我可以看到每个人都创建了带有15x15像素图标的图像列表。但问题在于它在任何具有更高DPI settings的现代PC上看起来都非常像素化。因此,我一直在寻找一种动态方法来确定CListCtrl的图像列表的适当大小。

问题的第一部分,我最初应该制作什么图标尺寸?

修改 PS:自从DPI扩展到了,你怎么找到它?我目前正在使用以下方法:

//No error handling for brevity
HDC hDC = ::GetDC(hAppsMainWindowHandle);
int nCx = ::GetDeviceCaps(hDC, LOGPIXELSX);
int nCy = ::GetDeviceCaps(hDC, LOGPIXELSY);
::ReleaseDC(hAppsMainWindowHandle, hDC);

//I technically get horizontal & vertical scaling --
//can those be different?
double scalingCx = (double)nCx / 96.0;  //1.0 = 100%
double scalingCy = (double)nCy / 96.0;

字体缩放是否有所不同?

2 个答案:

答案 0 :(得分:3)

列表视图根据其模式使用“小”或“大”图像列表。在报告模式下,它使用“小”图像列表。您可以使用GetSystemMetrics()使用SM_CXSMICONSM_CYSMICON指标获取“小”图片的维度(使用SM_CXICONSM_CYICON表示“大”图片)

请注意,如果您的应用不支持DPI,则返回的值将是虚拟/缩放的,因此要获得准确的值,请确保通过SetProcessDPIAware()SetProcessDpiAwareness()或a确保其具有DPI感知功能DPI清单。

更新:我刚刚运行此功能,在编写支持DPI的应用时可能对您有用:

LoadIconWithScaleDown()

制作更大的图片,让API将它们缩小到更小的尺寸。

答案 1 :(得分:0)

报告样式列表视图需要小图标,即带有SM_CXSMICONSM_CYSMICON指标的图标。假设您的应用具有高DPI感知能力,那么这些指标的实际值取决于用户选择的字体缩放或DPI设置。所以在前面你不知道应该使用什么尺寸的图标。您必须在运行时查询系统指标,并使用适当大小的图标。

现在,您在可执行文件中包含的大小图标取决于您希望支持的DPI设置。回到XP时,你可以合理地期望遇到100%和125%的字体缩放。目前,高密度显示面板很常见,您确实需要支持更大的比例。至少150%和200%,很可能是175%。

我可以找到最接近指南的MSDN文章:http://msdn.microsoft.com/en-US/library/windows/desktop/dn742485.aspx

这篇文章是围绕Vista时间框架编写的,已经显示了它的时代。我认为你必须使用这些文章作为指导,并适应当时的硬件。

您还会发现人们在上面列出的整数和我链接到的文章之间以字体缩放值运行他们的机器。我的一位同事以120%的比例运行。有趣的是,这突显了我们代码中的各种错误,因此让某人为您的程序喂食食物总是有用的。

在运行时构建映像列表时,请根据系统指标调整它们的大小。并尽量避免缩放图标。例如,如果系统指标建议使用18px图标,并且您只有16px和20px图标,那么请创建一个新的18px图标。使用透明像素填充图像,并将16px图标blit到此18px图像的中间。制作图标。这种方法可以避免混叠问题。