我试图降低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
。两者都为文本宽度提供相同的数字,并且两者都缺少显示整个字符串所需的实际像素值。
答案 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);