2012-07-25 22 views
5

Dopo aver trascorso una buona quantità di tempo, cercare questa funzione:C#: una funzione che consente di regolare automaticamente i caratteri di base sulla dimensione del controllo in fase di esecuzione?

Ho pensato che sarebbe bello se qualcuno potesse darmi il modo migliore per farlo. Esiste una funzione che può regolare dinamicamente la dimensione del carattere di base sulla dimensione di qualsiasi controllo di forma di finestra (etichetta/pulsante)?

Questo è quello che ho dopo la ricerca online, purtroppo questi codici danno molta eccezione durante il tempo di esecuzione quando il controllo ridimensiona.

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; 
     } 
    } 

Non credo che ho fatto il mio modo di affrontare questo è giusto, qualcuno sa un modo che sarà regolare la dimensione del carattere di base anche quando aumentare e diminuire la dimensione del controllo in fase di esecuzione? Personalmente penso che questo post sarà un ottimo post per gli altri a cui fare riferimento.

risposta

3

Questo è un tipo di codice molto problematico, la dimensione corretta del carattere non è molto correlata alla dimensione del controllo. Né è una cosa comune da fare, un'interfaccia utente dovrebbe essere leggibile e coerente a qualsiasi dimensione della finestra. In caso contrario, non è chiaro quale tipo di eccezioni stai vedendo. Errori evidenti si sarebbero dimenticati di disattivare la proprietà AutoSize dell'etichetta e di non rendere l'etichetta abbastanza alta. Qualche codice con cui giocare, fai attenzione che è adatto solo per un'etichetta. Cadere una sul modulo prima di incollare questo codice:

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); 
    } 
} 

Necessita miglioramento, il metodo MeasureText() deve essere realizzata TextFormatFlags che utilizza il controllo Label. Ma questo ha funzionato abbastanza bene come pubblicato.

+0

TextRenderer mi dà sempre un mal di testa, questa funzione è un po 'complicata a mio parere. –

Problemi correlati