我有一个用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;
字体缩放是否有所不同?
最佳答案
列表 View 根据其模式使用“小”或“大”图像列表。在报告模式下,它使用“小”图像列表。您可以使用 GetSystemMetrics()
通过SM_CXSMICON
和SM_CYSMICON
指标获取“小”图像的尺寸(对于“大”图像,请使用SM_CXICON
和SM_CYICON
)。
请注意,如果您的应用程序不支持DPI,则返回的值将是虚拟的/缩放的,因此,要获取准确的值,请通过 SetProcessDPIAware()
, SetProcessDpiAwareness()
或DPI list 确保它是DPI感知的。
更新:我刚遇到此功能,在编写支持DPI的应用程序时可能对您有用:
LoadIconWithScaleDown()
制作较大的图像,然后让API将其缩小为较小的尺寸。
关于c++ - 我需要为应用程序制作和加载多少大小的ImageList图标(考虑更高的DPI)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24225791/