如何在Delphi中使用DPI更改手动缩放组件的字体?

时间:2014-02-04 20:26:31

标签: delphi fonts scaling delphi-2007

我正在创建一个包含自定义控件的应用程序(例如TMS TAdvSmoothLabel)。问题是当应用程序在字体设置为125%(120 DPI)的PC上运行时,似乎所有组件的字体都与表单一致,除了这些自定义控件。我假设问题(在我看来)是这些控件的Font属性不直接在控件中。例如,TL​​abel具有Label.Font,而TAdvSmoothLabel具有Label.Caption.Font,用于控制字体大小。

对于Segoe UI中尺寸为12且高度为-16的标签,它会缩放到13的大小和-22的高度。有没有办法手动为各种大小的字体执行此操作?或者是否有调用缩放字体的函数?

我也不想在表单上禁用缩放。

1 个答案:

答案 0 :(得分:2)

由于评论篇幅有限,我需要在答案中发帖。要处理缩放,您需要覆盖ChangeScale,如下所示:

procedure ChangeScale(M, D: Integer); override;


procedure TMyControl.ChangeScale(M, D: Integer);
begin
  inherited;
  // Now update the internal items that need to be scaled
  Label.Caption.Font.Height := MulDiv(Label.Caption.Font.Height, M, D);
  // Other items go here
end;

组件应该为内部项目执行此操作。您可以修改源代码以扩展应该缩放的内容,也可以创建自己的控件来继承它并在那里进行。

如果有一些变化意味着你很可能不得不改变他们的代码,他们的组件应该已经做了类似的事情。在这种情况下的另一种选择是做一些像这样凌乱的事情:

procedure TMyControl.ChangeScale(M, D: Integer);
var
  OldHeight: Integer;
begin
  OldHeight := Label.Caption.Font.Height;
  inherited;
  // Overwrite the bad scaling in the component
  Label.Caption.Font.Height := MulDiv(OldHeight, M, D);
  // Other items go here
end;