2009-06-29 3 views
0

ermitteln Ich habe eine Reihe von Schaltflächen, die Dateinamen anzeigen. Wenn ich die Text-Eigenschaft festlege, wenn der Dateiname breiter ist als die Anzahl der verfügbaren Pixel, wird der Text "umbrochen" und stattdessen, wenn der Text angezeigt wird LeftMiddle, wird LeftTop angezeigt. Daher zeige ich nur so viele Zeichen an, wie angezeigt werden können (mit der Methode PathCompactPathEx()).Wie Pixel für Text in System.Windows.Forms.Button

Allerdings - Wie kann ich feststellen, wie viele Pixel verfügbar sind? Mein aktueller Ansatz ist:

button.Width - button.Image.Width - button.Padding.Horizontal 

Dies funktioniert nicht immer und manchmal wird der Text immer noch umbrochen.

Gibt es Hinweise darauf, wie Sie die Anzahl der für den Text verfügbaren Pixel richtig bestimmen können?

Antwort

2

Der beste Ansatz, den Sie erhalten können, ist abonnieren Ereignis zu malen (oder Button-Nachkommen machen und außer Kraft setzen OnPaint) und Zeichenfolge die folgende Art und Weise ziehen:

private void OnPaint(object sender, PaintEventArgs) 
{ 
    Button SenderButton = (Button)sender; 
    Rectangle TextRect = SenderButton.ClientRectangle; 
    TextRect.Inflate(-10, -5); // You can use any rectangle you want 
    // To avoid internal Button text drawing, assign "" to Button.Text, and use Tag instead 
    string Text = (string)SenderButton.Tag; 
    e.Graphics.DrawText(e.Graphics, Text, SenderButton.Font, TextRect, SenderButton.ForeColor, 
     TextFormatFlags.PathEllipsis | TextFormatFlags.NoPrefix); 
} 

Dies ist die einzige Methode, die nie, dass Sie garantierte pack wieder ein. Jegliche Breitenmessung (einschließlich MeasureString) kann sich von der internen Button-Malbearbeitung unterscheiden, und als Ergebnis haben Sie ein Wrapping.

+0

Ja, ich vermute ich könnte - vorausgesetzt ich kenne ungefähr den verfügbaren Platz (siehe Frage). Ich bin immer noch neugierig, warum sich TextRenderer.MeasureText() von der internen Button-Malbearbeitung unterscheidet ... Sicherlich muss die Anzahl der Pixel, die für Text in einer Schaltfläche zur Verfügung stehen, berechnet werden können? – JohnBarton

+0

Da Button Text auf verschiedene Arten malen kann. Zum Beispiel wenn FlatStyle == System, dann wird der Text vom System gezeichnet, wenn FlatStyle == Default, dann hängt das Text-Painting von der UseCompatibleTextRendering-Eigenschaft ab und so weiter. Sie kennen auch keine Textränder, die von der Schaltflächenklasse in verschiedenen Malmodi verwendet werden. – arbiter

+0

Danke, dass Sie sich die Zeit genommen haben, die Frage zu beantworten, sehr geschätzt. – JohnBarton

0

Vielleicht könnten Sie eine monospaced Schriftart wie Courier verwenden, wenn Sie die Pixelbreite der einzelnen Zeichen bestimmen, dann müssen Sie nur darauf achten, nicht Ihre TextBox Breite

Hoffnung überschreiten, das hilft

+0

Die Frage war, wie der verfügbare Platz in einer Schaltfläche für den Text berechnet wurde. FYI - siehe Kommentar oben. Es ist nicht erforderlich, eine Schriftart mit einem festen Abstand zu verwenden. Mit Methoden können Sie ermitteln, wie breit eine Zeichenfolge für eine Schriftart ist. – JohnBarton

2

können Sie Verwenden Sie Graphics.MeasureString, um die tatsächliche Anzahl der Pixel zu bestimmen, die von einem bestimmten Text mit einer bestimmten Schriftart verwendet werden.
Es gibt auch Graphics.MeasureCharacterRanges, von denen ich glaube, dass sie für die Textausrichtung genauer sind, aber ich habe sie nicht persönlich benutzt.

+0

Entschuldigung - Ich weiß bereits weit die Zeichenfolge ist - Ich bin auf der Suche nach, wie die Anzahl der verfügbaren Pixel in der Schaltfläche zu bestimmen - so kann ich dann bestimmen, wie viele Zeichen zu zeichnen. Der Code-Kommentar in meiner Frage zeigt, wie ich momentan den verfügbaren Speicherplatz berechne, aber dies funktioniert nicht immer, da der Text immer noch umbrochen wird. FYI - TextRenderer.MeasureText() ist den Methoden in der Graphics-Klasse vorzuziehen, da DPI-Einstellungen berücksichtigt werden. – JohnBarton

Verwandte Themen