防止在设置高DPI时放大Win32应用程序的UI元素

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

[当窗口设置为将文本的大小调整为“ 125%”时,我的Win32应用程序的UI(但不是窗口大小)按比例放大。这将导致文本字符串被剪切,UI元素从窗口的边缘消失。窗口。

我想防止这种情况的发生,因此文本不会按比例放大,并且应用程序可以正确显示。由于正确地使用DPI来了解此旧的遗留应用程序的时间投入太高,我只想通过调整Windows元素的大小来防止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
3个回答
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后将窗口大小更改为错误的大小。我们的软件也这样做,但是代码在主应用程序中而不在对话框中。


0
投票

我在SDL OpenGL中也遇到类似的问题。在无意识的应用程序上执行Windows DPI缩放的效果非常差,例如放大全屏视口并裁剪侧面。

我没有与清单有关的运气。

我能够通过调用SetProcessDPIAware();来解决它,但是它必须在SDLmain执行之前发生。也许您的“启动过程中”还不够早。我在main函数之前将其用作全局变量初始化器:

BOOL dpi_result = SetProcessDPIAware();

int main( int argc, char **argv )
{
    //...
© www.soinside.com 2019 - 2024. All rights reserved.