Imports System.ComponentModel
Imports System.Drawing.Drawing2D
<DesignTimeVisible(False), Description("Represents a single tab page in a MdiTabControl.TabControl.")> _
Public Class TabPage
Private m_BackHighColor As Color
Private m_BackHighColorDisabled As Color
Private m_BackLowColor As Color
Private m_BackLowColorDisabled As Color
Private m_BorderColor As Color
Private m_BorderColorDisabled As Color
Private m_ForeColorDisabled As Color
Private m_Selected As Boolean = False
Private m_Hot As Boolean = False
Private m_MaximumWidth As Integer
Private m_MinimumWidth As Integer
Private m_PadLeft As Integer
Private m_PadRight As Integer
Private m_CloseButtonVisible As Boolean
Private m_CloseButton As Image
Private m_CloseButtonImageHot As Image
Private m_CloseButtonImageDisabled As Image
Private m_CloseButtonBackHighColor As Color
Private m_CloseButtonBackLowColor As Color
Private m_CloseButtonBorderColor As Color
Private m_CloseButtonForeColor As Color
Private m_CloseButtonBackHighColorDisabled As Color
Private m_CloseButtonBackLowColorDisabled As Color
Private m_CloseButtonBorderColorDisabled As Color
Private m_CloseButtonForeColorDisabled As Color
Private m_CloseButtonBackHighColorHot As Color
Private m_CloseButtonBackLowColorHot As Color
Private m_CloseButtonBorderColorHot As Color
Private m_CloseButtonForeColorHot As Color
Private m_HotTrack As Boolean
Private m_CloseButtonSize As Size
Private m_FontBoldOnSelect As Boolean
Private m_IconSize As Size
Private m_SmoothingMode As SmoothingMode
Private m_Alignment As TabControl.TabAlignment
Private m_GlassGradient As Boolean
Private m_BorderEnhanced As Boolean
Private m_RenderMode As ToolStripRenderMode
Private m_BorderEnhanceWeight As TabControl.Weight
Friend WithEvents m_Form As Form
Friend TabVisible As Boolean
Friend TabLeft As Integer
Friend MenuItem As New ToolStripMenuItem
Private MouseOverCloseButton As Boolean = False
<Description("Occurs when the user clicks the Tab Control.")> _
Public Shadows Event Click(ByVal sender As Object, ByVal e As EventArgs)
Friend Event Close(ByVal sender As Object, ByVal e As EventArgs)
Friend Event GetTabRegion(ByVal sender As Object, ByVal e As TabControl.GetTabRegionEventArgs)
Friend Event TabPaintBackground(ByVal sender As Object, ByVal e As TabControl.TabPaintEventArgs)
Friend Event TabPaintBorder(ByVal sender As Object, ByVal e As TabControl.TabPaintEventArgs)
Friend Event Draging(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Friend Event EnterForm As EventHandler
Friend Event LeaveForm As EventHandler
Sub New(ByVal Form As System.Windows.Forms.Form)
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Me.SuspendLayout()
Me.SetStyle(ControlStyles.DoubleBuffer, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.UserPaint, True)
Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
MyBase.BackColor = Color.Transparent
Me.Visible = False
Me.Size = New System.Drawing.Size(1, 1)
Form.TopLevel = False
Form.MdiParent = Nothing
Form.FormBorderStyle = Windows.Forms.FormBorderStyle.None
Form.Dock = DockStyle.Fill
Me.m_Form = Form
MenuItem.Text = Form.Text
MenuItem.Image = Form.Icon.ToBitmap
MenuItem.Tag = Me
Me.ResumeLayout(False)
End Sub
<Description("Gets the form associated with the tab page")> _
Public ReadOnly Property Form() As Object
Get
Return m_Form
End Get
End Property
<Description("Gets or sets the System.Drawing.Color structure that represents the starting color of the Background linear gradient for the tab.")> _
Public Property BackHighColor() As Color
Get
Return m_BackHighColor
End Get
Set(ByVal value As Color)
m_BackHighColor = value
Invalidate()
End Set
End Property
<Description("Gets or sets the System.Drawing.Color structure that represents the ending color of the Background linear gradient for the tab.")> _
Public Property BackLowColor() As Color
Get
Return m_BackLowColor
End Get
Set(ByVal value As Color)
m_BackLowColor = value
Invalidate()
End Set
End Property
<Description("Gets or sets the System.Drawing.Color structure that represents the border color.")> _
Friend Property BorderColor() As Color
Get
Return m_BorderColor
End Get
Set(ByVal value As Color)
m_BorderColor = value
Invalidate()
End Set
End Property
<Description("Gets or sets the System.Drawing.Color structure that represents the starting color of the Background linear gradient for a non selected tab.")> _
Public Property BackHighColorDisabled() As Color
Get
Return m_BackHighColorDisabled
End Get
Set(ByVal value As Color)
m_BackHighColorDisabled = value
Invalidate()
End Set
End Property
<Description("Gets or sets the System.Drawing.Color structure that represents the ending color of the Background linear gradient for a non selected tab.")> _
Public Property BackLowColorDisabled() As Color
Get
Return m_BackLowColorDisabled
End Get
Set(ByVal value As Color)
m_BackLowColorDisabled = value
Invalidate()
End Set
End Property
<Description("Gets or sets the System.Drawing.Color structure that represents the border color of the tab when not selected.")> _
Public Property BorderColorDisabled() As Color
Get
Return m_BorderColorDisabled
End Get
Set(ByVal value As Color)
m_BorderColorDisabled = value
Invalidate()
End Set
End Property
<Description("Gets or sets the System.Drawing.Color structure that represents the fore color of the tab when not selected.")> _
Public Property ForeColorDisabled() As Color
Get
Return m_ForeColorDisabled
End Get
Set(ByVal value As Color)
m_ForeColorDisabled = value
Invalidate()
End Set
End Property
Friend Property IsSelected() As Boolean
Get
Return m_Selected
End Get
Set(ByVal Value As Boolean)
If m_Selected <> Value Then
m_Selected = Value
If m_Selected Then
m_Hot = False
End If
Invalidate()
End If
End Set
End Property
<Description("Returns whether the tab is selected or not.")> _
Public ReadOnly Property Selected() As Boolean
Get
Return IsSelected
End Get
End Property
Friend Property MaximumWidth() As Integer
Get
Return m_MaximumWidth
End Get
Set(ByVal value As Integer)
m_MaximumWidth = value
CalculateWidth()
Invalidate()
End Set
End Property
Friend Property MinimumWidth() As Integer
Get
Return m_MinimumWidth
End Get
Set(ByVal value As Integer)
m_MinimumWidth = value
CalculateWidth()
Invalidate()
End Set
End Property
Friend Property PadLeft() As Integer
Get
Return m_PadLeft
End Get
Set(ByVal value As Integer)
m_PadLeft = value
CalculateWidth()
Invalidate()
End Set
End Property
Friend Property PadRight() As Integer
Get
Return m_PadRight
End Get
Set(ByVal value As Integer)
m_PadRight = value
CalculateWidth()
Invalidate()
End Set
End Property
<Description("Gets or sets whether the tab close button is visble or not.")> _
Public Property CloseButtonVisible() As Boolean
Get
Return m_CloseButtonVisible
End Get
Set(ByVal value As Boolean)
If m_CloseButtonVisible <> value Then
m_CloseButtonVisible = value
CalculateWidth()
Invalidate()
End If
End Set
End Property
Public Property CloseButtonImage() As Image
Get
Return m_CloseButton
End Get
Set(ByVal value As Image)
m_CloseButton = value
Invalidate()
End Set
End Property
Public Property CloseButtonImageHot() As Image
Get
Return m_CloseButtonImageHot
End Get
Set(ByVal value As Image)
m_CloseButtonImageHot = value
Invalidate()
End Set
End Property
Public Property CloseButtonImageDisabled() As Image
Get
Return m_CloseButtonImageDisabled
End Get
Set(ByVal value As Image)
m_CloseButtonImageDisabled = value
Invalidate()
End Set
End Property
Public Property CloseButtonBackHighColor() As System.Drawing.Color
Get
Return m_CloseButtonBackHighColor
End Get
Set(ByVal Value As Color)
m_CloseButtonBackHighColor = Value
End Set
End Property
Public Property CloseButtonBackLowColor() As System.Drawing.Color
Get
Return m_CloseButtonBackLowColor
End Get
Set(ByVal Value As Color)
m_CloseButtonBackLowColor = Value
End Set
End Property
Public Property CloseButtonBorderColor() As System.Drawing.Color
Get
Return m_CloseButtonBorderColor
End Get
Set(ByVal Value As Color)
m_CloseButtonBorderColor = Value
End Set
End Property
Public Property CloseButtonForeColor() As System.Drawing.Color
Get
Return m_CloseButtonForeColor
End Get
Set(ByVal Value As Color)
m_CloseButtonForeColor = Value
End Set
End Property
Public Property CloseButtonBackHighColorDisabled() As System.Drawing.Color
Get
Return m_CloseButtonBackHighColorDisabled
End Get
Set(ByVal Value As Color)
m_CloseButtonBackHighColorDisabled = Value
End Set
End Property
Public Property CloseButtonBackLowColorDisabled() As System.Drawing.Color
Get
Return m_CloseButtonBackLowColorDisabled
End Get
Set(ByVal Value As Color)
m_CloseButtonBackLowColorDisabled = Value
End Set
End Property
Public Property CloseButtonBorderColorDisabled() As System.Drawing.Color
Get
Return m_CloseButtonBorderColorDisabled
End Get
Set(ByVal Value As Color)
m_CloseButtonBorderColorDisabled = Value
End Set
End Property
Public Property CloseButtonForeColorDisabled() As System.Drawing.Color
Get
Return m_CloseButtonForeColorDisabled
End Get
Set(ByVal Value As Color)
m_CloseButtonForeColorDisabled = Value
End Set
End Property
Public Property CloseButtonBackHighColorHot() As System.Drawing.Color
Get
Return m_CloseButtonBackHighColorHot
End Get
Set(ByVal Value As Color)
m_CloseButtonBackHighColorHot = Value
End Set
End Property
Public Property CloseButtonBackLowColorHot() As System.Drawing.Color
Get
Return m_CloseButtonBackLowColorHot
End Get
Set(ByVal Value As Color)
m_CloseButtonBackLowColorHot = Value
End Set
End Property
Public Property CloseButtonBorderColorHot() As System.Drawing.Color
Get
Return m_CloseButtonBorderColorHot
End Get
Set(ByVal Value As Color)
m_CloseButtonBorderColorHot = Value
End Set
End Property
Public Property CloseButtonForeColorHot() As System.Drawing.Color
Get
Return m_CloseButtonForeColorHot
End Get
Set(ByVal Value As Color)
m_CloseButtonForeColorHot = Value
End Set
End Property
Friend Property HotTrack() As Boolean
Get
Return m_HotTrack
End Get
Set(ByVal value As Boolean)
m_HotTrack = value
Invalidate()
End Set
End Property
Friend Property CloseButtonSize() As Size
Get
Return m_CloseButtonSize
End Get
Set(ByVal value As Size)
m_CloseButtonSize = value
CalculateWidth()
Invalidate()
End Set
End Property
Friend Property FontBoldOnSelect() As Boolean
Get
Return m_FontBoldOnSelect
End Get
Set(ByVal value As Boolean)
m_FontBoldOnSelect = value
CalculateWidth()
Invalidate()
End Set
End Property
Friend Property IconSize() As Size
Get
Return m_IconSize
End Get
Set(ByVal value As Size)
m_IconSize = value
CalculateWidth()
Invalidate()
End Set
End Property
Friend Property SmoothingMode() As SmoothingMode
Get
Return m_SmoothingMode
End Get
Set(ByVal value As SmoothingMode)
m_SmoothingMode = value
Invalidate()
End Set
End Property
Friend Property Alignment() As TabControl.TabAlignment
Get
Return m_Alignment
End Get
Set(ByVal value As TabControl.TabAlignment)
m_Alignment = value
Invalidate()
End Set
End Property
Friend Property GlassGradient() As Boolean
Get
Return m_GlassGradient
End Get
Set(ByVal value As Boolean)
m_GlassGradient = value
End Set
End Property
Friend Property BorderEnhanced() As Boolean
Get
Return m_BorderEnhanced
End Get
Set(ByVal value As Boolean)
m_BorderEnhanced = value
End Set
End Property
Friend Property RenderMode() As ToolStripRenderMode
Get
Return m_RenderMode
End Get
Set(ByVal value As ToolStripRenderMode)
m_RenderMode = value
Invalidate()
End Set
End Property
Friend Property BorderEnhanceWeight() As TabControl.Weight
Get
Return m_BorderEnhanceWeight
End Get
Set(ByVal value As TabControl.Weight)
m_BorderEnhanceWeight = value
End Set
End Property
Public Property Icon() As Icon
Get
Return m_Form.Icon
End Get
Set(ByVal value As Icon)
m_Form.Icon = value
Dim r As New Region(New Rectangle(PadLeft, (Me.Height / 2 - m_IconSize.Height / 2), m_IconSize.Width, m_IconSize.Height))
Me.Invalidate(r)
r.Dispose()
r = Nothing
MenuItem.Image = value.ToBitmap
End Set
End Property
<Description("Selects the TabPage.")> _
Public Shadows Sub [Select]()
If Not IsSelected Then
RaiseEvent Click(Me, New EventArgs)
End If
End Sub
Private Function CreateGradientBrush(ByVal Rectangle As Rectangle, ByVal Color1 As Color, ByVal Color2 As Color) As Drawing2D.LinearGradientBrush
If m_GlassGradient Then
Return Helper.CreateGlassGradientBrush(Rectangle, Color1, Color2)
Else
Return New Drawing2D.LinearGradientBrush(Rectangle, Color1, Color2, Drawing2D.LinearGradientMode.Vertical)
End If
End Function
Private Sub TabContents_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_Form.Enter
RaiseEvent EnterForm(Me, e)
End Sub
Private Sub TabContent_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles m_Form.FormClosed
' if the form is closed closes the tabpage
RaiseEvent Close(Me, New EventArgs)
End Sub
Private Sub m_Form_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_Form.Leave
RaiseEvent LeaveForm(Me, e)
End Sub
Private Sub TabContent_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_Form.TextChanged
CalculateWidth()
Invalidate()
MenuItem.Text = m_Form.Text
End Sub
Private Sub Tab_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If m_Selected And Not (MouseOverCloseButton And m_CloseButtonVisible) Then Exit Sub
If e.Button = Windows.Forms.MouseButtons.Left Then
' Close button was clicked
If MouseOverCloseButton And m_CloseButtonVisible Then
' try to close the form
m_Form.Close()
Else ' tab was clicked
' select the tab
[Select]()
End If
End If
End Sub
Private Sub Tab_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
If m_Selected Then Exit Sub
If m_HotTrack Then m_Hot = True
Invalidate()
End Sub
Private Sub Tab_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
MouseOverCloseButton = False
m_Hot = False
Invalidate()
End Sub
Private Sub Tab_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Static State As Boolean = False
If m_CloseButtonVisible Then
' verify if the mouse is over the close button
Dim x As Integer = Me.Width - PadRight - m_CloseButtonSize.Width - 2
Dim y As Integer = Me.Height / 2 - m_CloseButtonSize.Height / 2
MouseOverCloseButton = e.X >= x And e.X <= x + m_CloseButtonSize.Width - 1 And e.Y >= y And e.Y <= y + m_CloseButtonSize.Height - 1
If State <> MouseOverCloseButton And m_CloseButtonVisible Then
State = MouseOverCloseButton
Dim r As New Region(New Rectangle(x, y, m_CloseButtonSize.Width, m_CloseButtonSize.Height))
Me.Invalidate(r)
r.Dispose()
r = Nothing
End If
End If
If Me.RectangleToScreen(Me.ClientRectangle).Contains(Me.PointToScreen(New Point(e.X, e.Y))) Then
Cursor = Cursors.Default
Else ' the mouse is outside the tab (it happens only when the mouse was pressed on the tab and moved away while pressed)
RaiseEvent Draging(Me, e)
Cursor = Cursors.No
End If
End Sub
' Draws the tab text (the form text)
Private Sub DrawText(ByVal g As Graphics)
Dim f As Font = New Font(Font, IIf(m_Selected And m_FontBoldOnSelect, FontStyle.Bold, FontStyle.Regular))
Dim b As Brush = New SolidBrush(IIf(m_Selected Or m_Hot, ForeColor, m_ForeColorDisabled))
Dim bounds As RectangleF = New RectangleF(PadLeft + IIf(m_Form.Icon Is Nothing, 0, m_IconSize.Width) + 2, 1, Width - PadLeft - IIf(m_Form.Icon Is Nothing, 0, m_IconSize.Height) - 5 - IIf(m_CloseButtonVisible, m_CloseButtonSize.Width, 0) - PadRight, Me.DisplayRectangle.Height)
Dim MyFormat As StringFormat = New StringFormat
MyFormat.FormatFlags = StringFormatFlags.NoWrap
MyFormat.LineAlignment = StringAlignment.Center
MyFormat.Trimming = StringTrimming.EllipsisCharacter
g.DrawString(m_Form.Text, f, b, bounds, MyFormat)
MyFormat.Dispose()
b.Dispose()
f.Dispose()
MyFormat = Nothing
b = Nothing
f = Nothing
End Sub
' Draws the tab icon if exists (the form icon)
Private Sub DrawIcon(ByVal g As Graphics)
Try
If m_Form.Icon Is Nothing Then Exit Sub
Dim r As Rectangle = New Rectangle(PadLeft, (Me.Height / 2 - m_IconSize.Height / 2), m_IconSize.Width, m_IconSize.Height)
Dim i As Icon = New Icon(m_Form.Icon, m_IconSize)
g.DrawIcon(i, r)
DestroyIcon(i.Handle)
i.Dispose()
i = Nothing
Catch ex As Exception
End Try
End Sub
<System.Runtime.InteropServices.DllImportAttribute("user32.dll")> _
Private Shared Function DestroyIcon(ByVal handle As IntPtr) As Boolean
End Function
' Draws the Close Button
Private Sub DrawCloseButton(ByVal g As Graphics)
Try
Dim I As Bitmap
Dim x As Integer = Me.Width - (m_CloseButtonSize.Width + PadRight + 2)
Dim y As Integer = Me.Height / 2 - m_CloseButtonSize.Height / 2
If MouseOverCloseButton Then
I = m_CloseButtonImageHot
ElseIf m_Selected Then
I = m_CloseButton
Else
I = m_CloseButtonImageDisabled
End If
Dim IsDisposable As Boolean = False
If I Is Nothing Then
I = GetButton()
IsDisposable = True
End If
Dim icon As Icon = Drawing.Icon.FromHandle(I.GetHicon)
Dim r As Rectangle = New Rectangle(x, y, m_CloseButtonSize.Width, m_CloseButtonSize.Height)
g.DrawIcon(icon, r)
If IsDisposable Then
I.Dispose()
I = Nothing
End If
DestroyIcon(icon.Handle)
icon.Dispose()
icon = Nothing
Catch ex As Exception
End Try
End Sub
' Generates the close button image
Private Function GetButton() As Bitmap
Dim Points() As System.Drawing.Point = {New Point(1, 0), New Point(3, 0), New Point(5, 2), New Point(7, 0), New Point(9, 0), New Point(6, 3), New Point(6, 4), New Point(9, 7), New Point(7, 7), New Point(5, 5), New Point(3, 7), New Point(1, 7), New Point(4, 4), New Point(4, 3)}
Dim gp As New Drawing2D.GraphicsPath
Dim bch As Color
Dim bcl As Color
Dim bc As Color
Dim fc As Color
Dim B As Bitmap
Dim m As New Drawing2D.Matrix
Dim path() As System.Drawing.Point = {New Point(0, 1), New Point(1, 0), New Point(15, 0), New Point(16, 1), New Point(16, 14), New Point(15, 15), New Point(1, 15), New Point(0, 14)}
Dim g As Graphics
If MouseOverCloseButton Then
bch = RenderColors.TabCloseButtonBackHighColorHot(m_RenderMode, CloseButtonBackHighColorHot)
bcl = RenderColors.TabCloseButtonBackLowColorHot(m_RenderMode, CloseButtonBackLowColorHot)
bc = RenderColors.TabCloseButtonBorderColorHot(m_RenderMode, CloseButtonBorderColorHot)
fc = RenderColors.TabCloseButtonForeColorHot(m_RenderMode, CloseButtonForeColorHot)
ElseIf m_Selected Then
bch = RenderColors.TabCloseButtonBackHighColor(m_RenderMode, CloseButtonBackHighColor)
bcl = RenderColors.TabCloseButtonBackLowColor(m_RenderMode, CloseButtonBackLowColor)
bc = RenderColors.TabCloseButtonBorderColor(m_RenderMode, CloseButtonBorderColor)
fc = RenderColors.TabCloseButtonForeColor(m_RenderMode, CloseButtonForeColor)
Else
bch = RenderColors.TabCloseButtonBackHighColorDisabled(m_RenderMode, CloseButtonBackHighColorDisabled)
bcl = RenderColors.TabCloseButtonBackLowColorDisabled(m_RenderMode, CloseButtonBackLowColorDisabled)
bc = RenderColors.TabCloseButtonBorderColorDisabled(m_RenderMode, CloseButtonBorderColorDisabled)
fc = RenderColors.TabCloseButtonForeColorDisabled(m_RenderMode, CloseButtonForeColorDisabled)
End If
B = New Bitmap(17, 17)
B.MakeTransparent()
g = Graphics.FromImage(B)
' draw the border and background
g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
Dim l As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(0, 15), bch, bcl)
g.FillPolygon(l, path)
Dim p As New Pen(bc)
g.DrawPolygon(p, path)
g.SmoothingMode = Drawing2D.SmoothingMode.Default
' draw the foreground
gp.AddPolygon(Points)
m.Translate(3, 4)
gp.Transform(m)
p.Dispose()
p = New Pen(fc)
g.DrawPolygon(p, gp.PathPoints)
Dim sb As New SolidBrush(fc)
g.FillPolygon(sb, gp.PathPoints)
sb.Dispose()
p.Dispose()
gp.Dispose()
g.Dispose()
m.Dispose()
Return B
End Function
' Calculates the tab width
Private Sub CalculateWidth()
Dim g As Graphics = Me.CreateGraphics()
Dim iw As Integer = 0
Dim cbw As Integer = 0
Dim w As Integer = Width
If m_Form.Icon IsNot Nothing Then iw = m_IconSize.Width
If m_CloseButtonVisible Then cbw = m_CloseButtonSize.Width
Dim f As New Font(Font, IIf(m_FontBoldOnSelect, FontStyle.Bold, FontStyle.Regular))
w = PadLeft + iw + 3 + g.MeasureString(m_Form.Text, f).Width + 3 + cbw + m_PadRight + 2
f.Dispose()
If w < m_MinimumWidth + 1 Then
w = m_MinimumWidth + 1
ElseIf w > m_MaximumWidth + 1 Then
w = m_MaximumWidth + 1
End If
If w <> Width Then
Width = w
End If
g.Dispose()
End Sub
' Get the tab region shape
Private Function GetRegion(ByVal W As Integer, ByVal H As Integer, ByVal H1 As Integer) As Point()
Dim R() As Point = {New Point(0, H), New Point(0, 2), New Point(2, 0), New Point(W - 3, 0), New Point(W - 1, 2), New Point(W - 1, H)}
Dim e As New TabControl.GetTabRegionEventArgs(R, W, H, Me.IsSelected)
RaiseEvent GetTabRegion(Me, e)
Array.Resize(e.Points, e.Points.Length + 2)
Array.Copy(e.Points, 0, e.Points, 1, e.Points.Length - 1)
e.Points(0) = New Point(e.Points(1).X, H1)
e.Points(e.Points.Length - 1) = New Point(e.Points(e.Points.Length - 2).X, H1)
Return e.Points
End Function
Private Sub MirrorPath(ByVal GraphicPath As Drawing2D.GraphicsPath)
Dim m As New Matrix
m.Translate(0, Height - 1)
m.Scale(1, -1)
GraphicPath.Transform(m)
m.Dispose()
End Sub
' Paint the tab
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim Painting As Boolean = False
If Painting Then Exit Sub
Painting = True
Me.SuspendLayout()
Dim RenderBorderColor As Color
Dim RenderBottomColor As Color
Dim RenderHighColor As Color
Dim RenderLowColor As Color
Dim GraphicPath As New Drawing2D.GraphicsPath
Dim w As Integer = Me.Width
CalculateWidth()
If w <> Me.Width Then
GraphicPath.Dispose()
Exit Sub
End If
If m_Selected Then
RenderBorderColor = RenderColors.BorderColor(m_RenderMode, BorderColor)
RenderHighColor = RenderColors.TabBackHighColor(m_RenderMode, BackHighColor)
RenderLowColor = RenderColors.TabBackLowColor(m_RenderMode, BackLowColor)
RenderBottomColor = RenderColors.TabBackLowColor(m_RenderMode, BackLowColor)
ElseIf m_Hot Then
RenderBorderColor = RenderColors.BorderColor(m_RenderMode, BorderColor)
RenderHighColor = RenderColors.TabBackHighColor(m_RenderMode, BackHighColor)
RenderLowColor = RenderColors.TabBackLowColor(m_RenderMode, BackLowColor)
RenderBottomColor = RenderColors.BorderColor(m_RenderMode, BorderColor)
Else
RenderBorderColor = RenderColors.BorderColorDisabled(m_RenderMode, BorderColorDisabled)
RenderHighColor = RenderColors.TabBackHighColorDisabled(m_RenderMode, BackHighColorDisabled)
RenderLowColor = RenderColors.TabBackLowColorDisabled(m_RenderMode, BackLowColorDisabled)
RenderBottomColor = RenderColors.BorderColor(m_RenderMode, BorderColor)
End If
e.Graphics.SmoothingMode = m_SmoothingMode
GraphicPath.AddPolygon(GetRegion(Width - 1, Height - 1, IIf(Me.IsSelected, Height, Height - 1)))
' if is bottom mirror the button vertically
If m_Alignment = TabControl.TabAlignment.Bottom Then
MirrorPath(GraphicPath)
Dim x As Color = RenderHighColor
RenderHighColor = RenderLowColor
RenderLowColor = x
End If
' Get the correct region including all the borders
Dim R As Region = New Region(GraphicPath)
Dim R1 As Region = New Region(GraphicPath)
Dim R2 As Region = New Region(GraphicPath)
Dim R3 As Region = New Region(GraphicPath)
Dim M1 As Matrix = New Matrix
Dim M2 As Matrix = New Matrix
Dim M3 As Matrix = New Matrix
M1.Translate(0, -0.5)
M2.Translate(0, 0.5)
M3.Translate(1, 0)
R1.Transform(M1)
R2.Transform(M2)
R3.Transform(M3)
R.Union(R1)
R.Union(R2)
R.Union(R3)
Me.Region = R
Dim RF As RectangleF = R.GetBounds(e.Graphics)
Dim rec As New Rectangle(0, 0, RF.Width, RF.Height)
Dim te As TabControl.TabPaintEventArgs
te = New TabControl.TabPaintEventArgs(e.Graphics, rec, m_Selected, m_Hot, GraphicPath, Width, Height)
RaiseEvent TabPaintBackground(Me, te) ' try to owner draw
Dim gb As LinearGradientBrush = CreateGradientBrush(New Rectangle(0, 0, Me.Width, Me.Height), RenderHighColor, RenderLowColor)
If Not te.Handled Then e.Graphics.FillPath(gb, GraphicPath)
gb.Dispose()
te.Dispose()
te = New TabControl.TabPaintEventArgs(e.Graphics, rec, m_Selected, m_Hot, GraphicPath, Width, Height)
RaiseEvent TabPaintBorder(Me, te) ' try to owner draw
If Not te.Handled Then
If m_BorderEnhanced Then
Dim c As Color = IIf(m_Alignment = TabControl.TabAlignment.Bottom, RenderLowColor, RenderHighColor)
Dim p As New Pen(c, m_BorderEnhanceWeight)
e.Graphics.DrawLines(p, GraphicPath.PathPoints)
p.Dispose()
End If
Dim p1 As New Pen(RenderBorderColor)
e.Graphics.DrawLines(p1, GraphicPath.PathPoints)
p1.Dispose()
End If
te.Dispose()
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.None
e.Graphics.DrawLine(New Pen(RenderBottomColor), GraphicPath.PathPoints(0), GraphicPath.PathPoints(GraphicPath.PointCount - 1))
e.Graphics.SmoothingMode = m_SmoothingMode
DrawIcon(e.Graphics)
DrawText(e.Graphics)
If m_CloseButtonVisible Then DrawCloseButton(e.Graphics)
Me.ResumeLayout()
' do the memory cleanup
GraphicPath.Dispose()
M1.Dispose()
M2.Dispose()
M3.Dispose()
R1.Dispose()
R2.Dispose()
R3.Dispose()
R.Dispose()
te.Dispose()
Painting = False
End Sub
#Region " Obsolete properties "
<EditorBrowsable(EditorBrowsableState.Never)> _
Public Overrides Property MinimumSize() As Size
Get
End Get
Set(ByVal value As Size)
End Set
End Property
<EditorBrowsable(EditorBrowsableState.Never)> _
Public Overrides Property MaximumSize() As Size
Get
End Get
Set(ByVal value As Size)
End Set
End Property
<EditorBrowsable(EditorBrowsableState.Never)> _
Public Shadows Property Padding() As Padding
Get
End Get
Set(ByVal value As Padding)
End Set
End Property
<EditorBrowsable(EditorBrowsableState.Never)> _
Public Overrides Property BackColor() As Color
Get
End Get
Set(ByVal value As Color)
End Set
End Property
<EditorBrowsable(EditorBrowsableState.Never)> _
Public Overrides Property Dock() As System.Windows.Forms.DockStyle
Get
End Get
Set(ByVal value As System.Windows.Forms.DockStyle)
End Set
End Property
<EditorBrowsable(EditorBrowsableState.Never)> _
Public Overrides Property Anchor() As System.Windows.Forms.AnchorStyles
Get
End Get
Set(ByVal value As System.Windows.Forms.AnchorStyles)
End Set
End Property
<EditorBrowsable(EditorBrowsableState.Never)> _
Public Overrides Property Text() As String
Get
Return Nothing
End Get
Set(ByVal value As String)
End Set
End Property
#End Region
End Class