加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 在Windows Vista和Windows 7中排除DPI虚拟化和DPI感知

发布时间:2020-12-15 10:15:50 所属栏目:大数据 来源:网络整理
导读:我有一个问题,其中应用程序(用Delphi编写)在所有系统上的默认96 DPI设置下正常运行,但在不同系统上的“150%文本大
我有一个问题,其中应用程序(用Delphi编写)在所有系统上的默认96 DPI设置下正常运行,但在不同系统上的“150%文本大小”(内部144 dpi)设置上的行为不一致。似乎在某些系统上,我的应用程序的某些文本/字体部分正在被拉伸,而在其他系统上,它们不是。我会以为,某个版本的Windows(Win7)上的应用程序在某个DPI上应该有相同的方式。

我的应用程序将使它知道Windows,它不需要DPI虚拟化功能,否则不会。我很了解我不明白的是DPI更改如何在两台机器上造成不同的外观,两台机器都以144 dpi的速度运行Windows 7,以相同的固定尺寸显示相同的字体和形式。

在DPI虚拟化中涉及到某些与配置有关的元素,我需要在Windows(注册表等)中进行检查?否则,您如何解决并了解DPI虚拟化是否在客户端窗口中完成?

在Delphi中,必须将TForm.Scaled属性设置为false,如果不希望缩放。但是我不明白的是,当主窗体的Scaled属性是真实的,我不能总是预测结果。

在我的应用程序中对我来说最令人困惑的是,我有一个控制,只能在我的大型真实应用程序中存在不正当行为,但是在单独的应用程序中,我不会轻易地调试控件。要了解独立应用程序中的控制行为,我被迫做一个演示应用程序,我通过清单文件强制DPI的意识。然后,我可以重现控制图故障,尽管以不同的形式。

这是我在演示应用程序中使用的清单文件,它暴露了我的控件在Windows中处理高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>
  <assemblyIdentity version="14.0.3615.26342" processorArchitecture="*"            
   name="TestProject" type="win32"></assemblyIdentity>
  <description>High DPI Controls Test App</description>
</assembly>

这里是一个例子,约30个地方之一,当我的应用程序禁用DPI虚拟化时,我的应用程序中的控件被搞砸了。这个特殊的故障是通过关闭我的形式的Scaled属性来解决的。但在其他地方,TForm.Scaled = false会导致问题,而在某些形式中,它会修复它:

更新:事实证明,我的一些控件使用GDI,GDI上下文中的字体行为与正常GDI上下文中的字体行为不同,至少对于使用GDI的某些第三方控件。这是头痛的主要来源。其次,在VCL中有DPI意识的测试覆盖面和定义不明确的要求。一些VCL控件是基于MS Common Controls的,而在高DPI情况下,底层公共控件可能正常工作是可以公平的,并不是所有的VCL控件包装器都能保证正常工作。因此,在所有控件中检查高DPI意识的应用程序,以及所有可用的Windows 7主题中的正确行为:

>航空玻璃,在96dpi(大多数现代硬件的默认Win7外观)
>基本主题(aero glass off),但xp主题启用
>经典的win2000看看玻璃是否关闭,以及xp级别的主题,
>高对比度白色
>高对比度黑色
>各种其他96-DPI设置

..和列表继续,你有一个相当沉重的负担,作为一个应用程序开发人员。无论您是Delphi用户还是使用VCL,或者您是MFC / ATL C开发人员,在我看来,支持所有各种古怪的Windows模式都是一个负担太重了。所以大多数人不打扰。我对吗?

解决方法

您需要显示您的应用程序是DPI感知与一个这样的部分:
<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>

如果这样做,那么你将不会得到DPI虚拟化。

您不是要使用DPI虚拟化,所以我认为没有办法解决它的工作原理。它可以很容易地依赖于显卡驱动程序。我们几乎不可能解释为什么虚拟化的行为是这样的:你甚至没有给出任何屏幕截图,硬件细节等等。但是,你根本不应该打扰这个诊断。清单是dpiaware,这是一个非问题。

作为参考,我提供给你:

> Writing High-DPI Win32 Applications
> http://www.rw-designer.com/DPI-aware

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读