コントロールの幅に合わせてフォントサイズを自動的に調整する方法は?

文書番号 : 27457     文書種別 : 使用方法     最終更新日 : 2009/08/05
文書を印刷する
対象製品
ActiveReports for .NET 6.0J Standard
詳細
申し訳ございませんが、コントロールの幅に合わせて、自動的にフォントサイズを調整する直接的な機能は用意されておりません。

文字列の長さを測る機能としては、Pageクラスの MeasureText や MeasureParagraphHeightメソッドがあります。
たとえば、TextBox の幅が決まっていて、できるだけ大きなフォントを使用したい場合は、以下のような処理が考えられます。
(※以下のコードは、対象となるコントロールの CharacterSpacing/LineSpacingプロパティが 0 であることが前提です。)

◆サンプルコード(VB.NET)
' フォントの配列を宣言します。
Private fonts() As System.Drawing.Font

Private Sub SampleReport_ReportStart(...) Handles Me.ReportStart

  ' フォントのポイント数を設定します。小から大に並べます。
  Dim fontSizes() _
    = {7.0F, 8.0F, 10.5F, 12.0F, 14.0F, 16.0F, 20.0F, _
     24.0F, 28.0F, 32.0F, 36.0F, 42.0F, 48.0F}

  ' fontsのサイズを再設定します。
  ReDim fonts(fontSizes.Length - 1)

  ' TextBox1のフォントの属性をできるだけ保持する。
  Dim orgFont As Font = Me.TextBox1.Font

  ' TextBox1の属性と、ポイント数から、フォントの配列を
  ' 生成します。
  For i As Integer = 0 To fontSizes.Length - 1
    Dim f As Font = New Font(orgFont.FontFamily, fontSizes(i), orgFont.Style)
    fonts(i) = f
  Next
End Sub

Private Sub Detail_Format(...) Handles Detail.Format

  ' ダミーのPageを生成します。
  Dim MeasurePage As Page = New Page

  ' TextBox1のデフォルトを最小のフォントにします。
  Me.TextBox1.Font = fonts(0)

  For i As Integer = 0 To fonts.Length - 1
    ' ダミーのページにフォントを小さい順に設定します。
    MeasurePage.Font = fonts(i)

    ' 表示に必要なサイズを計算します。
    Dim size As SizeF = MeasurePage.MeasureText(Me.TextBox1.Text)

    ' 表示に必要なサイズがTextBoxのサイズを上回ったら、ループを抜けます。
    If (size.Width > Me.TextBox1.Width) OrElse (size.Height > Me.TextBox1.Height) Then
      Exit For
    End If

    ' 表示可能なフォントサイズを設定します。
    Me.TextBox1.Font = fonts(i)
  Next

End Sub


◆サンプルコード (C#)
// フォントの配列を宣言します。
private System.Drawing.Font[] fonts;

private void NewActiveReport1_ReportStart(object sender, EventArgs e)
{
  // フォントのポイント数を設定します。小から大に並べます。
  float[] fontSizes = { 7f, 8f, 10.5f, 12f, 14f, 16f, 20f, 24f, 28f, 32f, 36f, 42f, 48f };
  // fontsのサイズを再設定します。
  fonts = new Font[fontSizes.Length];

  // textBox1のフォントの属性をできるだけ保持するようにします。
  Font orgFont = this.textBox1.Font;

  // textBox1の属性と、ポイント数から、フォントの配列を生成します。
  for (int i = 0; i < fontSizes.Length; i++)
  {
    Font f = new Font(orgFont.FontFamily, fontSizes[i], orgFont.Style);
    fonts[i] = f;
  }
}

private void detail_Format(object sender, EventArgs e)
{
  // ダミーのPageを生成します。
  Page MeasurePage = new Page();

  // textBox1のデフォルトを最小のフォントにします。
  this.textBox1.Font = fonts[0];

  for (int i = 0; i < fonts.Length; i++)
  {
    // ダミーのページにフォントを小さい順に設定します。
    MeasurePage.Font = fonts[i];

    // 表示に必要なサイズを計算します。
    SizeF size = MeasurePage.MeasureText(this.textBox1.Text);

    // 表示に必要なサイズがTextBoxのサイズを上回ったら、ループを抜けます。
    if (size.Width > this.textBox1.Width || size.Height > this.textBox1.Height)
    {
      break;
    }

    // 表示可能なフォントサイズを設定します。
    this.textBox1.Font = fonts[i];
  }
}
関連情報
キーワード
HowTo デザイン・レイアウト

この文書は、以前は次のFAQ IDで公開されていました : 12133