2012-07-25 25 views
5

この関数の検索に時間を費やした後:C#:実行時にコントロールのサイズに基づいてフォントを自動的に調整する関数ですか?

誰かが私に最良の方法を与えることができればいいと思っていました。 任意のウィンドウフォームコントロール(ラベル/ボタン)のサイズに合わせてフォントサイズを動的に調整できる機能はありますか?

これは私がオンラインで調査した後のものですが、残念ながら、これらのコードは、コントロールのサイズ変更時に実行時に多くの例外が発生します。私はこれが正しいと取り組むの私の方法は、誰もフォントサイズのベースを調整したときに増加し、実行時にコントロールのサイズを小さくします方法を知っているんでした

public void textAdjustment() 
    { 
     try 
     { 
      while (this.label.Width < System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, 
       new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Width) 
      { 
       this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size - 1.0f, this.label.Font.Style); 
      } 
      if (this.label.Width > System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Width) 
      { 
       this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size + 0.1f, this.tableLabel.Font.Style); 
      } 
      if (this.label.Height < System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Height) 
      { 
       this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size - 0.6f, this.label.Font.Style); 
      } 
     } 
     catch (Exception e) 
     { 
      this.label.Font = Control.DefaultFont; 
     } 
    } 

私は思いませんか? 私は個人的には、この投稿はほかの人も同様に参照できる非常に良い投稿と思われます。

答えて

3

これは非常に面倒な種類のコードですが、フォントの適切なサイズはコントロールのサイズとよく相関していません。それは一般的なことでもありません。UIは、どのウィンドウサイズでも読みやすく、一貫性があります。そうでなければ、あなたが見ている例外の種類は非常に不明です。明白な間違いは、ラベルのAutoSizeプロパティをオフにして、ラベルを十分に大きくしないことを忘れることです。いくつかのコードは、レーベルにしか適していないことに注意してください。このコードを貼り付ける前に、フォームのいずれかをドロップ:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     label1.AutoSize = false; 
     label1.Size = new Size(100, 60); 
     label1.Text = "Autosize this"; 
     label1.Anchor = AnchorStyles.Left | AnchorStyles.Right; 
     label1.Resize += new EventHandler(label1_Resize); 
    } 

    void label1_Resize(object sender, EventArgs e) { 
     using (var gr = label1.CreateGraphics()) { 
      Font font = label1.Font; 
      for (int size = (int)(label1.Height * 72/gr.DpiY); size >= 8; --size) { 
       font = new Font(label1.Font.FontFamily, size, label1.Font.Style); 
       if (TextRenderer.MeasureText(label1.Text, font).Width <= label1.ClientSize.Width) break; 
      } 
      label1.Font = font; 
     } 
    } 

    protected override void OnLoad(EventArgs e) { 
     label1_Resize(this, EventArgs.Empty); 
     base.OnLoad(e); 
    } 
} 

それは改善が必要、のmeasureText()メソッドは、Labelコントロールが使用するTextFormatFlagsを使用すべきです。しかし、これは十分にうまくいった。

+0

TextRendererは常に私に頭痛を与えます、この機能は私の意見では少しトリッキーです。 –

関連する問題