Ziel war die Erstellung eines TabControls, dessen Reiter-Text über 2 Zeilen gehen kann (von hier):
Mit tatkräftiger Hilfe von @us4711 und Mick Doherty wurde das Problem grundsätzlich gelöst.
Allerdings war mir die Verwendung einer
Hier habe ich das Problem mit deutlich weniger Aufwand gelöst:
C#-Code
VB-Code
Im Designer ist lediglich die Text-Umbruch-Stelle mit einem "\n" zu markieren:
der Rest wird im Konstruktor eingetragen.
Das Setzen der
Mit tatkräftiger Hilfe von @us4711 und Mick Doherty wurde das Problem grundsätzlich gelöst.
Allerdings war mir die Verwendung einer
Hashtable
zum Zwischenspeichern der Texte der zweiten Zeilen etwas oversized.Hier habe ich das Problem mit deutlich weniger Aufwand gelöst:
C#-Quellcode
- using System.Drawing;
- using System.Windows.Forms;
- namespace WindowsFormsApplication1
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- this.InitializeComponent();
- this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
- this.tabControl1.Padding = new Point(6, this.tabControl1.Font.Height);
- }
- private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
- {
- TabControl tabControl = (TabControl)sender;
- TabPage currentTab = tabControl.TabPages[e.Index];
- Graphics g = e.Graphics;
- StringFormat sf = new StringFormat();
- sf.Alignment = StringAlignment.Center;
- sf.LineAlignment = StringAlignment.Center;
- Rectangle tabRect = (Rectangle)e.Bounds;
- Rectangle textRect = tabRect;
- if (e.Index == tabControl.SelectedIndex)
- {
- tabRect.Inflate(1, 1);
- }
- g.Clip = new Region(tabRect);
- g.Clear(Control.DefaultBackColor);
- g.ResetClip();
- string tabText = currentTab.Text.Replace(@"\n", "\n");
- g.DrawString(tabText, e.Font, SystemBrushes.ControlText, textRect, sf);
- }
- }
- }
VB.NET-Quellcode
- Public Class Form1
- Public Sub New()
- InitializeComponent()
- Me.TabControl1.DrawMode = TabDrawMode.OwnerDrawFixed
- Me.TabControl1.Padding = New Point(6, Me.TabControl1.Font.Height)
- End Sub
- Private Sub TabControl1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles TabControl1.DrawItem
- Dim tabControl As TabControl = DirectCast(sender, TabControl)
- Dim currentTab As TabPage = tabControl.TabPages(e.Index)
- Dim g As Graphics = e.Graphics
- Dim sf As New StringFormat()
- sf.Alignment = StringAlignment.Center
- sf.LineAlignment = StringAlignment.Center
- Dim tabRect As Rectangle = e.Bounds
- Dim textRect As Rectangle = tabRect
- If e.Index = tabControl.SelectedIndex Then
- tabRect.Inflate(1, 1)
- End If
- g.Clip = New Region(tabRect)
- g.Clear(Control.DefaultBackColor)
- g.ResetClip()
- Dim tabText As String = currentTab.Text.Replace("\n", ControlChars.Lf)
- g.DrawString(tabText, e.Font, SystemBrushes.ControlText, textRect, sf)
- End Sub
- End Class
der Rest wird im Konstruktor eingetragen.
Das Setzen der
DrawMode
-Property im Konstruktor und nicht im Designer sorgt dafür, dass die Reiter-Texte im Designer angezeigt werden, da das DrawItem
-Event im Designer nicht aufgerufen wird. Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!