2016-06-28 14 views
0

Ich versuche DrawMode-OwnerDrawFixeddraw und dann zieht Reiter auf die gleiche Weise TabControl tut mit NormalenDrawMode, aber DrawString Methode mit Standardparametern unterschiedliche Ergebnisse liefern einzustellen.Wie zeichne Text auf der Registerkarte TabControl genauso wie TabControl?

Im folgenden Beispiel, wenn Text auf eingestellt ist Lorem ipsum es funktioniert, aber wenn es auf Ziffern eingestellt ist - es zeichnet außerhalb der Registerkarte Bereich. Doch TabControl mit Normal DrawMode zeichnet alles richtig, wie das gleiche manuell zu tun?

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

namespace TabWidthIssue 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      //var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; // Works fine! 
      var text = "1234567890-1234567890-1234567890-1234567890-1234567890-123456789X"; // Does not fit! 

      // TabControl with OwnerDrawFixed 
      var ownerDrawFixedTabControl = new TabControl() 
      { 
       DrawMode = TabDrawMode.OwnerDrawFixed, 
       Parent = this, 
       Dock = DockStyle.Top, 
      }; 

      ownerDrawFixedTabControl.DrawItem += new DrawItemEventHandler(ownerDrawFixedTabControl_DrawItem); 

      ownerDrawFixedTabControl.TabPages.Add(new TabPage(text)); 

      // TabControl with Normal 
      var normalTabControl = new TabControl() 
      { 
       DrawMode = TabDrawMode.Normal, 
       Parent = this, 
       Dock = DockStyle.Top, 
      }; 

      normalTabControl.TabPages.Add(new TabPage(text)); 
     } 

     void ownerDrawFixedTabControl_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      var tabControl = sender as TabControl; 
      var tabPage = tabControl.TabPages[e.Index]; 

      var format = new StringFormat 
      { 
       FormatFlags = StringFormatFlags.NoWrap, 
       Trimming = StringTrimming.None 
      }; 

      using (var brush = new SolidBrush(Color.Black)) 
       e.Graphics.DrawString(tabPage.Text, e.Font, brush, tabControl.GetTabRect(e.Index), format); 
     } 
    } 
} 

Example

Update 1 Die Aufgabe kann durch "Messen der Text auf die gleiche Weise" ersetzt die gleiche Art und Weise "text Zeichnung". Ich kenne die Größe des Textes, den ich zeichnen werde (entweder DrawString oder DrawText), aber ich muss sicherstellen, dass die Registerkarte breit genug ist. Die Breite von TextRenderer.MeasureText stimmt nicht mit der tatsächlich erstellten Breite der Registerkarte überein.

+0

See [diese] (http://stackoverflow.com/q/7268238/1997232). – Sinatr

+0

Alle nativen Steuerelemente verwenden TextRenderer.DrawText() zum Rendern von Text. Es unterscheidet sich subtil von DrawString(). Es liegt ansonsten an Ihnen, sicherzustellen, dass die Registerkarte breit genug für den Text ist, vermeiden Sie etwas so drastisch unpraktisch wie diese Zeichenfolge. –

+0

@HansPassant Die Breite der Registerkarte wird automatisch basierend auf dem Text berechnet. Gibt es eine alternative Möglichkeit, die Breite der Registerkarte explizit anzugeben (außer für die Eigenschaft 'ItemSize', da Tabulatoren unterschiedliche Breiten haben müssen). – Eugene

Antwort

1

Rahmen verwendet diese

TextRenderer.DrawText(g, tabItemText, font, contentBounds, textColor, flags); 
+0

Ein wenig Information über die genauen 'flags', die dem Anruf zur Verfügung gestellt werden, könnte nützlich sein, ansonsten +1. –

+0

ok es ist die enum TextFormatFlags .. –

+0

Ja, wir können das in den Dokumenten sehen, aber Sie sagen, dass das Framework den Aufruf verwendet, so wäre es wichtig, die genaue Kombination von Werten zu kennen, um das gleiche Ergebnis wie das Original zu erreichen Implementierung rendert. –