1

TLabelテキストが大きすぎてラベルの範囲に収まらない場合は、 a のフォント サイズを小さくしようとしています。これを実現するためにラベルに設定できるプロパティが見つからなかったため、独自のメソッドを作成してみました。私の方法は、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. どちらもテキスト幅に同じ数値を与え、両方とも文字列全体を表示するために必要なピクセル単位の実際の値を下回っています。

4

1 に答える 1

1

次のコードは、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);
于 2015-09-30T13:47:51.007 に答える