代码之家  ›  专栏  ›  技术社区  ›  humbagumba

以编程方式确定Windows DPI设置?

  •  3
  • humbagumba  · 技术社区  · 15 年前

    我们的一个不支持DPI的MFC应用程序出现问题。
    如果将系统设置更改为高dpi(例如120或144 dpi),则任务栏上的应用程序图标看起来会变差。不幸的是,我们必须注册自己的 WNDCLASS 对于大型机, WNDCLASS.hIcon 成员您必须设置一个图标。此图标是使用 LoadIcon 功能。该函数尝试以标准大小加载图像(与 GetSystemMetrics(SM_CXICON) ,对于120dpi为40x40像素。这很不幸,因为我们没有提供这种尺寸的图标。但有一个解决方法:奇怪的是,DPI虚拟化似乎对120 DPI无效, GetDeviceCaps(..., LOGPIXELSX) 确实返回120 dpi并且 获取系统度量(sm_cxicon) 返回40。所以我们可以捕捉到它并以不同的大小加载图标。但是对于144 dpi,它不起作用,因为现在虚拟化似乎已经生效,我们得到96 dpi和32像素,这再次导致图标看起来非常难看。
    我发现如果我把 HICON 成员到 NULL ,图标显示良好。但我想知道是否可以,因为根据msdn:

    希康
    类图标的句柄。这个 成员必须是图标的句柄 资源。如果此成员为空,则 系统提供默认图标。

    因此,即使将该成员设置为空,我是否可以指望图标始终显示? 另一种方法是以正确的大小加载图标,但为此,我必须知道系统实际上设置为144 dpi。在这里,我的第一个问题是。 是否有人知道(从DPI虚拟化应用程序中)是否可以确定系统的DPI设置?注意,我也考虑过做一些肮脏的事情,比如让一个支持dpi的应用程序告诉我实际的dpi和类似的事情,但是如果可能的话,我想避免这样的事情。

    最好的问候,

    汉巴巴巴

    更新:
    我发现设置 HICON 成员到 无效的 这不是一个好主意,因为主机的图标会被一个默认的图标取代(即使它在任务栏上看起来很好…)—我在第一次测试时没有注意到这一点。

    1 回复  |  直到 15 年前
        1
  •  5
  •   Hans Passant    15 年前

    您必须向程序中添加清单(或编辑现有清单)才能关闭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 Library article .