当设置高DPI时,如何防止我的Win32应用程序的UI元素被放大?

问题描述 投票:1回答:2

当Windows设置为“将文本调整为”125%“时,我的Win32应用程序的UI(但不是其窗口大小)按比例放大。这会导致文本字符串被截断,UI元素将从窗口边缘消失。我想防止这种情况发生,因此文本没有扩展,并且应用程序显示正确。由于时间投入使旧的传统应用程序正确DPI感知太高,我只想制作应用程序通过调整UI元素的大小来防止Windows破坏UI。

我尝试在启动期间调用SetProcessDPIAware(),当它不起作用时,表明应用程序在其清单中是DPI Aware。但是,这些措施都没有任何效果。

顺便说一句,这是我用来指定DPI意识的清单片段:

<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <asmv3:application
           xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <asmv3:windowsSettings
      xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>
c++ winapi visual-studio-2008 dpi
2个回答
0
投票

对于125%的字体缩放,DPI感知设置不相关。会发生什么事情是文本会大25%,然后您就有责任扩大您的UI以匹配。您的对话框通常需要大25%才能容纳更大的文本。您不仅需要缩放尺寸,还需要缩放位置。由你来编码所有这些。或者使用为您完成此操作的UI框架。

对于大于125%的字体缩放,DPI感知设置开始起作用。会发生什么:

  1. 如果您的应用未标记为DPI,Windows将使用光栅图像大小调整来缩放您的应用。这将导致您的视觉元素被像素化。
  2. 如果您的应用标记为DPI,Windows将忠实地呈现您的应用。同样,您有责任扩展UI以适应文本。

这个MSDN article有所有血腥的细节。

回到你的具体问题。你说:

我想防止这种情况发生,因此文本不会放大,并且应用程序会正确显示。

换句话说,您说要忽略用户的字体缩放设置并以100%DPI渲染,而不管他们的意愿如何。您可以通过将所有文本的大小减少25%来实现此目的。我真的不建议你这样做。


0
投票

对于在这个问题上错误怀疑MFC / Windows 7,这只是一个警告。

我有似乎是同样的问题。我们(较旧的)MFC应用程序在Windows 7上运行时,其字体设置为125%,显示的对话框大小错误。控制器被缩放,但每个对话框大约25%太小。

起初,我在对话框代码中搜索了可能设置其大小/位置的任何内容。然后我看到许多人在将MFC应用程序移动到Windows 7时遇到了对话框大小的问题,这错误地增加了我对MFC / Windows 7的怀疑。

最后我读了一个类似的讨论,并发现spy ++的维护者发表评论说,在退出时保存大小/位置的功能会在字体/ DPI更改后强制窗口进入错误的大小。我们的软件也是这样做的,但代码是在主应用程序中,而不是在对话框中。

© www.soinside.com 2019 - 2024. All rights reserved.