我有一个CListCtrl控件(或Win32中的ListView ),它是用LVS_REPORT风格创build的。
我打算在其项目中显示图标:
但问题是我需要制作和加载多大的图标?
让我解释。 从旧的Win32示例中,我可以看到每个人都创build了具有15×15像素图标的图像列表。 但与这些问题是,它看起来像任何现代PC具有较高的DPI设置可怕像素化。 因此,我正在寻找一种dynamic的方式来确定适当的CListCtrl图像列表大小。
还有问题的第一部分,我最初应该制作的图标大小是多less?
编辑 PS:由于新闻部伸缩了,你怎么find它? 我目前正在使用以下方法:
//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;
字体缩放有些不同吗?
列表视图根据其模式使用“小”或“大”图像列表。 在报告模式下,它使用“小”图像列表。 您可以使用GetSystemMetrics()
使用SM_CXSMICON
和SM_CYSMICON
指标(对于“大”图像使用SM_CXICON
和SM_CYICON
GetSystemMetrics()
来获取“小”图像的尺寸。
请注意,如果您的应用程序不支持DPI,则返回的值将是虚拟/缩放的,因此要获取准确的值,请通过SetProcessDPIAware()
, SetProcessDpiAwareness()
或DPI清单确保它是DPI感知的。
更新 :我只是跑过这个函数,可能会在编写DPI感知应用程序时有用:
LoadIconWithScaleDown()
制作更大的图像,并让API缩小到更小的尺寸。
报告样式列表视图需要小图标,即SM_CYSMICON
指标SM_CXSMICON
的图标。 假设您的应用程序的DPI识别率很高,那么这些指标的实际值取决于用户选择的字体缩放比例或DPI设置。 所以前面你不知道应该使用什么尺寸的图标。 您必须在运行时查询系统度量标准,并使用适当大小的图标。
现在,您可执行文件中包含的大小图标取决于您希望支持的DPI设置。 回到XP的日子,你可以合理地预期会遇到100%和125%的字体缩放。 目前,高密度显示面板很普遍,你真的需要支持更大的比例。 至少有150%和200%,很可能是175%。
我可以找到最接近的准则是在这个MSDN文章: http : //msdn.microsoft.com/en-US/library/windows/desktop/dn742485.aspx
这篇文章是围绕Vista时间框架编写的,已经显示了它的年代。 我认为你必须使用这些文章作为指导,并适应当今的硬件。
您还会发现,人们在上面列出的整数之间以及链接到的文章中以字体缩放值运行机器。 我的一个同事以120%的成绩跑 有趣的是,这已经突出了我们代码中的各种错误,所以有人对你的程序进行狗食是非常有用的。
当您在运行时构建图像列表时,请根据系统度量标准来确定它们的大小。 并尽量避免缩放图标。 例如,如果系统度量标准提示18像素图标,并且只有16像素和20像素图标,则创建一个新的18像素图标。 用透明像素填充图像,然后将16px图标移到这个18px图像的中间。 把图标弄出来。 这种方法将避免混叠问题。