Como exibir guias alinhadas lateralmente com TabControl
A propriedade Alignment de TabControl dá suporte à exibição de guias verticalmente (ao longo da borda esquerda ou direita do controle), em vez de horizontalmente (na parte superior ou inferior do controle). Por padrão, essa exibição vertical resulta em uma experiência de usuário ruim, pois a propriedade Text do objeto TabPage não é exibida na guia quando os estilos visuais estão habilitados. Também não há nenhuma maneira direta de controlar a direção do texto dentro da guia. Você pode usar desenho personalizado em TabControl para melhorar essa experiência.
O procedimento a seguir mostra como renderizar guias alinhadas à direita, com o texto da guia avançando da esquerda para a direita, usando o recurso de "desenho personalizado".
Exibir guias alinhadas à direita
Adicione um TabControl ao formulário.
Defina a propriedade SizeMode como Fixed, de modo que todas as guias sejam da mesma largura.
Defina a propriedade ItemSize para o tamanho fixo preferido das abas. Lembre-se que a propriedade ItemSize se comporta como se as guias ficassem por cima, embora sejam alinhadas à direita. Como resultado, para tornar as guias mais largas, você deve alterar a propriedade Height e, para torná-las mais altas, deverá alterar a propriedade Width.
Para obter o melhor resultado com o exemplo de código abaixo, defina o Width das guias como 25 e o Height como 100.
Defina a propriedade DrawMode como OwnerDrawFixed.
Defina um manipulador para o evento DrawItem de TabControl que renderiza o texto da esquerda para a direita.
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
Consulte também
.NET Desktop feedback