我的应用程序将使它知道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模式都是一个负担太重了。所以大多数人不打扰。我对吗?
解决方法
<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