Porady: wyświetlanie wyrównanych poziomo kart przy użyciu formantu TabControl

Właściwość AlignmentTabControl obsługuje wyświetlanie kart w pionie (wzdłuż lewej lub prawej krawędzi kontrolki), w przeciwieństwie do poziomego (u góry lub dołu kontrolki). Domyślnie ten pionowy ekran powoduje słabe środowisko użytkownika, ponieważ Text właściwość TabPage obiektu nie jest wyświetlana na karcie po włączeniu stylów wizualizacji. Nie ma również bezpośredniego sposobu kontrolowania kierunku tekstu na karcie. Aby ulepszyć to środowisko, możesz użyć funkcji właściciela TabControl .

Poniższa procedura przedstawia sposób renderowania kart wyrównanych do prawej z tekstem tabulacji uruchamianym od lewej do prawej przy użyciu funkcji "rysowanie właściciela".

Aby wyświetlić karty wyrównane do prawej

  1. Dodaj element TabControl do formularza.

  2. Ustaw właściwość Alignment na Right.

  3. SizeMode Ustaw właściwość na Fixed, aby wszystkie karty mają taką samą szerokość.

  4. ItemSize Ustaw właściwość na preferowany stały rozmiar kart. Należy pamiętać, że ItemSize właściwość zachowuje się tak, jakby karty były na górze, chociaż są one wyrównane do prawej. W związku z tym, aby karty były szersze, musisz zmienić Height właściwość, a aby były wyższe, musisz zmienić Width właściwość.

    Aby uzyskać najlepszy wynik z poniższym przykładem kodu, ustaw Width dla kart wartość 25 i Height wartość 100.

  5. Ustaw właściwość DrawMode na OwnerDrawFixed.

  6. Zdefiniuj procedurę obsługi dla DrawItem zdarzenia TabControl , które renderuje tekst od lewej do prawej.

    public Form1()
    {
        // Remove this call if you do not program using Visual Studio.
        InitializeComponent();
    
        tabControl1.DrawItem += new DrawItemEventHandler(tabControl1_DrawItem);
    }
    
    private void tabControl1_DrawItem(Object sender, System.Windows.Forms.DrawItemEventArgs e)
    {
        Graphics g = e.Graphics;
        Brush _textBrush;
    
        // Get the item from the collection.
        TabPage _tabPage = tabControl1.TabPages[e.Index];
    
        // Get the real bounds for the tab rectangle.
        Rectangle _tabBounds = tabControl1.GetTabRect(e.Index);
    
        if (e.State == DrawItemState.Selected)
        {
    
            // Draw a different background color, and don't paint a focus rectangle.
            _textBrush = new SolidBrush(Color.Red);
            g.FillRectangle(Brushes.Gray, e.Bounds);
        }
        else
        {
            _textBrush = new System.Drawing.SolidBrush(e.ForeColor);
            e.DrawBackground();
        }
    
        // Use our own font.
        Font _tabFont = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Pixel);
    
        // Draw string. Center the text.
        StringFormat _stringFlags = new StringFormat();
        _stringFlags.Alignment = StringAlignment.Center;
        _stringFlags.LineAlignment = StringAlignment.Center;
        g.DrawString(_tabPage.Text, _tabFont, _textBrush, _tabBounds, new StringFormat(_stringFlags));
    }
    
    Private Sub TabControl1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles TabControl1.DrawItem
        Dim g As Graphics = e.Graphics
        Dim _TextBrush As Brush
    
        ' Get the item from the collection.
        Dim _TabPage As TabPage = TabControl1.TabPages(e.Index)
    
        ' Get the real bounds for the tab rectangle.
        Dim _TabBounds As Rectangle = TabControl1.GetTabRect(e.Index)
    
        If (e.State = DrawItemState.Selected) Then
            ' Draw a different background color, and don't paint a focus rectangle.
            _TextBrush = New SolidBrush(Color.Red)
            g.FillRectangle(Brushes.Gray, e.Bounds)
        Else
            _TextBrush = New System.Drawing.SolidBrush(e.ForeColor)
            e.DrawBackground()
        End If
    
        ' Use our own font.
        Dim _TabFont As New Font("Arial", 10.0, FontStyle.Bold, GraphicsUnit.Pixel)
    
        ' Draw string. Center the text.
        Dim _StringFlags As New StringFormat()
        _StringFlags.Alignment = StringAlignment.Center
        _StringFlags.LineAlignment = StringAlignment.Center
        g.DrawString(_TabPage.Text, _TabFont, _TextBrush, _TabBounds, New StringFormat(_StringFlags))
    End Sub
    

Zobacz też