缩小文本字体以适应TLabel
Firemonkey: Shrink text font to fit in TLabel
我正在尝试降低TLabel
的字体大小,如果它的文本太大而无法适应标签的范围。我没有看到我可以在标签上设置任何属性来实现这一点,所以我尝试编写自己的方法。我的方法是使用TCanvas。texttwidth用于测量标签中文本的宽度,并收缩字体,直到文本的宽度适合标签的宽度。
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方法中运行。画布这里是窗体的画布。你可以看到我在某处用了"- 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++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何根据单词在文本中出现的概率输出单词
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 缩小文本字体以适应TLabel
- c++ Builder TLabel有时会得到乱码文本