3

我们的一个不支持 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为不是一个好主意,因为随后大型机的图标被默认图标替换(即使它在任务栏上看起来很好......) - 我没有注意到在我的第一次测试。

4

1 回答 1

5

您必须将清单添加到您的程序(或编辑现有的)以关闭 DPI 虚拟化。它应该如下所示:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

这不太可能导致几个新问题。这篇MSDN 库文章很好地介绍了您想了解的所有内容。

于 2010-08-17T14:57:07.213 回答