2012-07-25 118 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()方法應使用TextFormatFlags的Label控件的用途。但是,這張貼的效果已經足夠好了。

+0

TextRenderer總是讓我頭疼,這個功能在我看來有點棘手。 – 2012-07-31 06:49:45