Firemonkey:缩小文本字体以适应 TLabel
Firemonkey: Shrink text font to fit in 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
。两者都为我提供了相同的文本宽度数字,并且都缺少显示整个字符串所需的实际像素值。
以下代码取自在 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);
如果 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
。两者都为我提供了相同的文本宽度数字,并且都缺少显示整个字符串所需的实际像素值。
以下代码取自在 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);