Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Disabling tab control tabs
Message
 
To
15/07/2004 11:57:55
Del Despain
Colorado Plateau Associates
Hurricane, Utah, United States
General information
Forum:
ASP.NET
Category:
Forms
Miscellaneous
Thread ID:
00924730
Message ID:
00924813
Views:
10
This message has been marked as the solution to the initial question of the thread.
I have the answer to that! It was the topic of my column of the UTMag in May 2004 (http://www.utmag.com/wconnect/wc.dll?FournierTransformation~9,7,3,May2004/Page21.asp)


Here is a class you can add to your project that gives you a real Enabled property:
Option Strict On

'=====================================================================================
' Classe        :   TabControlEx.vb
'
' Auteur        :   Eric Moreau
'                   Concept S2i inc.
'
' Description   :   System.Windows.Forms.TabControl Extender
'
' Utilisation   :   1. Add a regular TabControl to your form
'                   2. In the " Windows Form Designer generated code " section, 
'                      replace System.Windows.Forms.TabControl by TabControlEx (2 places) 
'                   3. In the Form_Load event (or a similar place), add this line
'                      YourTabControlName.DrawMode = TabDrawMode.OwnerDrawFixed
'                   4. If you want to disable a tabpage, add this line
'                      YourTabControlName.DisablePage(YourTabPageName)
'
' Historique    :
' Auteur            Date            Intervention
' ----------------- --------------- -------------------------------------------------
' Eric Moreau       2004/02/15      Création
'=====================================================================================

Public Class TabControlEx
    Inherits System.Windows.Forms.TabControl

    Private Const WM_LBUTTONDOWN As Integer = &H201

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_LBUTTONDOWN Then
            Dim pt As New Point(m.LParam.ToInt32)
            Dim index As Integer
            For index = 0 To Me.TabPages.Count - 1
                If GetTabRect(index).Contains(pt) Then
                    If TabPages(index).Enabled Then
                        MyBase.WndProc(m)
                    End If
                    Exit Sub
                End If
            Next
        End If
        MyBase.WndProc(m)
    End Sub

    Protected Overrides Sub OnKeyDown(ByVal ke As System.Windows.Forms.KeyEventArgs)
        Dim currentIndex As Integer = Me.SelectedIndex
        Dim index As Integer
        If ke.KeyCode = Keys.Left AndAlso Not (ke.Alt AndAlso Not ke.Control) Then
            For index = currentIndex - 1 To 0 Step -1
                If TabPages(index).Enabled Then
                    Me.SelectedIndex = index
                    Exit For
                End If
            Next
            ke.Handled = True
        ElseIf ke.KeyCode = Keys.Right AndAlso Not (ke.Alt AndAlso Not ke.Control) Then
            For index = currentIndex + 1 To TabPages.Count - 1
                If TabPages(index).Enabled Then
                    Me.SelectedIndex = index
                    Exit For
                End If
            Next
            ke.Handled = True
        End If
        MyBase.OnKeyDown(ke)
    End Sub

    Public Sub DisablePage(ByRef pTabPage As TabPage)
        With pTabPage
            .Enabled = False
            '.Text = "(* " & .Text & " *)"
        End With
    End Sub

    Private Sub TabControlEx_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles MyBase.DrawItem
        Dim intOffsetLeft As Int32
        Dim intOffsetTop As Int32
        Dim r As RectangleF = RectangleF.op_Implicit(e.Bounds)
        Dim r2 As RectangleF
        Dim ItemBrush As New SolidBrush(Me.BackColor)
        Dim b As Brush   ' SolidBrush = New SolidBrush(TabControl1.ForeColor)
        If Me.TabPages(e.Index).Enabled Then
            b = Brushes.Black
        Else
            b = Brushes.Gray
        End If

        Dim sf As New StringFormat
        sf.Alignment = StringAlignment.Center
        sf.LineAlignment = StringAlignment.Center

        Dim im As Bitmap
        If Me.TabPages(e.Index).ImageIndex <> -1 Then
            im = CType(Me.ImageList.Images(Me.TabPages(e.Index).ImageIndex), Bitmap)
        End If

        If Me.TabPages(e.Index).ImageIndex <> -1 Then
            r2 = New RectangleF(r.X + (im.Width \ 2), r.Y, r.Width, r.Height)
        Else
            r2 = New RectangleF(r.X, r.Y, r.Width, r.Height)
        End If

        If CBool(e.State And DrawItemState.Selected) Then
            e.Graphics.FillRectangle(ItemBrush, e.Bounds)
            e.Graphics.DrawString(Me.TabPages(e.Index).Text, e.Font, b, r2, sf)
            'e.Graphics.DrawString(TabControl1.TabPages(e.Index).Text, e.Font, Brushes.Red, r2, sf)
            intOffsetLeft = 5
            intOffsetTop = 5  '4
        Else
            e.Graphics.DrawString(Me.TabPages(e.Index).Text, e.Font, b, r2, sf)
            'e.Graphics.DrawString(TabControl1.TabPages(e.Index).Text, e.Font, Brushes.Blue, r2, sf)
            intOffsetLeft = 2
            intOffsetTop = 2 '4
        End If

        If Me.TabPages(e.Index).ImageIndex <> -1 Then
            Me.ImageList.Draw(e.Graphics, Convert.ToInt32(r.Left) + intOffsetLeft, Convert.ToInt32(r.Top) + intOffsetTop, Me.TabPages(e.Index).ImageIndex)
        End If
    End Sub
End Class
>How do I disable a tab in a TabControl? I can disable the page, but I would like to disable the tab itself so that it can't be selected.
>
>I tried controlling it in the SelectedIndexChanged event, but that results in annoying flashing.
>
>Thanks!
>
>Del
Éric Moreau, MCPD, Visual Developer - Visual Basic MVP
Conseiller Principal / Senior Consultant
Moer inc.
http://www.emoreau.com
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform