我正在尝试减小TLabel的字体大小,如果其文本较大以适合标签的范围。我没有看到可以在标签上设置的任何属性来实现此目的,因此我尝试编写自己的方法。我的方法通过使用TCanvas.TextWidth来测量标签中文本的宽度,并缩小字体直到文本宽度适合标签的宽度来工作。

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)。我尝试使用TCanvasLabel->Canvas。两者都为我提供了相同的文本宽度数字,并且均不足以显示整个字符串所需的像素实际值。

最佳答案

以下代码摘自FMX应用程序中可用的代码,并对其进行了稍微的修改以删除正在迭代的数组,并在函数的本地声明变量。它正在TForm方法中运行。 Canvas 是表单的 Canvas 。您会看到我在某一时刻使用“-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);

关于c++ - Firemonkey:缩小文本字体以适合TLabel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32829548/

10-11 22:46
查看更多