要么我的应用程序会向Windows表明它不需要DPI虚拟化功能,要么不需要。这一点我理解得很清楚。但我不理解的是,DPI更改如何导致两台机器上的外观不同,这两台机器都运行Windows 7,都在144 dpi下,以相同的固定大小显示相同的字体和窗体。
在DPI虚拟化中是否涉及某些配置相关元素,需要我在Windows中进行检查(注册表等)?否则,您如何排除故障并知道客户端窗口是否正在进行DPI虚拟化?
在Delphi中,如果不想进行缩放,则必须将TForm.Scaled属性设置为false。但我不理解的是,当主窗体的Scaled属性为true时,我无法始终预测结果。
在我的应用程序中最令我困惑的是,我有一个控件在我的大型实际应用程序中表现不良,但在我试图调试该控件的独立应用程序中没有表现不良。为了了解独立应用程序中控件的行为,我被迫制作一个演示应用程序,通过清单文件强制进行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主题中的正确行为:
- 启用了aero glass,在96dpi下(在大多数现代硬件上的默认Win7外观)
- 基本主题(关闭了aero glass),但启用了xp主题
- 经典的win2000外观,其中玻璃关闭了,以及xp级别的主题,
- 高对比度白色
- 高对比度黑色
- 各种非96-DPI设置
......列表还在继续。作为应用程序开发人员,你有相当沉重的负担。无论你是Delphi用户并使用VCL,还是MFC / ATL C ++开发人员,似乎支持所有各种奇特的Windows模式是一个几乎难以承受的负担。因此,大多数人不会费心。我是对的吗?
TListBox
真是太好用了! - David Heffernan