2013-08-06 5 views
5
an

Gibt es eine Möglichkeit, die Größe eines Formulars an die Größe seines Titels/Überschrifttextes anzupassen?Passen Sie die Größe eines Formulars an den Titeltext in C#

Zum Beispiel offiziell C# Message Box Formulare an die Größe des Titeltextes anpassen (Beachten Sie die Lorem ipsum):

Normal Message Box

Andere Formen werden nicht passen ihre Größe an, dass ihre Titeltext:

Other form

Stattdessen wird ein Auslassungszeichen am Ende hinzugefügt, um die Größe in der „size“ Eigenschaft von t erwähnt passen er Designer.

Gibt es eine Möglichkeit, das Formular an die Größe des Titels anstelle der Größe anzupassen, die wir erwähnen? Wenn nicht, gibt es eine Möglichkeit, die volle Länge des Textes zu erhalten, damit wir ihn dem Formular zuweisen können? mit

int topTextWidth = TextRenderer.MeasureText(this.Text, this.Font).Width; 
this.Width = topTextWidth; 

Aber this.Font bezieht sich offenbar auf eine andere Schriftgröße

Ich versuchte, die Breite des Formulars festlegen.

+5

Wahrscheinlich möchten Sie 'SystemFonts.CaptionFont' verwenden. Beachten Sie auch, dass die "Breite" die Grenzen, das Symbol, die Schaltflächen zum Minimieren/Maximieren/Schließen und die Abstände/Abstände dazwischen berücksichtigen muss. – JosephHirn

+1

Danke für den Hinweis.Ich weiß, dass es in C# Möglichkeiten gibt, die Breite der X-Schaltfläche und den Abstand darum zu kennen. Ich werde eine Antwort posten, sobald ich die Antwort kenne. – CydrickT

Antwort

7

Für diejenigen, die eine vollständige Antwort wollen, hier ist es.

Die eigentliche Linie, die die Form nach dem Beschriftungstext ändert die Größe ist die folgende:

this.Width = TextRenderer.MeasureText(this.Text, SystemFonts.CaptionFont).Width + AllButtonsAndPadding; 

AllButtonsAndPadding enthält die Breite aller Tasten (minimieren, maximieren und schließen), um die Fenstergrenzen und das Symbol. Um diese Informationen zu erhalten, braucht es ein bisschen Codierung. Hier sehen Sie ein vollständiges Beispiel für ein Formular, das seine Größe ändert, unabhängig davon, welche Schaltflächen oder Symbole Sie verwenden.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Windows.Forms.VisualStyles; 

namespace WindowAutoAdapt 
{ 
public partial class Form1 : Form 
{ 
    //A default value in case Application.RenderWithVisualStyles == false 
    private int AllButtonsAndPadding = 0; 
    private VisualStyleRenderer renderer = null; 

    public Form1() 
    { 
     InitializeComponent(); 
     this.Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; //A big text in the title 
     GetElementsSize(); 
     ResizeForm(); 
    } 

    //This gets the size of the X and the border of the form 
    private void GetElementsSize() 
    { 
     var g = this.CreateGraphics(); 

     // Get the size of the close button. 
     if (SetRenderer(VisualStyleElement.Window.CloseButton.Normal)) 
     { 
      AllButtonsAndPadding += renderer.GetPartSize(g, ThemeSizeType.True).Width; 
     } 

     // Get the size of the minimize button. 
     if (this.MinimizeBox && SetRenderer(VisualStyleElement.Window.MinButton.Normal)) 
     { 
      AllButtonsAndPadding += renderer.GetPartSize(g, ThemeSizeType.True).Width; 
     } 

     // Get the size of the maximize button. 
     if (this.MaximizeBox && SetRenderer(VisualStyleElement.Window.MaxButton.Normal)) 
     { 
      AllButtonsAndPadding += renderer.GetPartSize(g, ThemeSizeType.True).Width; 
     } 

     // Get the size of the icon. 
     if (this.ShowIcon) 
     { 
      AllButtonsAndPadding += this.Icon.Width; 
     } 

     // Get the thickness of the left, bottom, 
     // and right window frame. 
     if (SetRenderer(VisualStyleElement.Window.FrameLeft.Active)) 
     { 
      AllButtonsAndPadding += (renderer.GetPartSize(g, ThemeSizeType.True).Width) * 2; //Borders on both side 
     } 
    } 

    //This resizes the form 
    private void ResizeForm() 
    { 
     this.Width = TextRenderer.MeasureText(this.Text, SystemFonts.CaptionFont).Width + AllButtonsAndPadding; 
    } 

    //This sets the renderer to the element we want 
    private bool SetRenderer(VisualStyleElement element) 
    { 
     bool bReturn = VisualStyleRenderer.IsElementDefined(element); 

     if (bReturn && renderer == null) 
      renderer = new VisualStyleRenderer(element); 
     else 
      renderer.SetParameters(element); 

     return bReturn; 
    } 
} 
} 
0

Danke @CydrickT, das war hilfreich. Ich habe einige Änderungen, die benötigt wurden, wenn Sie dies auf ein Fenster mit FormBorderStyle von FixedDialog anwenden und wenn ControlBox == false auf dem Formular (muss versuchen, um Fehler zu behandeln geworfen fangen).

Auch wenn und Symbol angegeben ist, bestimmte FormBorderStyle 's zeigen sie nicht an (obwohl ShowIcon == wahr, dass Ihr Code einige Logik auf basiert), so dass diese Version des Codes dafür angepasst wird.

Ich habe auch eine neue private Eigenschaft hinzugefügt, die die minimale Breite des Fensters enthält, das im Konstruktor auf die minimale Breite festgelegt wird, wenn sie angegeben wurde, oder die Entwurfszeitbreite, falls nicht. Dies erlaubt eine Kontraktion der Fensterbreite, wenn der Text (Titel) im Code geändert und dann das Formular erneut angezeigt werden soll.

Ich habe eine Textänderung Methode für den Text des Formulars hinzugefügt: , so dass jederzeit der Titel des Formulars geändert wird die Formularbreite angepasst (wieder, wenn die Formularinstanz wiederverwenden). Der Designer des Formulars müsste dies natürlich für das zu verwendende Ereignis Textänderung einstellen.

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.VisualStyles; 

namespace WindowAutoAdapt 
{ 
    public partial class Form1: Form 
    { 
     private int AllButtonsAndPadding = 10;//seems things are coming up about this amount short so. . . 
     private VisualStyleRenderer renderer = null; 
     private int minWidth = 0;//will hold either the minimum size width if specified or the design time width of the form. 

     public Form1() 
     { 
      InitializeComponent(); 

      //Capture an explicit minimum width if present else store the design time width. 
      if (this.MinimumSize.Width > 0) 
      { 
       minWidth = this.MinimumSize.Width;//use an explicit minimum width if present. 
      } 
      else 
      { 
       minWidth = this.Size.Width;//use design time width 
      } 

      GetElementsSize(); 
      ResizeForm(); 
     } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void Form1_TextChanged(object sender, EventArgs e) 
    { 
     GetElementsSize(); 
     ResizeForm(); 
    } 

     //This gets the size of the X and the border of the form 
     private void GetElementsSize() 
     { 
      var g = this.CreateGraphics(); 

      // Get the size of the close button. 
      if (SetRenderer(VisualStyleElement.Window.CloseButton.Normal)) 
      { 
       AllButtonsAndPadding += renderer.GetPartSize(g, ThemeSizeType.True).Width; 
      } 

      // Get the size of the minimize button. 
      if (this.MinimizeBox && SetRenderer(VisualStyleElement.Window.MinButton.Normal)) 
      { 
       AllButtonsAndPadding += renderer.GetPartSize(g, ThemeSizeType.True).Width; 
      } 

      // Get the size of the maximize button. 
      if (this.MaximizeBox && SetRenderer(VisualStyleElement.Window.MaxButton.Normal)) 
      { 
       AllButtonsAndPadding += renderer.GetPartSize(g, ThemeSizeType.True).Width; 
      } 

      // Get the size of the icon only if it is actually going to be displayed. 
      if (this.ShowIcon && this.ControlBox && (this.FormBorderStyle == FormBorderStyle.Fixed3D || this.FormBorderStyle == FormBorderStyle.Sizable || this.FormBorderStyle == FormBorderStyle.FixedSingle)) 
      { 
       AllButtonsAndPadding += this.Icon.Width; 
      } 

      // Get the thickness of the left and right window frame. 
      if (SetRenderer(VisualStyleElement.Window.FrameLeft.Active)) 
      { 
       AllButtonsAndPadding += (renderer.GetPartSize(g, ThemeSizeType.True).Width) * 2; //Borders on both side 
      } 
     } 

     //This resizes the form 
     private void ResizeForm() 
     { 
      //widen window if title length requires it else contract it to the minWidth if required. 
      int newWidth = TextRenderer.MeasureText(this.Text, SystemFonts.CaptionFont).Width + AllButtonsAndPadding; 
      if (newWidth > minWidth) 
      { 
       this.Width = newWidth; 
      } 
      else 
      { 
       this.Width = minWidth; 
      } 
     } 

     //This sets the renderer to the element we want 
     private bool SetRenderer(VisualStyleElement element) 
     { 
      try 
      { 
       bool bReturn = VisualStyleRenderer.IsElementDefined(element); 
       if (bReturn && renderer == null) 
       { 
        renderer = new VisualStyleRenderer(element); 
       } 
       else 
       { 
        renderer.SetParameters(element); 
       } 
       return bReturn; 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     } 
    } 
}