我们的一个非DPI感知的MFC应用程序存在问题。
如果您将系统设置更改为高DPI(例如120或144 DPI),则任务栏上的应用程序图标看起来很糟糕。不幸的是,我们必须为主窗体注册自己的
我发现如果我只是将
此致
humbagumba
更新:
我发现将
如果您将系统设置更改为高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的说法:那么,即使我将该成员设置为NULL,我能保证图标总是显示吗?另一种方法是以正确的大小加载图标,但为此,我必须知道系统实际上设置为144 dpi。这就是我最初的问题所在。有没有人知道是否可以确定系统的DPI设置(从dpi虚拟化应用程序内部)?请注意,我也考虑过执行一些不好的操作,例如让DPI感知应用程序告诉我实际DPI等内容,但如果可能的话,我要避免这些操作。hIcon
类图标的句柄。此成员必须是图标资源的句柄。如果此成员为NULL,则系统提供默认图标。
此致
humbagumba
更新:
我发现将
WNDCLASS.hIcon
成员设置为NULL
并不是一个好主意,因为这样会替换主窗体的图标为默认图标(即使任务栏上看起来很好...)- 我在第一次测试时没有注意到这一点。