当Windows设置为“将文本大小调整为”125%“时,我的Win32应用程序将其UI(但不是其窗口大小)放大。这会导致文本字符串被截断,UI元素将从边缘消失窗户。 我想防止这种情况发生,因此文本不会放大,并且应用程序会正确显示。由于时间投入使得旧的遗留应用程序能够正确识别DPI,因此我只想通过调整UI元素来防止Windows破坏UI,从而使应用程序可用。
我尝试在启动期间调用SetProcessDPIAware(),当它不起作用时,表明应用程序在其清单中是DPI Aware。但是,这些措施都没有任何效果。
BTW,这是我用来指定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>
答案 0 :(得分:0)
对于125%的字体缩放,DPI感知设置无关紧要。会发生的事情是文本会大25%,然后您就有责任扩大您的UI以匹配。您的对话框通常需要大25%才能容纳更大的文本。您不仅需要缩放尺寸,还需要缩放位置。由你来编码所有这些。或者使用为您完成此操作的UI框架。
对于大于125%的字体缩放,DPI识别设置起作用。会发生什么:
此MSDN article包含所有血腥细节。
回到您的具体问题。你说:
我想阻止这种情况发生,因此文字不会放大,并且应用程序会正确显示。
换句话说,您要忽略用户的字体缩放设置并以100%DPI渲染,而不管其意图如何。您可以通过将所有文本的大小减少25%来实现此目的。我真的不建议你这样做。
答案 1 :(得分:0)
这只是对此问题上错误怀疑MFC / Windows 7的警告。
我遇到了同样的问题。我们(较旧的)MFC应用程序在Windows 7上运行时,其字体设置为125%,显示的对话框大小错误。控制器被缩放,但每个对话框大约25%太小。
首先,我在对话框代码中搜索了可能设置其大小/位置的任何内容。然后我看到许多人在将MFC应用程序移动到Windows 7时遇到了对话框大小问题,这错误地增加了我对MFC / Windows 7的怀疑。
最后,我阅读了类似的讨论,发现spy ++的维护者发表评论说,在退出时保存大小/位置的功能会在字体/ DPI更改后强制窗口进入错误的大小。我们的软件也是如此,但代码是在主应用程序中,而不是在对话框中。
答案 2 :(得分:0)
我在SDL OpenGL中有类似的问题。在无意识的应用程序上执行Windows DPI缩放的效果非常差,例如放大全屏视口并裁剪侧面。
我没有与清单有关的运气。
我能够通过调用SetProcessDPIAware();
来解决它,但是它必须在SDLmain执行之前发生。也许您的“启动过程中”还不够早。我将其用作main
函数之前的全局变量初始化器:
BOOL dpi_result = SetProcessDPIAware();
int main( int argc, char **argv )
{
//...