Windows标题栏中的可视错误,VCL样式启用了应用程序和显示缩放

时间:2016-12-19 18:49:13

标签: delphi c++builder vcl vcl-styles

目前我正在测试启用VCL样式的应用程序的各个方面。

我注意到,Windows缩放高于默认的96 dpi / 100%, VCL表格的图标和标题栏文字太大了 - 两者都要靠在一起 - 请参阅附页截图。对于200%或250%的更高标度(例如在4K显示器和Windows 10上使用),尤其如此,但即使缩放为144 dpi / 150%,问题也已经显现。

对于随RAD Studio提供的所有样式,都是如此。通过项目设置启用清单的高Dpi感知。 如果我在应用程序中禁用VCL样式,则图标和标题栏文本的大小正确。

我在这里遗漏了什么吗?在启用了显示缩放的情况下,提供的样式是否能够在没有开箱即用的显示错误的情况下工作?或者是否有某些设置我可以调整以解决此问题。

谢谢,

enter image description here enter image description here

3 个答案:

答案 0 :(得分:11)

VCL样式不能正确支持高DPI缩放。

如果您使用VCL样式,则应从应用程序清单中删除高DPI感知。

QP报告要求对VCL样式提供一般的高DPI支持: VCL styles don't scale properly under high DPI configurations

NC区域的相关QC报告:Styled form's non-client area incorrectly scaled under High DPI

答案 1 :(得分:2)

好的,这是我的视觉错误解决方案,请参阅附带的截图。我在Vcl.Forms.pas中的3个地方做了修复。

第一个修复程序,使用//标题栏修复1进行评论,解决了在具有VCL样式应用程序的默认96dpi Windows上,即使没有缩放也未正确绘制图标的问题。我可以根据James Johnston的WM_GETICON,ICON_SMALL2的调查结果解决这个问题, https://stackoverflow.com/a/35067909 谢谢,詹姆斯,为此!

另外两个修复解决了图标绘制得太大而启用了显示缩放的问题,以及图标和标题栏文本之间的距离太小。这些是在代码中使用//标题栏修复2和3注释的修复程序。 GetDpi只是当前dpi值的一个getter,我从应用程序中的C源获取。

结果绝不是完美的,但它现在可以做到这一点,VCL风格的应用程序在规模化的情况下至少是可以接受的。

感谢您的所有投入。

left original, right 'fixed'

Title bar fix 1

Title bar fix variables

Title bar fix 2

Title bar fix 3

答案 2 :(得分:0)

这是一个允许DPI感知应用程序中的VCL样式的单元。

VCL.Styles.DPIAware.pas

要使用该单元,只需将​​其添加到主窗体的implementation uses语句中,并将以下代码添加到FormCreate处理程序中。

procedure TFrmMain.FormCreate(Sender: TObject);
Var
  StyleDPIAwareness : TStyleDPIAwareness;
begin
  StyleDPIAwareness := TStyleDPIAwareness.Create(Self);
  StyleDPIAwareness.Parent := Self;

默认情况下,组件会将样式缩放为100%的倍数。您可以通过添加以下行来更改它:

StyleDPIAwareness.RoundScalingFactor := False;

使用此语句,样式将缩放为Screen.PixelsPerInch的任何缩放因子结果。大多数样式都可以正常工作,但有些样式可能会出现一些视觉缺陷。