Udostępnij za pośrednictwem


Instrukcje: wyświetlanie kart Side-Aligned za pomocą kontrolki TabControl

Właściwość Alignment dla TabControl umożliwia wyświetlanie kart pionowo (wzdłuż lewej lub prawej krawędzi elementu sterującego), w przeciwieństwie do poziomego (wzdłuż górnej lub dolnej części elementu). Domyślnie ten pionowy układ skutkuje słabym doświadczeniem użytkownika, ponieważ właściwość Text obiektu TabPage nie jest wyświetlana na karcie po włączeniu stylów wizualnych. Nie ma również bezpośredniego sposobu kontrolowania kierunku tekstu na karcie. Aby ulepszyć te wrażenia, możesz użyć rysowania własnego na TabControl.

Poniższa procedura przedstawia sposób renderowania tabulatorów wyrównanych do prawej z tekstem biegnącym od lewej do prawej, wykorzystując funkcję "rysowanie przez właściciela elementu".

Aby wyświetlić karty wyrównane do prawej

  1. Dodaj TabControl do formularza.

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

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

  4. Ustaw właściwość ItemSize na preferowany stały rozmiar kart. Pamiętaj, że właściwość ItemSize zachowuje się tak, jakby zakładki były na górze, choć są wyrównane do prawej. W związku z tym, aby karty były szersze, należy zmienić właściwość Height, a aby były wyższe, należy zmienić właściwość Width.

    Aby uzyskać najlepszy wynik z poniższym przykładem kodu, ustaw Width kart na 25, a Height na 100.

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

  6. Zdefiniuj program obsługi dla zdarzenia DrawItem w TabControl, który 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ż