Я пытаюсь уменьшить размер шрифта 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. Холст здесь — это Холст Формы. Вы можете видеть, что я использую «- 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);
Других решений пока нет …