如何在DPI感知的WIN应用程序上缩放标题栏?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

我通过设置设置使我的应用程序dpi感知到每个监视器。<dpiAware>True/PM</dpiAware>在清单文件中。我可以使用ProcessExplorer验证这是否确实有效,或者调用GetProcessDpi感知。

这一切都很好,我可以在我的代码中扩展客户区域中的任何内容。如果我把我的应用程序从一个系统dpi监视器拖到一个非系统dpi监视器,标题栏和任何系统菜单都会变得太大或太小。对于大多数内置应用程序(例如calc、边缘浏览器等)来说,情况并非如此,因此必须有适当的方法来适当地缩放它。有谁是MS的开发人员怎么做到的吗?

下面的截图应该能更好地解释我的问题。还请注意,在Close、min和max按钮之间的填充在缩放(96 Dpi)时是不同的。

附加一个非常简单的应用程序,是每个监视器dpi感知。

提问于
用户回答回答于

有谁是MS的开发人员怎么做到的吗?

这有一个相当令人失望的答案。我看到的窗口大小为320x576,客户端大小也是320x576。

值得注意的是,Calculator和WindowsExplorer在标题栏上没有使用相同的颜色。

计算器完成标题栏的自定义绘图将完美地解释这一点。

用户回答回答于

Windows 10周年更新(V 1607)添加了一个必须调用的新API,以支持DPI扩展非客户端区域:EnableNonClientDpiScaling

例子:

case WM_NCCREATE:
{
    if (!EnableNonClientDpiScaling(hWnd))
    {
        // Error handling
        return FALSE;
    }

    return DefWindowProcW(...);
}

如果应用程序的DPI-感知上下文是DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2,然后打电话EnableNonClientDpiScaling应该省略,因为它不会有任何效果,尽管函数仍然会成功返回。

例如

默认情况下,不启用顶层窗口的非客户端扩展。您必须调用此API,以便为希望自动获得非工作区规模的每个顶级窗口启用该API。一旦你这样做了,就没有办法禁用它。启用非客户端缩放意味着系统为窗口绘制的所有区域将根据窗口上DPI的变化自动缩放。这包括诸如标题栏、滚动条和菜单栏之类的区域。你想打电话EnableNonClientDpiScaling当您希望操作系统负责根据监视器的API以正确的大小自动呈现这些区域时。

扫码关注云+社区