我们的一个不支持 dpi 的 MFC 应用程序有问题。
如果您将系统设置更改为高 dpi(例如 120 或 144 dpi),则任务栏上的应用程序图标看起来很糟糕。不幸的是,我们必须WNDCLASS
为大型机注册我们自己的,并且WNDCLASS.hIcon
您必须在会员中设置一个图标。LoadIcon
该图标是使用该功能加载的。并且该函数尝试以标准尺寸加载图像(与返回的相同GetSystemMetrics(SM_CXICON)
),对于 120dpi 来说,它是 40x40 像素。这很不幸,因为我们不提供该尺寸的图标。但是有一个解决方法:奇怪的是,dpi 虚拟化似乎对 120 dpi 无效,GetDeviceCaps(..., LOGPIXELSX)
确实返回 120 dpi 并且GetSystemMetrics(SM_CXICON)
返回 40。所以我们可以抓住它并以不同的大小加载图标。但是对于 144 dpi 它不起作用,因为现在虚拟化似乎生效了,我们得到 96 dpi 和 32 像素,这再次导致图标看起来非常难看。
我发现如果我只是将WNDCLASS.hIcon
成员设置为NULL
,图标就会显示得很好。但我想知道这是否可以,因为根据 MSDN:
hIcon
类图标的句柄。此成员必须是图标资源的句柄。如果此成员为 NULL,则系统提供默认图标。
那么即使我将该成员设置为NULL,我是否可以指望始终显示的图标?另一种方法是以正确的大小加载图标,但为此我必须知道系统实际上设置为 144 dpi。我的第一个问题就到这里了。有谁知道是否可以确定系统的 DPI 设置(从 dpi 虚拟化应用程序中)?请注意,我还考虑过做一些肮脏的事情,比如让一个 dpi 感知应用程序告诉我实际的 dpi 和类似的东西,但如果可能的话,我想避免这样的事情。
最好的祝福,
洪巴贡巴
更新:
我发现将WNDCLASS.hIcon
成员设置NULL
为不是一个好主意,因为随后大型机的图标被默认图标替换(即使它在任务栏上看起来很好......) - 我没有注意到在我的第一次测试。