缩小文本字体以适应TLabel

Firemonkey: Shrink text font to fit in TLabel

本文关键字:TLabel 文本 字体 缩小      更新时间:2023-10-16

我正在尝试降低TLabel的字体大小,如果它的文本太大而无法适应标签的范围。我没有看到我可以在标签上设置任何属性来实现这一点,所以我尝试编写自己的方法。我的方法是使用TCanvas。texttwidth用于测量标签中文本的宽度,并收缩字体,直到文本的宽度适合标签的宽度。

void __fastcall ShrinkFontToFitLabel( TCanvas * Canvas, TLabel * Label )
{
    float NewFontSize = Label->Font->Size;
    Canvas->Font->Family = Label->Font->Family;
    Canvas->Font->Size = NewFontSize;
    while( Canvas->TextWidth( Label->Text ) > Label->Width && NewFontSize > MinimumFontSize )
    {
        NewFontSize -= FontSizeDecrement;
        Canvas->Font->Size = NewFontSize;
    }
    Label->Font->Size = NewFontSize;
}

这在某些时候是有效的,但是其他时候它不会把字体缩得足够近。似乎我从调用Canvas->TextWidth得到的值很多次,比标签实际需要的像素宽度要小得多,以便适合文本。

我使用Canvas->TextWidth错误吗?是否有更好的方法来计算字符串的宽度,或者重新调整TLabel的字体大小,使其文本适合其尺寸?

编辑:
在这种情况下,我正在传递给我的函数,我的标签所在的TCanvas。我试过使用TCanvas以及Label->Canvas。它们都为文本宽度提供了相同的数字,并且都缺少显示整个字符串所需的实际像素值。

下面的代码摘自FMX应用程序中的代码,稍微修改了一下,删除了正在遍历的数组,并在函数中局部声明了一个变量。它在TForm方法中运行。画布这里是窗体的画布。你可以看到我在某处用了"- 35"——这可能是因为数字不太对。

double InitialFontSize = 30;    
Canvas->Font->Size = InitialFontSize;
StoryHeadlineLabel->Font->Size = InitialFontSize;
bool fits = false;
do
{
    double widthA = Canvas->TextWidth (StoryHeadlineLabel->Text);
    if (widthA > StoryHeadlineLabel->Width - 35)
    {
        StoryHeadlineLabel->Font->Size --;
        Canvas->Font->Size --;
    }
    else
        fits = true;
    if (StoryHeadlineLabel->Font->Size < 6)
        fits = true;
} while (!fits);