我有一个CListCtrl使用 ListView 创建的控件(或 Win32 中的 LVS_REPORT)风格。
我打算在其项目中显示图标,如下所示:
但问题是我需要制作和加载多大尺寸的图标?
让我解释一下。从旧的 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;
字体缩放有什么不同吗?
最佳答案
ListView 根据其模式使用“小”或“大”图像列表。在报告模式下,它使用“小”图像列表。您可以使用GetSystemMetrics()
使用 SM_CXSMICON
和 SM_CYSMICON
指标获取“小”图像的尺寸(使用 SM_CXICON
和 SM_CYICON
表示“大”图像)。
请注意,如果您的应用不支持 DPI,则返回的值将是虚拟/缩放的,因此要获得准确的值,请通过 SetProcessDPIAware()
确保它支持 DPI , SetProcessDpiAwareness()
,或 DPI list 。
更新:我刚刚遇到了这个函数,在编写 DPI 感知应用程序时可能对您有用:
制作较大的图像并让 API 将其缩小为较小的尺寸。
关于c++ - 我需要为我的应用程序制作和加载多大尺寸的 ImageList 图标(考虑更高的 DPI)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24225791/