Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何手动缩放组件';s字体在Delphi中的DPI发生变化?_Delphi_Fonts_Scaling_Delphi 2007 - Fatal编程技术网

如何手动缩放组件';s字体在Delphi中的DPI发生变化?

如何手动缩放组件';s字体在Delphi中的DPI发生变化?,delphi,fonts,scaling,delphi-2007,Delphi,Fonts,Scaling,Delphi 2007,我正在创建一个包含自定义控件(如TMS TAdvSmoothLabel)的应用程序。问题是,当应用程序在字体设置为125%(120 DPI)的PC上运行时,除了这些自定义控件外,所有组件的字体似乎都会随窗体缩放。我假设问题(在我看来)在于这些控件的字体属性不直接在控件中。例如,TLabel有Label.Font,而TAdvSmoothLabel有Label.Caption.Font,用于控制字体大小 对于Segoe UI中大小为12、高度为-16的标签,它将缩放为大小为13、高度为-22的标签。

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

对于Segoe UI中大小为12、高度为-16的标签,它将缩放为大小为13、高度为-22的标签。有没有一种方法可以手动为各种大小的字体执行此操作?或者是否有可调用的函数来缩放字体


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

由于注释长度有限,我需要在回答中发布此内容。要处理缩放,您需要覆盖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;

Ian Boyd的副本在DPI字体处理方面有一个很好的答案。@Graymatter,这是一个很好的答案,但我对他的解决方案的工作原理有点困惑。他似乎在说,所有组件都有相同的起始字体类型/大小(我的表单不一定这样做),因此所有组件的比例因子都是相同的。基本上,我知道哪些组件存在这种缩放问题,我只希望缩放那些我知道已损坏的组件的字体,如果这样做有意义的话。因此,给定96dpi的随机字体,是否有可能计算出120dpi的大小/高度变化?谢谢你的评论。也许你应该修理坏了的机器components@DavidHeffernan,我联系了从(TMS)购买组件的公司,但除了“尝试设置Scaled=False并以Create-use-ScaleBy(Screen.PixelsPerInch,PixelsPerInch)的形式创建使用ScaleBy(Screen.PixelsPerInch,PixelsPerInch);”之外,尚未获得任何支持本质上,它做的事情与保持Scaled=True完全相同。我只是希望这里的人会有其他想法,不需要改变组件,只需要手动缩放它们的字体,比如在FormCreate中。谢谢。你有组件的来源。您可以自己修复。这似乎可以缩放组件项目,但并不总是与缩放项目的高度相匹配。”M'应该是新的PPI,D'应该是应用程序开发时使用的PPI,对吗?因此,在120 PPI和96 PPI开发的应用程序中,比例应为125%。Font.Height=-16的标签将缩放到-22,这似乎是135%+,而这将缩放到-20。在计算新高度时,是否还有其他因素?这些项目中的某些项目如何定位或对齐可能存在问题吗?谢谢好吧,现在我想起来了,这是由应用程序本身处理的,所以通过的'M'和'D'可能不是我最初认为的120和96?@EvanZimmerman根据我的经验,你需要非常小心锚定和缩放。它们并不总是正常工作。对齐看起来很好,锚定,不总是,但这只与定位有关,而与字体大小无关。字体的比例应始终正确。您可以启用调试dcu,然后在TControl.ChangeScale方法中放置一个断点,以查看传递的数据。