Firemonkey:缩小文本字体以适应TLabel

时间:2015-09-28 18:31:33

标签: c++ firemonkey c++builder-xe8 tlabel

我试图降低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。我尝试使用TCanvas以及Label->Canvas。两者都为文本宽度提供相同的数字,并且两者都缺少显示整个字符串所需的实际像素值。

1 个答案:

答案 0 :(得分:1)

以下代码取自在FMX应用程序中工作的代码,稍作修改以删除正在迭代的数组并在函数本地声明变量。它以TForm方式运行。这里的画布是Form&#39的画布。你可以看到我正在使用" - 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);