gpt4 book ai didi

delphi - 如何在高 dpi 值下实现视觉继承?

转载 作者:行者123 更新时间:2023-12-01 22:31:02 24 4
gpt4 key购买 nike

我有以下示例表单 TForm1,带有两个按钮 (BitBtn):

base form

此外,我还有第二个表单TForm2,它是从第一个表单派生的。第二个按钮移至左侧并添加另一个按钮:

derived form

在运行时(Windows 7),第二种形式如下所示:

standard font size

如果我将字体缩放更改为 125%,我的表单将如下所示:

increased font size

不知何故,新按钮的位置和大小都不正确。对此我能做什么?

我使用了以下.dfm 文件(缩短):

object Form1: TForm1
Left = 0
Top = 0
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object BitBtn1: TBitBtn
Left = 8
Top = 8
Width = 105
Height = 105
Caption = 'BitBtn1'
end
object BitBtn2: TBitBtn
Left = 359
Top = 8
Width = 105
Height = 105
Caption = 'BitBtn2'
end
end

inherited Form2: TForm2
Caption = 'Form2'
PixelsPerInch = 96
TextHeight = 13
inherited BitBtn2: TBitBtn
Left = 191
Top = 7
ExplicitLeft = 191
ExplicitTop = 7
end
object BitBtn3: TBitBtn
Left = 359
Top = 8
Width = 105
Height = 104
Caption = 'BitBtn3'
end
end

类文件在设计者生成时保持不变。它们不包含相关代码。

最佳答案

我自己找到了一个可能的解决方案:必须用以下内容覆盖 ReadState以下代码:

procedure TForm2.ReadState(Reader: TReader);
begin
IntPtr(FReserved) := 0;
inherited;
end;

这看起来很奇怪。它是如何工作的?

我查看了VCL源代码,发现表单加载后的缩放是在 TForm.ReadState(...) 中完成的。显然, protected TControl 的字段 FReserved 用于存储当前应用的 DPI 值:

  • 首先,我的基类 dfm 的所有组件都会被读取
  • 然后它们会被正确缩放和定位
  • 当前应用的 DPI 值存储在 FReserved
  • 之后再次调用ReadState,获取派生类的dfm文件
  • 但由于 FReserved 中的值,缩放不会应用于派生表单的组件

因此,一种想法是在读取组件之前重置缓存的 DPI 值。它将 Form1 的组件缩放两次,但这并没有什么坏处,因为原始大小和位置会被记住作为缩放的基值,并且结果完全相同。

关于delphi - 如何在高 dpi 值下实现视觉继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44811158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com