gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:38:20 28 4
gpt4 key购买 nike

如果 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就是Form的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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com