Delphi高DPI组件

时间:2018-10-31 13:55:49

标签: delphi highdpi

我对Delphi中的High-DPI应用程序有疑问。 在Internet上冲浪,我发现了ŽarkoGajić发表的一系列文章。这些文章讨论了为High-DPI准备创建Delphi应用程序。 该方法描述的很好,但是作者在每个单独的应用程序中使用了该方法;例如说说TSpeedButtons。

我的问题是:是否有一种方法也可以在组件中实现这种行为?例如,我正在实现一个类似于Embarcadero TSpeedButton的简单组件,但是使用了透明PNG图像。 组件内部的图像是在设计时从某些PNG图像加载的。我有一个TObjectDictionary,其中注册了按钮状态:启用,禁用等,以这种方式声明:

FGlyphs: TObjectDictionary<TGlyphState, TPicture>

在使用该组件的应用程序中,我从24 x 24像素的文件中加载PNG图像。当我在4K显示器上执行应用程序时,此图像变得很小。 如果我应用Žarko方法,所有方法都可以正常工作,但是以这种方式,使用我的组件的每个应用程序都需要实现此解决方案。

如何直接在组件内部实现它?我想在 SetGlyph 过程中实现它,就像下面的代码一样,但是我不知道这是否是正确的地方。

procedure TNCRSpeedButton.SetGlyphs(Index: TGlyphState; Value: TPicture);
begin
  FGlyphs.Items[Index].Assign(Value);
end;

TGlyphState的定义方式如下:

TGlyphState = (gtEnabled, gtDisabled, gtDown, gtOver);

爱神

1 个答案:

答案 0 :(得分:-1)

1)首先,您应该在Project Option -> Application -> your target platform -> Manifest file中启用选项Scale。从Delphi 10(西雅图)开始,此选项可用。

2)如果在W10操作系统中您有不同的TWinControl.ScaleBy,则可以计算并运行TToolButtons(适用于Forms)以调整窗口和一个特定窗口上的所有元素。

请参见https://github.com/KohrAhr/DelphiDemoPPI上的演示

演示包含Toolbar控件。