Pozadí TabControl   zodpovězená otázka

VB.NET, WinForms

Dobrý den, lze změnit barvu pozadí TabControl (pozor, ne barvu karty, ale kontejneru)?

Našel jsem tento kód, ale ten můj problém úplně nevyřeší

Imports System.ComponentModel
Imports System.Runtime.InteropServices
Imports System.Reflection

Public Class TabControl
    Inherits System.Windows.Forms.TabControl

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call
        setstyle(ControlStyles.AllPaintingInWmPaint Or _
                ControlStyles.DoubleBuffer Or _
                ControlStyles.ResizeRedraw Or _
                ControlStyles.UserPaint, True)

    End Sub

    'UserControl1 overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container
    End Sub

#End Region

#Region " InterOP "

    <StructLayout(LayoutKind.Sequential)> _
    Private Structure NMHDR
        Public HWND As Int32
        Public idFrom As Int32
        Public code As Int32
        Public Overloads Function ToString() As String
            Return String.Format("Hwnd: {0}, ControlID: {1}, Code: {2}", HWND, idFrom, code)
        End Function
    End Structure

    Private Const TCN_FIRST As Int32 = &HFFFFFFFFFFFFFDDA&
    Private Const TCN_SELCHANGING As Int32 = (TCN_FIRST - 2)

    Private Const WM_USER As Int32 = &H400&
    Private Const WM_NOTIFY As Int32 = &H4E&
    Private Const WM_REFLECT As Int32 = WM_USER + &H1C00&

#End Region

#Region " BackColor Manipulation "

    'As well as exposing the property to the Designer we want it to behave just like any other 
    'controls BackColor property so we need some clever manipulation.
    Private m_Backcolor As Color = Color.Empty
    <Browsable(True), _
    Description("The background color used to display text and graphics in a control.")> _
    Public Overrides Property BackColor() As Color
        Get
            If m_Backcolor.Equals(Color.Empty) Then
                If Parent Is Nothing Then
                    Return Control.DefaultBackColor
                Else
                    Return Parent.BackColor
                End If
            End If
            Return m_Backcolor
        End Get
        Set(ByVal Value As Color)
            If m_Backcolor.Equals(Value) Then Return
            m_Backcolor = Value
            Invalidate()
            'Let the Tabpages know that the backcolor has changed.
            MyBase.OnBackColorChanged(EventArgs.Empty)
        End Set
    End Property
    Public Function ShouldSerializeBackColor() As Boolean
        Return Not m_Backcolor.Equals(Color.Empty)
    End Function
    Public Overrides Sub ResetBackColor()
        m_Backcolor = Color.Empty
        Invalidate()
    End Sub

#End Region

    Protected Overrides Sub OnParentBackColorChanged(ByVal e As System.EventArgs)
        MyBase.OnParentBackColorChanged(e)
        Invalidate()
    End Sub

    Protected Overrides Sub OnSelectedIndexChanged(ByVal e As System.EventArgs)
        MyBase.OnSelectedIndexChanged(e)
        Invalidate()
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        e.Graphics.Clear(BackColor)
        Dim r As Rectangle = Me.ClientRectangle
        If TabCount <= 0 Then Return
        'Draw a custom background for Transparent TabPages
        r = SelectedTab.Bounds
        Dim sf As New StringFormat
        sf.Alignment = StringAlignment.Center
        sf.LineAlignment = StringAlignment.Center
        Dim DrawFont As New Font(Font.FontFamily, 24, FontStyle.Regular, GraphicsUnit.Pixel)
        ControlPaint.DrawStringDisabled(e.Graphics, "Micks Ownerdraw TabControl", DrawFont, BackColor, RectangleF.op_Implicit(r), sf)
        DrawFont.Dispose()
        'Draw a border around TabPage
        r.Inflate(3, 3)
        Dim tp As TabPage = TabPages(SelectedIndex)
        Dim PaintBrush As New SolidBrush(tp.BackColor)
        e.Graphics.FillRectangle(PaintBrush, r)
        ControlPaint.DrawBorder(e.Graphics, r, PaintBrush.Color, ButtonBorderStyle.Outset)
        'Draw the Tabs
        For index As Integer = 0 To TabCount - 1
            tp = TabPages(index)
            r = GetTabRect(index)
            Dim bs As ButtonBorderStyle = ButtonBorderStyle.Outset
            If index = SelectedIndex Then bs = ButtonBorderStyle.Inset
            PaintBrush.Color = tp.BackColor
            e.Graphics.FillRectangle(PaintBrush, r)
            ControlPaint.DrawBorder(e.Graphics, r, PaintBrush.Color, bs)
            PaintBrush.Color = tp.ForeColor

            'Set up rotation for left and right aligned tabs
            If Alignment = TabAlignment.Left Or Alignment = TabAlignment.Right Then
                Dim RotateAngle As Single = 90
                If Alignment = TabAlignment.Left Then RotateAngle = 270
                Dim cp As New PointF(r.Left + (r.Width \ 2), r.Top + (r.Height \ 2))
                e.Graphics.TranslateTransform(cp.X, cp.Y)
                e.Graphics.RotateTransform(RotateAngle)
                r = New Rectangle(-(r.Height \ 2), -(r.Width \ 2), r.Height, r.Width)
            End If
            'Draw the Tab Text
            If tp.Enabled Then
                e.Graphics.DrawString(tp.Text, Font, PaintBrush, RectangleF.op_Implicit(r), sf)
            Else
                ControlPaint.DrawStringDisabled(e.Graphics, tp.Text, Font, tp.BackColor, RectangleF.op_Implicit(r), sf)
            End If

            e.Graphics.ResetTransform()

        Next
        PaintBrush.Dispose()
    End Sub

    <Description("Occurs as a tab is being changed.")> _
    Public Event SelectedIndexChanging As SelectedTabPageChangeEventHandler

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = (WM_REFLECT + WM_NOTIFY) Then
            Dim hdr As NMHDR = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(NMHDR)), NMHDR)
            If hdr.code = TCN_SELCHANGING Then
                Dim tp As TabPage = TestTab(Me.PointToClient(Cursor.Position))
                If Not tp Is Nothing Then
                    Dim e As New TabPageChangeEventArgs(Me.SelectedTab, tp)
                    RaiseEvent SelectedIndexChanging(Me, e)
                    If e.Cancel OrElse tp.Enabled = False Then
                        m.Result = New IntPtr(1)
                        Return
                    End If
                End If
            End If
        End If
        MyBase.WndProc(m)
    End Sub

    Private Function TestTab(ByVal pt As Point) As TabPage
        For index As Integer = 0 To TabCount - 1
            If GetTabRect(index).Contains(pt.X, pt.Y) Then
                Return TabPages(index)
            End If
        Next
        Return Nothing
    End Function

End Class

#Region " EventArgs Class's "

Public Class TabPageChangeEventArgs
    Inherits EventArgs

    Private _Selected As TabPage
    Private _PreSelected As TabPage
    Public Cancel As Boolean = False

    Public ReadOnly Property CurrentTab() As TabPage
        Get
            Return _Selected
        End Get
    End Property

    Public ReadOnly Property NextTab() As TabPage
        Get
            Return _PreSelected
        End Get
    End Property

    Public Sub New(ByVal CurrentTab As TabPage, ByVal NextTab As TabPage)
        _Selected = CurrentTab
        _PreSelected = NextTab
    End Sub

End Class

Public Delegate Sub SelectedTabPageChangeEventHandler(ByVal sender As Object, ByVal e As TabPageChangeEventArgs)

#End Region
                    

můj záměr je, aby TabControl nebyl vidět(záložky bych přepínal programově). Pokud Vás zajímá důvod, tak je to proto, že celá aplikace je laděna do jiných barev, než používá systém.

Za všechny nápady předem děkuji Robert K.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To už se zde řešilo několikrát, stačí hledat:

http://www.vbnet.cz/forum-tema--1229-nav...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To jsem zkoušel, ale výsledek je neuspokojivý...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pravda, zobrazuje se obdélník v systémové barvě což jsem nevěděl (nikdy jsem nepotřeboval měnit výchozí barvu). Myslím že máte dvě možnosti - použít průhlednost pro kontejner záložek, inspirovat se můžete zde:

http://www.codeproject.com/KB/dotnet/Cus...

Nebo pokud vám skutečně jde o to, aby všechny vaše firemní aplikace měly jednotný vzhled, tak bych zvážil použití WPF kde přesně na toto jsou určeny styly podobné CSS v HTML.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověď. Vyzkouším

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback