2

当窗口设置为“将文本大小调整为“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>
4

4 回答 4

1

我在使用 SDL OpenGL 时遇到了类似的问题。Windows DPI 缩放在不知情的应用程序上的实现非常糟糕,例如放大全屏视口和裁剪侧面。

我对清单没有任何运气。

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

BOOL dpi_result = SetProcessDPIAware();

int main( int argc, char **argv )
{
    //...
于 2020-01-19T22:34:55.180 回答
0

这只是对在此问题上错误怀疑 MFC / Windows 7 的警告。

我遇到了同样的问题。我们的(较旧的)MFC 应用程序在 Windows 7 上运行且字体设置为 125% 时,以错误的大小显示对话框。控件被缩放,但每个对话框都小了大约 25%。

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

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

于 2014-02-12T12:48:49.160 回答
0

对于 125% 的字体缩放,DPI 感知设置不相关。发生的情况是文本将大 25%,然后您有责任扩展您的 UI 以匹配。您的对话框通常需要大 25% 才能容纳更大的文本。您不仅需要缩放尺寸,还需要缩放位置。由你来编写所有这些代码。或者使用一个为你做这件事的 UI 框架。

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

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

这篇MSDN 文章包含所有血淋淋的细节。

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

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

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

于 2013-04-17T17:09:00.257 回答
0

在我团队的应用程序中,我们在程序集属性而不是应用程序属性上有 asmv3 的 xmlns 属性。

而不是这一行:

<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>

这一行:

<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0' xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">

我拿了我的产品的应用清单并将其剥离到只有父节点和父节点。这里供参考:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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>
于 2021-11-21T04:07:22.370 回答