我正在创建一个包含自定义控件的应用程序(例如TMS TAdvSmoothLabel)。问题是当应用程序在字体设置为125%(120 DPI)的PC上运行时,似乎所有组件的字体都与表单一致,除了这些自定义控件。我假设问题(在我看来)是这些控件的Font属性不直接在控件中。例如,TLabel具有Label.Font,而TAdvSmoothLabel具有Label.Caption.Font,用于控制字体大小。
对于Segoe UI中尺寸为12且高度为-16的标签,它会缩放到13的大小和-22的高度。有没有办法手动为各种大小的字体执行此操作?或者是否有调用缩放字体的函数?
我也不想在表单上禁用缩放。
答案 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;