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

标签 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;

字体缩放有什么不同吗?

最佳答案

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

请注意,如果您的应用不支持 DPI,则返回的值将是虚拟/缩放的,因此要获得准确的值,请通过 SetProcessDPIAware() 确保它支持 DPI , SetProcessDpiAwareness() ,或 DPI list 。

更新:我刚刚遇到了这个函数,在编写 DPI 感知应用程序时可能对您有用:

LoadIconWithScaleDown()

制作较大的图像并让 API 将其缩小为较小的尺寸。

关于c++ - 我需要为我的应用程序制作和加载多大尺寸的 ImageList 图标(考虑更高的 DPI)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24225791/

相关文章:

C++/Boost 字符串替换 : How do I replace '&' with '&' only when & ends with a ;

c++ - 为外部 dll 上的缓冲区分配内存并在主应用程序上使用它是否安全?

c++ - 无法在 Windows 8 的 Cygwin 上编译基本的 C++ 程序

linux - 请调试 SSH 代理命令,它无法在 PuTTY 上使用多跳 SSH 连接远程服务器

c++ - CryptEncrypt AES 256 在加密最后一个 block 时失败

c++ - 程序集 :are they faster than global variables? 中的局部变量

c++ - 如何请求操作系统发送邮件?

VBox 共享文件夹中符号链接(symbolic link)的 Windows 问题

winapi - 为什么 WheelDelta = 120?

方法定义中的 C++ 模板参数