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

时间:2017-02-12 18:55:34

标签: delphi properties

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

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

如果我输入Width的值,Delphi会将值存储在.dfm文件中。此外,还存储了PixelsPerInch值。如果我在使用100%的Windows DPI设置时放置宽度= 96,则将存储.dfm内部:

PixelsPerInch = 96
Width = 96

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

我也希望这也符合我的价值:

published
  property PopupWidth: Integer read FPopupWidth write FPopupWidth;

...但是Delphi没有对我的值应用PixelsPerInch处理。

为什么不呢?我该如何实现呢?

enter image description here

1 个答案:

答案 0 :(得分:2)

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

您可以覆盖控件的ChangeScale并按照以下方式实现:

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