Delphi 3报告的屏幕宽度和高度不正确

时间:2014-12-24 20:01:25

标签: delphi

我有一个Delphi 3应用程序,已经广泛分发至少十年。今天我收到一份报告称该应用程序在华硕Transformer T100TA-C1-GR(S)Windows 8平板电脑上无法正常运行。具体来说,该应用程序拒绝运行,因为它检测到的屏幕分辨率太小,无法让应用程序正确显示自己。在应用程序中,我有以下条件检查:

 if (Screen.Width < 800) or (Screen.Height < 600) then begin
    // display a message reporting screen resolution too low
    ShowMessage('blah blah...');
    Application.Terminate;

当我编译我的应用程序的特殊版本以帮助调试问题并将应用程序提供给抱怨用户时,他们会报告以下数字:

    Width: 980
    Height: 550

这是我添加了特殊编译的额外代码,然后我给用户:

 ShowMessage('Width: ' + IntToStr(Screen.Width) + #13#10 +
    'Height: ' + IntToStr(Screen.Height));

然而,用户发誓他们的平板电脑配置为1368x768。他们甚至切换到1024x768,Delphi也报告了相同的错误数字。

所有TForm.Scaled属性都设置为False。

可能有帮助的一条线索......屏幕宽度和高度检测代码(上图)在以下程序中运行:

 procedure TForm1.WMDisaplayChange(var m: TWMDisplayChange);

知道可能会发生什么吗?

1 个答案:

答案 0 :(得分:8)

您的应用程序受DPI虚拟化的影响。您的应用尚未向系统表明它知道并支持高DPI显示设备。有问题的机器使用大于125%的字体缩放。那是DPI的高点截止点。除了这种扩展,系统还可以虚拟化非DPI感知应用的字体缩放。来自documentation

  

Windows Vista引入了一项名为DPI虚拟化的功能,该功能为不支持DPI的应用程序提供了一定程度的自动扩展支持。通过此功能,Windows可以扩展不支持DPI的应用程序的文本和UI元素的大小,以便在高DPI设置下适当调整大小,而无需更改应用程序。这可以防止在高DPI屏幕上应用程序渲染太小时发生的潜在可用性和可读性问题。

     

在Windows Vista到Windows 8中,此功能为不支持DPI的应用程序提供“虚拟化”系统指标和UI元素,就好像它们以96 DPI运行一样。然后,应用程序渲染到96 DPI离屏表面,DWM缩放生成的应用程序窗口以匹配DPI设置。例如,如果DPI显示设置为144,则DWM将应用程序的窗口缩放150%或144/96。

这样做的结果是系统伪造了屏幕尺寸。当您的应用程序进行DPI虚拟化时,系统会报告虚拟化维度而不是真实维度。

最佳做法是声明您的应用程序具有高DPI感知能力,并根据用户的字体缩放首选项缩放UI。当然,这对你来说是一个很大的变化。可能不是你想要的人之一。

另一个选择是要求用户使用缩小的字体缩放。他们可能也不会非常热衷于此。

另一种选择是将您的应用程序显示为高DPI感知并继续不扩展它。然后它肯定会运行,但它不会尊重用户的字体缩放首选项。再次,我想用户将是非加号的。

如果您当前没有显示您的应用,那么现在这样做将导致它不被虚拟化。我的意思是应用虚拟化而不是DPI虚拟化。虽然您确实不应该仍在运行虚拟化,但如果禁用虚拟化,则可能会遇到麻烦。

Sertac建议另一种选择。让用户为您的应用程序应用兼容性设置以禁用DPI虚拟化。您可以将其应用到今天的应用程序,而无需重新编译,至少您的用户将能够取得进展。

从根本上说,用户的机器设置存在问题。如果它有768个垂直像素和大约140%的缩放比例,那么它实际上是100%缩放,相当于550像素。这不是很多像素。你的应用程序是反对的,因为屏幕太小了,好吧,也许情况确实如此。

此处的各种答案可能对您有用:How do I make my GUI behave well when Windows font scaling is greater than 100%