Delphi 如何在组件的属性中使用DPI感知值?

Delphi 如何在组件的属性中使用DPI感知值?,delphi,properties,Delphi,Properties,我正在开发一个带有弹出窗口的文本编辑器组件。在我的组件的属性编辑器中设置designtime时,应设置弹出窗口的宽度 如何将设置的宽度应用于屏幕分辨率 如果我为宽度输入一个值,Delphi会将该值存储在.dfm文件中。还存储了一个pixelsprench值。如果在使用100%的Windows DPI设置时将宽度设置为96%,则.dfm内部将存储: PixelsPerInch = 96 Width = 96 如果我现在将Windows DPI设置更改为150%,并在Delphi中重新打开此项目,

我正在开发一个带有弹出窗口的文本编辑器组件。在我的组件的属性编辑器中设置designtime时,应设置弹出窗口的宽度

如何将设置的宽度应用于屏幕分辨率

如果我为宽度输入一个值,Delphi会将该值存储在.dfm文件中。还存储了一个
pixelsprench
值。如果在使用100%的Windows DPI设置时将宽度设置为96%,则.dfm内部将存储:

PixelsPerInch = 96
Width = 96
如果我现在将Windows DPI设置更改为150%,并在Delphi中重新打开此项目,属性编辑器将显示宽度为148

我也希望有这样的价值:

published
  property PopupWidth: Integer read FPopupWidth write FPopupWidth;
。。。但是Delphi没有为我的值应用PixelsPerInch处理

为什么不呢?我如何实现这一点


此缩放机制由VCL中的显式代码处理。该框架提供了
TControl
的虚拟
ChangeScale
方法,允许您的控件参与

您将覆盖控件的
ChangeScale
,并按如下方式实现它:

procedure TMyControl.ChangeScale(M, D: Integer);
begin
  if sfWidth in ScalingFlags then
    PopupWidth := MulDiv(PopupWidth, M, D);
  inherited;
end;

这种缩放机制由VCL中的显式代码处理。该框架提供了
TControl
的虚拟
ChangeScale
方法,允许您的控件参与

您将覆盖控件的
ChangeScale
,并按如下方式实现它:

procedure TMyControl.ChangeScale(M, D: Integer);
begin
  if sfWidth in ScalingFlags then
    PopupWidth := MulDiv(PopupWidth, M, D);
  inherited;
end;

-“为什么不?”-因为编译器不能读懂你的心思。-“.how..”-我认为您应该看到TCustomForm.ReadState中的代码。这也可能是相关的:它也不会缩放非像素计数的其他整数值。它应该缩放吗?@DavidHeffernan:是的,它应该缩放-这就是我想要的。我如何告诉Delphi缩放属性?你想让它自动DPI缩放所有整数属性吗?@DavidHeffernan:不,只有一个属性。-“为什么不?”-因为编译器无法读懂你的心思。-“.how..”-我认为您应该看到TCustomForm.ReadState中的代码。这也可能是相关的:它也不会缩放非像素计数的其他整数值。它应该缩放吗?@DavidHeffernan:是的,它应该缩放-这就是我想要的。如何让Delphi缩放属性?是否希望它自动DPI缩放所有整数属性?@DavidHeffernan:不,只有一个属性。