Files
crypters-scode/scode (Encryption Klein2/Encryption Klein2/UserControl1.vb
T
2026-08-27 11:04:21 -06:00

5142 lines
159 KiB
VB.net

Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Text
Imports System.ComponentModel
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Drawing.Imaging
Imports System.IO
'------------------
'Creator: aeonhack
'Site: elitevs.net
'Created: 08/02/2011
'Changed: 12/06/2011
'Version: 1.5.4
'------------------
MustInherit Class ThemeContainer154
Inherits ContainerControl
#Region " Initialization "
Protected G As Graphics, B As Bitmap
Sub New()
SetStyle(DirectCast(139270, ControlStyles), True)
_ImageSize = Size.Empty
Font = New Font("Verdana", 8S)
MeasureBitmap = New Bitmap(1, 1)
MeasureGraphics = Graphics.FromImage(MeasureBitmap)
DrawRadialPath = New GraphicsPath
InvalidateCustimization()
End Sub
Protected NotOverridable Overrides Sub OnHandleCreated(ByVal e As EventArgs)
If DoneCreation Then InitializeMessages()
InvalidateCustimization()
ColorHook()
If Not _LockWidth = 0 Then Width = _LockWidth
If Not _LockHeight = 0 Then Height = _LockHeight
If Not _ControlMode Then MyBase.Dock = DockStyle.Fill
Transparent = _Transparent
If _Transparent AndAlso _BackColor Then BackColor = Color.Transparent
MyBase.OnHandleCreated(e)
End Sub
Private DoneCreation As Boolean
Protected NotOverridable Overrides Sub OnParentChanged(ByVal e As EventArgs)
MyBase.OnParentChanged(e)
If Parent Is Nothing Then Return
_IsParentForm = TypeOf Parent Is Form
If Not _ControlMode Then
InitializeMessages()
If _IsParentForm Then
ParentForm.FormBorderStyle = _BorderStyle
ParentForm.TransparencyKey = _TransparencyKey
If Not DesignMode Then
AddHandler ParentForm.Shown, AddressOf FormShown
End If
End If
Parent.BackColor = BackColor
End If
OnCreation()
DoneCreation = True
InvalidateTimer()
End Sub
#End Region
Private Sub DoAnimation(ByVal i As Boolean)
OnAnimation()
If i Then Invalidate()
End Sub
Protected NotOverridable Overrides Sub OnPaint(ByVal e As PaintEventArgs)
If Width = 0 OrElse Height = 0 Then Return
If _Transparent AndAlso _ControlMode Then
PaintHook()
e.Graphics.DrawImage(B, 0, 0)
Else
G = e.Graphics
PaintHook()
End If
End Sub
Protected Overrides Sub OnHandleDestroyed(ByVal e As EventArgs)
RemoveAnimationCallback(AddressOf DoAnimation)
MyBase.OnHandleDestroyed(e)
End Sub
Private HasShown As Boolean
Private Sub FormShown(ByVal sender As Object, ByVal e As EventArgs)
If _ControlMode OrElse HasShown Then Return
If _StartPosition = FormStartPosition.CenterParent OrElse _StartPosition = FormStartPosition.CenterScreen Then
Dim SB As Rectangle = Screen.PrimaryScreen.Bounds
Dim CB As Rectangle = ParentForm.Bounds
ParentForm.Location = New Point(SB.Width \ 2 - CB.Width \ 2, SB.Height \ 2 - CB.Width \ 2)
End If
HasShown = True
End Sub
#Region " Size Handling "
Private Frame As Rectangle
Protected NotOverridable Overrides Sub OnSizeChanged(ByVal e As EventArgs)
If _Movable AndAlso Not _ControlMode Then
Frame = New Rectangle(7, 7, Width - 14, _Header - 7)
End If
InvalidateBitmap()
Invalidate()
MyBase.OnSizeChanged(e)
End Sub
Protected Overrides Sub SetBoundsCore(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal specified As BoundsSpecified)
If Not _LockWidth = 0 Then width = _LockWidth
If Not _LockHeight = 0 Then height = _LockHeight
MyBase.SetBoundsCore(x, y, width, height, specified)
End Sub
#End Region
#Region " State Handling "
Protected State As MouseState
Private Sub SetState(ByVal current As MouseState)
State = current
Invalidate()
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
If Not (_IsParentForm AndAlso ParentForm.WindowState = FormWindowState.Maximized) Then
If _Sizable AndAlso Not _ControlMode Then InvalidateMouse()
End If
MyBase.OnMouseMove(e)
End Sub
Protected Overrides Sub OnEnabledChanged(ByVal e As EventArgs)
If Enabled Then SetState(MouseState.None) Else SetState(MouseState.Block)
MyBase.OnEnabledChanged(e)
End Sub
Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs)
SetState(MouseState.Over)
MyBase.OnMouseEnter(e)
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
SetState(MouseState.Over)
MyBase.OnMouseUp(e)
End Sub
Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)
SetState(MouseState.None)
If GetChildAtPoint(PointToClient(MousePosition)) IsNot Nothing Then
If _Sizable AndAlso Not _ControlMode Then
Cursor = Cursors.Default
Previous = 0
End If
End If
MyBase.OnMouseLeave(e)
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then SetState(MouseState.Down)
If Not (_IsParentForm AndAlso ParentForm.WindowState = FormWindowState.Maximized OrElse _ControlMode) Then
If _Movable AndAlso Frame.Contains(e.Location) Then
Capture = False
WM_LMBUTTONDOWN = True
DefWndProc(Messages(0))
ElseIf _Sizable AndAlso Not Previous = 0 Then
Capture = False
WM_LMBUTTONDOWN = True
DefWndProc(Messages(Previous))
End If
End If
MyBase.OnMouseDown(e)
End Sub
Private WM_LMBUTTONDOWN As Boolean
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If WM_LMBUTTONDOWN AndAlso m.Msg = 513 Then
WM_LMBUTTONDOWN = False
SetState(MouseState.Over)
If Not _SmartBounds Then Return
If IsParentMdi Then
CorrectBounds(New Rectangle(Point.Empty, Parent.Parent.Size))
Else
CorrectBounds(Screen.FromControl(Parent).WorkingArea)
End If
End If
End Sub
Private GetIndexPoint As Point
Private B1, B2, B3, B4 As Boolean
Private Function GetIndex() As Integer
GetIndexPoint = PointToClient(MousePosition)
B1 = GetIndexPoint.X < 7
B2 = GetIndexPoint.X > Width - 7
B3 = GetIndexPoint.Y < 7
B4 = GetIndexPoint.Y > Height - 7
If B1 AndAlso B3 Then Return 4
If B1 AndAlso B4 Then Return 7
If B2 AndAlso B3 Then Return 5
If B2 AndAlso B4 Then Return 8
If B1 Then Return 1
If B2 Then Return 2
If B3 Then Return 3
If B4 Then Return 6
Return 0
End Function
Private Current, Previous As Integer
Private Sub InvalidateMouse()
Current = GetIndex()
If Current = Previous Then Return
Previous = Current
Select Case Previous
Case 0
Cursor = Cursors.Default
Case 1, 2
Cursor = Cursors.SizeWE
Case 3, 6
Cursor = Cursors.SizeNS
Case 4, 8
Cursor = Cursors.SizeNWSE
Case 5, 7
Cursor = Cursors.SizeNESW
End Select
End Sub
Private Messages(8) As Message
Private Sub InitializeMessages()
Messages(0) = Message.Create(Parent.Handle, 161, New IntPtr(2), IntPtr.Zero)
For I As Integer = 1 To 8
Messages(I) = Message.Create(Parent.Handle, 161, New IntPtr(I + 9), IntPtr.Zero)
Next
End Sub
Private Sub CorrectBounds(ByVal bounds As Rectangle)
If Parent.Width > bounds.Width Then Parent.Width = bounds.Width
If Parent.Height > bounds.Height Then Parent.Height = bounds.Height
Dim X As Integer = Parent.Location.X
Dim Y As Integer = Parent.Location.Y
If X < bounds.X Then X = bounds.X
If Y < bounds.Y Then Y = bounds.Y
Dim Width As Integer = bounds.X + bounds.Width
Dim Height As Integer = bounds.Y + bounds.Height
If X + Parent.Width > Width Then X = Width - Parent.Width
If Y + Parent.Height > Height Then Y = Height - Parent.Height
Parent.Location = New Point(X, Y)
End Sub
#End Region
#Region " Base Properties "
Overrides Property Dock As DockStyle
Get
Return MyBase.Dock
End Get
Set(ByVal value As DockStyle)
If Not _ControlMode Then Return
MyBase.Dock = value
End Set
End Property
Private _BackColor As Boolean
<Category("Misc")> _
Overrides Property BackColor() As Color
Get
Return MyBase.BackColor
End Get
Set(ByVal value As Color)
If value = MyBase.BackColor Then Return
If Not IsHandleCreated AndAlso _ControlMode AndAlso value = Color.Transparent Then
_BackColor = True
Return
End If
MyBase.BackColor = value
If Parent IsNot Nothing Then
If Not _ControlMode Then Parent.BackColor = value
ColorHook()
End If
End Set
End Property
Overrides Property MinimumSize As Size
Get
Return MyBase.MinimumSize
End Get
Set(ByVal value As Size)
MyBase.MinimumSize = value
If Parent IsNot Nothing Then Parent.MinimumSize = value
End Set
End Property
Overrides Property MaximumSize As Size
Get
Return MyBase.MaximumSize
End Get
Set(ByVal value As Size)
MyBase.MaximumSize = value
If Parent IsNot Nothing Then Parent.MaximumSize = value
End Set
End Property
Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal value As String)
MyBase.Text = value
Invalidate()
End Set
End Property
Overrides Property Font() As Font
Get
Return MyBase.Font
End Get
Set(ByVal value As Font)
MyBase.Font = value
Invalidate()
End Set
End Property
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Overrides Property ForeColor() As Color
Get
Return Color.Empty
End Get
Set(ByVal value As Color)
End Set
End Property
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Overrides Property BackgroundImage() As Image
Get
Return Nothing
End Get
Set(ByVal value As Image)
End Set
End Property
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Overrides Property BackgroundImageLayout() As ImageLayout
Get
Return ImageLayout.None
End Get
Set(ByVal value As ImageLayout)
End Set
End Property
#End Region
#Region " Public Properties "
Private _SmartBounds As Boolean = True
Property SmartBounds() As Boolean
Get
Return _SmartBounds
End Get
Set(ByVal value As Boolean)
_SmartBounds = value
End Set
End Property
Private _Movable As Boolean = True
Property Movable() As Boolean
Get
Return _Movable
End Get
Set(ByVal value As Boolean)
_Movable = value
End Set
End Property
Private _Sizable As Boolean = True
Property Sizable() As Boolean
Get
Return _Sizable
End Get
Set(ByVal value As Boolean)
_Sizable = value
End Set
End Property
Private _TransparencyKey As Color
Property TransparencyKey() As Color
Get
If _IsParentForm AndAlso Not _ControlMode Then Return ParentForm.TransparencyKey Else Return _TransparencyKey
End Get
Set(ByVal value As Color)
If value = _TransparencyKey Then Return
_TransparencyKey = value
If _IsParentForm AndAlso Not _ControlMode Then
ParentForm.TransparencyKey = value
ColorHook()
End If
End Set
End Property
Private _BorderStyle As FormBorderStyle
Property BorderStyle() As FormBorderStyle
Get
If _IsParentForm AndAlso Not _ControlMode Then Return ParentForm.FormBorderStyle Else Return _BorderStyle
End Get
Set(ByVal value As FormBorderStyle)
_BorderStyle = value
If _IsParentForm AndAlso Not _ControlMode Then
ParentForm.FormBorderStyle = value
If Not value = FormBorderStyle.None Then
Movable = False
Sizable = False
End If
End If
End Set
End Property
Private _StartPosition As FormStartPosition
Property StartPosition As FormStartPosition
Get
If _IsParentForm AndAlso Not _ControlMode Then Return ParentForm.StartPosition Else Return _StartPosition
End Get
Set(ByVal value As FormStartPosition)
_StartPosition = value
If _IsParentForm AndAlso Not _ControlMode Then
ParentForm.StartPosition = value
End If
End Set
End Property
Private _NoRounding As Boolean
Property NoRounding() As Boolean
Get
Return _NoRounding
End Get
Set(ByVal v As Boolean)
_NoRounding = v
Invalidate()
End Set
End Property
Private _Image As Image
Property Image() As Image
Get
Return _Image
End Get
Set(ByVal value As Image)
If value Is Nothing Then _ImageSize = Size.Empty Else _ImageSize = value.Size
_Image = value
Invalidate()
End Set
End Property
Private Items As New Dictionary(Of String, Color)
Property Colors() As Bloom()
Get
Dim T As New List(Of Bloom)
Dim E As Dictionary(Of String, Color).Enumerator = Items.GetEnumerator
While E.MoveNext
T.Add(New Bloom(E.Current.Key, E.Current.Value))
End While
Return T.ToArray
End Get
Set(ByVal value As Bloom())
For Each B As Bloom In value
If Items.ContainsKey(B.Name) Then Items(B.Name) = B.Value
Next
InvalidateCustimization()
ColorHook()
Invalidate()
End Set
End Property
Private _Customization As String
Property Customization() As String
Get
Return _Customization
End Get
Set(ByVal value As String)
If value = _Customization Then Return
Dim Data As Byte()
Dim Items As Bloom() = Colors
Try
Data = Convert.FromBase64String(value)
For I As Integer = 0 To Items.Length - 1
Items(I).Value = Color.FromArgb(BitConverter.ToInt32(Data, I * 4))
Next
Catch
Return
End Try
_Customization = value
Colors = Items
ColorHook()
Invalidate()
End Set
End Property
Private _Transparent As Boolean
Property Transparent() As Boolean
Get
Return _Transparent
End Get
Set(ByVal value As Boolean)
_Transparent = value
If Not (IsHandleCreated OrElse _ControlMode) Then Return
If Not value AndAlso Not BackColor.A = 255 Then
Throw New Exception("Unable to change value to false while a transparent BackColor is in use.")
End If
SetStyle(ControlStyles.Opaque, Not value)
SetStyle(ControlStyles.SupportsTransparentBackColor, value)
InvalidateBitmap()
Invalidate()
End Set
End Property
#End Region
#Region " Private Properties "
Private _ImageSize As Size
Protected ReadOnly Property ImageSize() As Size
Get
Return _ImageSize
End Get
End Property
Private _IsParentForm As Boolean
Protected ReadOnly Property IsParentForm As Boolean
Get
Return _IsParentForm
End Get
End Property
Protected ReadOnly Property IsParentMdi As Boolean
Get
If Parent Is Nothing Then Return False
Return Parent.Parent IsNot Nothing
End Get
End Property
Private _LockWidth As Integer
Protected Property LockWidth() As Integer
Get
Return _LockWidth
End Get
Set(ByVal value As Integer)
_LockWidth = value
If Not LockWidth = 0 AndAlso IsHandleCreated Then Width = LockWidth
End Set
End Property
Private _LockHeight As Integer
Protected Property LockHeight() As Integer
Get
Return _LockHeight
End Get
Set(ByVal value As Integer)
_LockHeight = value
If Not LockHeight = 0 AndAlso IsHandleCreated Then Height = LockHeight
End Set
End Property
Private _Header As Integer = 24
Protected Property Header() As Integer
Get
Return _Header
End Get
Set(ByVal v As Integer)
_Header = v
If Not _ControlMode Then
Frame = New Rectangle(7, 7, Width - 14, v - 7)
Invalidate()
End If
End Set
End Property
Private _ControlMode As Boolean
Protected Property ControlMode() As Boolean
Get
Return _ControlMode
End Get
Set(ByVal v As Boolean)
_ControlMode = v
Transparent = _Transparent
If _Transparent AndAlso _BackColor Then BackColor = Color.Transparent
InvalidateBitmap()
Invalidate()
End Set
End Property
Private _IsAnimated As Boolean
Protected Property IsAnimated() As Boolean
Get
Return _IsAnimated
End Get
Set(ByVal value As Boolean)
_IsAnimated = value
InvalidateTimer()
End Set
End Property
#End Region
#Region " Property Helpers "
Protected Function GetPen(ByVal name As String) As Pen
Return New Pen(Items(name))
End Function
Protected Function GetPen(ByVal name As String, ByVal width As Single) As Pen
Return New Pen(Items(name), width)
End Function
Protected Function GetBrush(ByVal name As String) As SolidBrush
Return New SolidBrush(Items(name))
End Function
Protected Function GetColor(ByVal name As String) As Color
Return Items(name)
End Function
Protected Sub SetColor(ByVal name As String, ByVal value As Color)
If Items.ContainsKey(name) Then Items(name) = value Else Items.Add(name, value)
End Sub
Protected Sub SetColor(ByVal name As String, ByVal r As Byte, ByVal g As Byte, ByVal b As Byte)
SetColor(name, Color.FromArgb(r, g, b))
End Sub
Protected Sub SetColor(ByVal name As String, ByVal a As Byte, ByVal r As Byte, ByVal g As Byte, ByVal b As Byte)
SetColor(name, Color.FromArgb(a, r, g, b))
End Sub
Protected Sub SetColor(ByVal name As String, ByVal a As Byte, ByVal value As Color)
SetColor(name, Color.FromArgb(a, value))
End Sub
Private Sub InvalidateBitmap()
If _Transparent AndAlso _ControlMode Then
If Width = 0 OrElse Height = 0 Then Return
B = New Bitmap(Width, Height, PixelFormat.Format32bppPArgb)
G = Graphics.FromImage(B)
Else
G = Nothing
B = Nothing
End If
End Sub
Private Sub InvalidateCustimization()
Dim M As New MemoryStream(Items.Count * 4)
For Each B As Bloom In Colors
M.Write(BitConverter.GetBytes(B.Value.ToArgb), 0, 4)
Next
M.Close()
_Customization = Convert.ToBase64String(M.ToArray)
End Sub
Private Sub InvalidateTimer()
If DesignMode OrElse Not DoneCreation Then Return
If _IsAnimated Then
AddAnimationCallback(AddressOf DoAnimation)
Else
RemoveAnimationCallback(AddressOf DoAnimation)
End If
End Sub
#End Region
#Region " User Hooks "
Protected MustOverride Sub ColorHook()
Protected MustOverride Sub PaintHook()
Protected Overridable Sub OnCreation()
End Sub
Protected Overridable Sub OnAnimation()
End Sub
#End Region
#Region " Offset "
Private OffsetReturnRectangle As Rectangle
Protected Function Offset(ByVal r As Rectangle, ByVal amount As Integer) As Rectangle
OffsetReturnRectangle = New Rectangle(r.X + amount, r.Y + amount, r.Width - (amount * 2), r.Height - (amount * 2))
Return OffsetReturnRectangle
End Function
Private OffsetReturnSize As Size
Protected Function Offset(ByVal s As Size, ByVal amount As Integer) As Size
OffsetReturnSize = New Size(s.Width + amount, s.Height + amount)
Return OffsetReturnSize
End Function
Private OffsetReturnPoint As Point
Protected Function Offset(ByVal p As Point, ByVal amount As Integer) As Point
OffsetReturnPoint = New Point(p.X + amount, p.Y + amount)
Return OffsetReturnPoint
End Function
#End Region
#Region " Center "
Private CenterReturn As Point
Protected Function Center(ByVal p As Rectangle, ByVal c As Rectangle) As Point
CenterReturn = New Point((p.Width \ 2 - c.Width \ 2) + p.X + c.X, (p.Height \ 2 - c.Height \ 2) + p.Y + c.Y)
Return CenterReturn
End Function
Protected Function Center(ByVal p As Rectangle, ByVal c As Size) As Point
CenterReturn = New Point((p.Width \ 2 - c.Width \ 2) + p.X, (p.Height \ 2 - c.Height \ 2) + p.Y)
Return CenterReturn
End Function
Protected Function Center(ByVal child As Rectangle) As Point
Return Center(Width, Height, child.Width, child.Height)
End Function
Protected Function Center(ByVal child As Size) As Point
Return Center(Width, Height, child.Width, child.Height)
End Function
Protected Function Center(ByVal childWidth As Integer, ByVal childHeight As Integer) As Point
Return Center(Width, Height, childWidth, childHeight)
End Function
Protected Function Center(ByVal p As Size, ByVal c As Size) As Point
Return Center(p.Width, p.Height, c.Width, c.Height)
End Function
Protected Function Center(ByVal pWidth As Integer, ByVal pHeight As Integer, ByVal cWidth As Integer, ByVal cHeight As Integer) As Point
CenterReturn = New Point(pWidth \ 2 - cWidth \ 2, pHeight \ 2 - cHeight \ 2)
Return CenterReturn
End Function
#End Region
#Region " Measure "
Private MeasureBitmap As Bitmap
Private MeasureGraphics As Graphics
Protected Function Measure() As Size
SyncLock MeasureGraphics
Return MeasureGraphics.MeasureString(Text, Font, Width).ToSize
End SyncLock
End Function
Protected Function Measure(ByVal text As String) As Size
SyncLock MeasureGraphics
Return MeasureGraphics.MeasureString(text, Font, Width).ToSize
End SyncLock
End Function
#End Region
#Region " DrawPixel "
Private DrawPixelBrush As SolidBrush
Protected Sub DrawPixel(ByVal c1 As Color, ByVal x As Integer, ByVal y As Integer)
If _Transparent Then
B.SetPixel(x, y, c1)
Else
DrawPixelBrush = New SolidBrush(c1)
G.FillRectangle(DrawPixelBrush, x, y, 1, 1)
End If
End Sub
#End Region
#Region " DrawCorners "
Private DrawCornersBrush As SolidBrush
Protected Sub DrawCorners(ByVal c1 As Color, ByVal offset As Integer)
DrawCorners(c1, 0, 0, Width, Height, offset)
End Sub
Protected Sub DrawCorners(ByVal c1 As Color, ByVal r1 As Rectangle, ByVal offset As Integer)
DrawCorners(c1, r1.X, r1.Y, r1.Width, r1.Height, offset)
End Sub
Protected Sub DrawCorners(ByVal c1 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal offset As Integer)
DrawCorners(c1, x + offset, y + offset, width - (offset * 2), height - (offset * 2))
End Sub
Protected Sub DrawCorners(ByVal c1 As Color)
DrawCorners(c1, 0, 0, Width, Height)
End Sub
Protected Sub DrawCorners(ByVal c1 As Color, ByVal r1 As Rectangle)
DrawCorners(c1, r1.X, r1.Y, r1.Width, r1.Height)
End Sub
Protected Sub DrawCorners(ByVal c1 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
If _NoRounding Then Return
If _Transparent Then
B.SetPixel(x, y, c1)
B.SetPixel(x + (width - 1), y, c1)
B.SetPixel(x, y + (height - 1), c1)
B.SetPixel(x + (width - 1), y + (height - 1), c1)
Else
DrawCornersBrush = New SolidBrush(c1)
G.FillRectangle(DrawCornersBrush, x, y, 1, 1)
G.FillRectangle(DrawCornersBrush, x + (width - 1), y, 1, 1)
G.FillRectangle(DrawCornersBrush, x, y + (height - 1), 1, 1)
G.FillRectangle(DrawCornersBrush, x + (width - 1), y + (height - 1), 1, 1)
End If
End Sub
#End Region
#Region " DrawBorders "
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal offset As Integer)
DrawBorders(p1, 0, 0, Width, Height, offset)
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal r As Rectangle, ByVal offset As Integer)
DrawBorders(p1, r.X, r.Y, r.Width, r.Height, offset)
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal offset As Integer)
DrawBorders(p1, x + offset, y + offset, width - (offset * 2), height - (offset * 2))
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen)
DrawBorders(p1, 0, 0, Width, Height)
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal r As Rectangle)
DrawBorders(p1, r.X, r.Y, r.Width, r.Height)
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
G.DrawRectangle(p1, x, y, width - 1, height - 1)
End Sub
#End Region
#Region " DrawText "
Private DrawTextPoint As Point
Private DrawTextSize As Size
Protected Sub DrawText(ByVal b1 As Brush, ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer)
DrawText(b1, Text, a, x, y)
End Sub
Protected Sub DrawText(ByVal b1 As Brush, ByVal text As String, ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer)
If text.Length = 0 Then Return
DrawTextSize = Measure(text)
DrawTextPoint = New Point(Width \ 2 - DrawTextSize.Width \ 2, Header \ 2 - DrawTextSize.Height \ 2)
Select Case a
Case HorizontalAlignment.Left
G.DrawString(text, Font, b1, x, DrawTextPoint.Y + y)
Case HorizontalAlignment.Center
G.DrawString(text, Font, b1, DrawTextPoint.X + x, DrawTextPoint.Y + y)
Case HorizontalAlignment.Right
G.DrawString(text, Font, b1, Width - DrawTextSize.Width - x, DrawTextPoint.Y + y)
End Select
End Sub
Protected Sub DrawText(ByVal b1 As Brush, ByVal p1 As Point)
If Text.Length = 0 Then Return
G.DrawString(Text, Font, b1, p1)
End Sub
Protected Sub DrawText(ByVal b1 As Brush, ByVal x As Integer, ByVal y As Integer)
If Text.Length = 0 Then Return
G.DrawString(Text, Font, b1, x, y)
End Sub
#End Region
#Region " DrawImage "
Private DrawImagePoint As Point
Protected Sub DrawImage(ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer)
DrawImage(_Image, a, x, y)
End Sub
Protected Sub DrawImage(ByVal image As Image, ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer)
If image Is Nothing Then Return
DrawImagePoint = New Point(Width \ 2 - image.Width \ 2, Header \ 2 - image.Height \ 2)
Select Case a
Case HorizontalAlignment.Left
G.DrawImage(image, x, DrawImagePoint.Y + y, image.Width, image.Height)
Case HorizontalAlignment.Center
G.DrawImage(image, DrawImagePoint.X + x, DrawImagePoint.Y + y, image.Width, image.Height)
Case HorizontalAlignment.Right
G.DrawImage(image, Width - image.Width - x, DrawImagePoint.Y + y, image.Width, image.Height)
End Select
End Sub
Protected Sub DrawImage(ByVal p1 As Point)
DrawImage(_Image, p1.X, p1.Y)
End Sub
Protected Sub DrawImage(ByVal x As Integer, ByVal y As Integer)
DrawImage(_Image, x, y)
End Sub
Protected Sub DrawImage(ByVal image As Image, ByVal p1 As Point)
DrawImage(image, p1.X, p1.Y)
End Sub
Protected Sub DrawImage(ByVal image As Image, ByVal x As Integer, ByVal y As Integer)
If image Is Nothing Then Return
G.DrawImage(image, x, y, image.Width, image.Height)
End Sub
#End Region
#Region " DrawGradient "
Private DrawGradientBrush As LinearGradientBrush
Private DrawGradientRectangle As Rectangle
Protected Sub DrawGradient(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
DrawGradientRectangle = New Rectangle(x, y, width, height)
DrawGradient(blend, DrawGradientRectangle)
End Sub
Protected Sub DrawGradient(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal angle As Single)
DrawGradientRectangle = New Rectangle(x, y, width, height)
DrawGradient(blend, DrawGradientRectangle, angle)
End Sub
Protected Sub DrawGradient(ByVal blend As ColorBlend, ByVal r As Rectangle)
DrawGradientBrush = New LinearGradientBrush(r, Color.Empty, Color.Empty, 90.0F)
DrawGradientBrush.InterpolationColors = blend
G.FillRectangle(DrawGradientBrush, r)
End Sub
Protected Sub DrawGradient(ByVal blend As ColorBlend, ByVal r As Rectangle, ByVal angle As Single)
DrawGradientBrush = New LinearGradientBrush(r, Color.Empty, Color.Empty, angle)
DrawGradientBrush.InterpolationColors = blend
G.FillRectangle(DrawGradientBrush, r)
End Sub
Protected Sub DrawGradient(ByVal c1 As Color, ByVal c2 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
DrawGradientRectangle = New Rectangle(x, y, width, height)
DrawGradient(c1, c2, DrawGradientRectangle)
End Sub
Protected Sub DrawGradient(ByVal c1 As Color, ByVal c2 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal angle As Single)
DrawGradientRectangle = New Rectangle(x, y, width, height)
DrawGradient(c1, c2, DrawGradientRectangle, angle)
End Sub
Protected Sub DrawGradient(ByVal c1 As Color, ByVal c2 As Color, ByVal r As Rectangle)
DrawGradientBrush = New LinearGradientBrush(r, c1, c2, 90.0F)
G.FillRectangle(DrawGradientBrush, r)
End Sub
Protected Sub DrawGradient(ByVal c1 As Color, ByVal c2 As Color, ByVal r As Rectangle, ByVal angle As Single)
DrawGradientBrush = New LinearGradientBrush(r, c1, c2, angle)
G.FillRectangle(DrawGradientBrush, r)
End Sub
#End Region
#Region " DrawRadial "
Private DrawRadialPath As GraphicsPath
Private DrawRadialBrush1 As PathGradientBrush
Private DrawRadialBrush2 As LinearGradientBrush
Private DrawRadialRectangle As Rectangle
Sub DrawRadial(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(blend, DrawRadialRectangle, width \ 2, height \ 2)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal center As Point)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(blend, DrawRadialRectangle, center.X, center.Y)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal cx As Integer, ByVal cy As Integer)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(blend, DrawRadialRectangle, cx, cy)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal r As Rectangle)
DrawRadial(blend, r, r.Width \ 2, r.Height \ 2)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal r As Rectangle, ByVal center As Point)
DrawRadial(blend, r, center.X, center.Y)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal r As Rectangle, ByVal cx As Integer, ByVal cy As Integer)
DrawRadialPath.Reset()
DrawRadialPath.AddEllipse(r.X, r.Y, r.Width - 1, r.Height - 1)
DrawRadialBrush1 = New PathGradientBrush(DrawRadialPath)
DrawRadialBrush1.CenterPoint = New Point(r.X + cx, r.Y + cy)
DrawRadialBrush1.InterpolationColors = blend
If G.SmoothingMode = SmoothingMode.AntiAlias Then
G.FillEllipse(DrawRadialBrush1, r.X + 1, r.Y + 1, r.Width - 3, r.Height - 3)
Else
G.FillEllipse(DrawRadialBrush1, r)
End If
End Sub
Protected Sub DrawRadial(ByVal c1 As Color, ByVal c2 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(c1, c2, DrawGradientRectangle)
End Sub
Protected Sub DrawRadial(ByVal c1 As Color, ByVal c2 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal angle As Single)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(c1, c2, DrawGradientRectangle, angle)
End Sub
Protected Sub DrawRadial(ByVal c1 As Color, ByVal c2 As Color, ByVal r As Rectangle)
DrawRadialBrush2 = New LinearGradientBrush(r, c1, c2, 90.0F)
G.FillRectangle(DrawGradientBrush, r)
End Sub
Protected Sub DrawRadial(ByVal c1 As Color, ByVal c2 As Color, ByVal r As Rectangle, ByVal angle As Single)
DrawRadialBrush2 = New LinearGradientBrush(r, c1, c2, angle)
G.FillEllipse(DrawGradientBrush, r)
End Sub
#End Region
#Region " CreateRound "
Private CreateRoundPath As GraphicsPath
Private CreateRoundRectangle As Rectangle
Function CreateRound(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal slope As Integer) As GraphicsPath
CreateRoundRectangle = New Rectangle(x, y, width, height)
Return CreateRound(CreateRoundRectangle, slope)
End Function
Function CreateRound(ByVal r As Rectangle, ByVal slope As Integer) As GraphicsPath
CreateRoundPath = New GraphicsPath(FillMode.Winding)
CreateRoundPath.AddArc(r.X, r.Y, slope, slope, 180.0F, 90.0F)
CreateRoundPath.AddArc(r.Right - slope, r.Y, slope, slope, 270.0F, 90.0F)
CreateRoundPath.AddArc(r.Right - slope, r.Bottom - slope, slope, slope, 0.0F, 90.0F)
CreateRoundPath.AddArc(r.X, r.Bottom - slope, slope, slope, 90.0F, 90.0F)
CreateRoundPath.CloseFigure()
Return CreateRoundPath
End Function
#End Region
End Class
MustInherit Class ThemeControl154
Inherits Control
#Region " Initialization "
Protected G As Graphics, B As Bitmap
Sub New()
SetStyle(DirectCast(139270, ControlStyles), True)
_ImageSize = Size.Empty
Font = New Font("Verdana", 8S)
MeasureBitmap = New Bitmap(1, 1)
MeasureGraphics = Graphics.FromImage(MeasureBitmap)
DrawRadialPath = New GraphicsPath
InvalidateCustimization() 'Remove?
End Sub
Protected NotOverridable Overrides Sub OnHandleCreated(ByVal e As EventArgs)
InvalidateCustimization()
ColorHook()
If Not _LockWidth = 0 Then Width = _LockWidth
If Not _LockHeight = 0 Then Height = _LockHeight
Transparent = _Transparent
If _Transparent AndAlso _BackColor Then BackColor = Color.Transparent
MyBase.OnHandleCreated(e)
End Sub
Private DoneCreation As Boolean
Protected NotOverridable Overrides Sub OnParentChanged(ByVal e As EventArgs)
If Parent IsNot Nothing Then
OnCreation()
DoneCreation = True
InvalidateTimer()
End If
MyBase.OnParentChanged(e)
End Sub
#End Region
Private Sub DoAnimation(ByVal i As Boolean)
OnAnimation()
If i Then Invalidate()
End Sub
Protected NotOverridable Overrides Sub OnPaint(ByVal e As PaintEventArgs)
If Width = 0 OrElse Height = 0 Then Return
If _Transparent Then
PaintHook()
e.Graphics.DrawImage(B, 0, 0)
Else
G = e.Graphics
PaintHook()
End If
End Sub
Protected Overrides Sub OnHandleDestroyed(ByVal e As EventArgs)
RemoveAnimationCallback(AddressOf DoAnimation)
MyBase.OnHandleDestroyed(e)
End Sub
#Region " Size Handling "
Protected NotOverridable Overrides Sub OnSizeChanged(ByVal e As EventArgs)
If _Transparent Then
InvalidateBitmap()
End If
Invalidate()
MyBase.OnSizeChanged(e)
End Sub
Protected Overrides Sub SetBoundsCore(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal specified As BoundsSpecified)
If Not _LockWidth = 0 Then width = _LockWidth
If Not _LockHeight = 0 Then height = _LockHeight
MyBase.SetBoundsCore(x, y, width, height, specified)
End Sub
#End Region
#Region " State Handling "
Private InPosition As Boolean
Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs)
InPosition = True
SetState(MouseState.Over)
MyBase.OnMouseEnter(e)
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
If InPosition Then SetState(MouseState.Over)
MyBase.OnMouseUp(e)
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then SetState(MouseState.Down)
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)
InPosition = False
SetState(MouseState.None)
MyBase.OnMouseLeave(e)
End Sub
Protected Overrides Sub OnEnabledChanged(ByVal e As EventArgs)
If Enabled Then SetState(MouseState.None) Else SetState(MouseState.Block)
MyBase.OnEnabledChanged(e)
End Sub
Protected State As MouseState
Private Sub SetState(ByVal current As MouseState)
State = current
Invalidate()
End Sub
#End Region
#Region " Base Properties "
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Overrides Property ForeColor() As Color
Get
Return Color.Empty
End Get
Set(ByVal value As Color)
End Set
End Property
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Overrides Property BackgroundImage() As Image
Get
Return Nothing
End Get
Set(ByVal value As Image)
End Set
End Property
<Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Overrides Property BackgroundImageLayout() As ImageLayout
Get
Return ImageLayout.None
End Get
Set(ByVal value As ImageLayout)
End Set
End Property
Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal value As String)
MyBase.Text = value
Invalidate()
End Set
End Property
Overrides Property Font() As Font
Get
Return MyBase.Font
End Get
Set(ByVal value As Font)
MyBase.Font = value
Invalidate()
End Set
End Property
Private _BackColor As Boolean
<Category("Misc")> _
Overrides Property BackColor() As Color
Get
Return MyBase.BackColor
End Get
Set(ByVal value As Color)
If Not IsHandleCreated AndAlso value = Color.Transparent Then
_BackColor = True
Return
End If
MyBase.BackColor = value
If Parent IsNot Nothing Then ColorHook()
End Set
End Property
#End Region
#Region " Public Properties "
Private _NoRounding As Boolean
Property NoRounding() As Boolean
Get
Return _NoRounding
End Get
Set(ByVal v As Boolean)
_NoRounding = v
Invalidate()
End Set
End Property
Private _Image As Image
Property Image() As Image
Get
Return _Image
End Get
Set(ByVal value As Image)
If value Is Nothing Then
_ImageSize = Size.Empty
Else
_ImageSize = value.Size
End If
_Image = value
Invalidate()
End Set
End Property
Private _Transparent As Boolean
Property Transparent() As Boolean
Get
Return _Transparent
End Get
Set(ByVal value As Boolean)
_Transparent = value
If Not IsHandleCreated Then Return
If Not value AndAlso Not BackColor.A = 255 Then
Throw New Exception("Unable to change value to false while a transparent BackColor is in use.")
End If
SetStyle(ControlStyles.Opaque, Not value)
SetStyle(ControlStyles.SupportsTransparentBackColor, value)
If value Then InvalidateBitmap() Else B = Nothing
Invalidate()
End Set
End Property
Private Items As New Dictionary(Of String, Color)
Property Colors() As Bloom()
Get
Dim T As New List(Of Bloom)
Dim E As Dictionary(Of String, Color).Enumerator = Items.GetEnumerator
While E.MoveNext
T.Add(New Bloom(E.Current.Key, E.Current.Value))
End While
Return T.ToArray
End Get
Set(ByVal value As Bloom())
For Each B As Bloom In value
If Items.ContainsKey(B.Name) Then Items(B.Name) = B.Value
Next
InvalidateCustimization()
ColorHook()
Invalidate()
End Set
End Property
Private _Customization As String
Property Customization() As String
Get
Return _Customization
End Get
Set(ByVal value As String)
If value = _Customization Then Return
Dim Data As Byte()
Dim Items As Bloom() = Colors
Try
Data = Convert.FromBase64String(value)
For I As Integer = 0 To Items.Length - 1
Items(I).Value = Color.FromArgb(BitConverter.ToInt32(Data, I * 4))
Next
Catch
Return
End Try
_Customization = value
Colors = Items
ColorHook()
Invalidate()
End Set
End Property
#End Region
#Region " Private Properties "
Private _ImageSize As Size
Protected ReadOnly Property ImageSize() As Size
Get
Return _ImageSize
End Get
End Property
Private _LockWidth As Integer
Protected Property LockWidth() As Integer
Get
Return _LockWidth
End Get
Set(ByVal value As Integer)
_LockWidth = value
If Not LockWidth = 0 AndAlso IsHandleCreated Then Width = LockWidth
End Set
End Property
Private _LockHeight As Integer
Protected Property LockHeight() As Integer
Get
Return _LockHeight
End Get
Set(ByVal value As Integer)
_LockHeight = value
If Not LockHeight = 0 AndAlso IsHandleCreated Then Height = LockHeight
End Set
End Property
Private _IsAnimated As Boolean
Protected Property IsAnimated() As Boolean
Get
Return _IsAnimated
End Get
Set(ByVal value As Boolean)
_IsAnimated = value
InvalidateTimer()
End Set
End Property
#End Region
#Region " Property Helpers "
Protected Function GetPen(ByVal name As String) As Pen
Return New Pen(Items(name))
End Function
Protected Function GetPen(ByVal name As String, ByVal width As Single) As Pen
Return New Pen(Items(name), width)
End Function
Protected Function GetBrush(ByVal name As String) As SolidBrush
Return New SolidBrush(Items(name))
End Function
Protected Function GetColor(ByVal name As String) As Color
Return Items(name)
End Function
Protected Sub SetColor(ByVal name As String, ByVal value As Color)
If Items.ContainsKey(name) Then Items(name) = value Else Items.Add(name, value)
End Sub
Protected Sub SetColor(ByVal name As String, ByVal r As Byte, ByVal g As Byte, ByVal b As Byte)
SetColor(name, Color.FromArgb(r, g, b))
End Sub
Protected Sub SetColor(ByVal name As String, ByVal a As Byte, ByVal r As Byte, ByVal g As Byte, ByVal b As Byte)
SetColor(name, Color.FromArgb(a, r, g, b))
End Sub
Protected Sub SetColor(ByVal name As String, ByVal a As Byte, ByVal value As Color)
SetColor(name, Color.FromArgb(a, value))
End Sub
Private Sub InvalidateBitmap()
If Width = 0 OrElse Height = 0 Then Return
B = New Bitmap(Width, Height, PixelFormat.Format32bppPArgb)
G = Graphics.FromImage(B)
End Sub
Private Sub InvalidateCustimization()
Dim M As New MemoryStream(Items.Count * 4)
For Each B As Bloom In Colors
M.Write(BitConverter.GetBytes(B.Value.ToArgb), 0, 4)
Next
M.Close()
_Customization = Convert.ToBase64String(M.ToArray)
End Sub
Private Sub InvalidateTimer()
If DesignMode OrElse Not DoneCreation Then Return
If _IsAnimated Then
AddAnimationCallback(AddressOf DoAnimation)
Else
RemoveAnimationCallback(AddressOf DoAnimation)
End If
End Sub
#End Region
#Region " User Hooks "
Protected MustOverride Sub ColorHook()
Protected MustOverride Sub PaintHook()
Protected Overridable Sub OnCreation()
End Sub
Protected Overridable Sub OnAnimation()
End Sub
#End Region
#Region " Offset "
Private OffsetReturnRectangle As Rectangle
Protected Function Offset(ByVal r As Rectangle, ByVal amount As Integer) As Rectangle
OffsetReturnRectangle = New Rectangle(r.X + amount, r.Y + amount, r.Width - (amount * 2), r.Height - (amount * 2))
Return OffsetReturnRectangle
End Function
Private OffsetReturnSize As Size
Protected Function Offset(ByVal s As Size, ByVal amount As Integer) As Size
OffsetReturnSize = New Size(s.Width + amount, s.Height + amount)
Return OffsetReturnSize
End Function
Private OffsetReturnPoint As Point
Protected Function Offset(ByVal p As Point, ByVal amount As Integer) As Point
OffsetReturnPoint = New Point(p.X + amount, p.Y + amount)
Return OffsetReturnPoint
End Function
#End Region
#Region " Center "
Private CenterReturn As Point
Protected Function Center(ByVal p As Rectangle, ByVal c As Rectangle) As Point
CenterReturn = New Point((p.Width \ 2 - c.Width \ 2) + p.X + c.X, (p.Height \ 2 - c.Height \ 2) + p.Y + c.Y)
Return CenterReturn
End Function
Protected Function Center(ByVal p As Rectangle, ByVal c As Size) As Point
CenterReturn = New Point((p.Width \ 2 - c.Width \ 2) + p.X, (p.Height \ 2 - c.Height \ 2) + p.Y)
Return CenterReturn
End Function
Protected Function Center(ByVal child As Rectangle) As Point
Return Center(Width, Height, child.Width, child.Height)
End Function
Protected Function Center(ByVal child As Size) As Point
Return Center(Width, Height, child.Width, child.Height)
End Function
Protected Function Center(ByVal childWidth As Integer, ByVal childHeight As Integer) As Point
Return Center(Width, Height, childWidth, childHeight)
End Function
Protected Function Center(ByVal p As Size, ByVal c As Size) As Point
Return Center(p.Width, p.Height, c.Width, c.Height)
End Function
Protected Function Center(ByVal pWidth As Integer, ByVal pHeight As Integer, ByVal cWidth As Integer, ByVal cHeight As Integer) As Point
CenterReturn = New Point(pWidth \ 2 - cWidth \ 2, pHeight \ 2 - cHeight \ 2)
Return CenterReturn
End Function
#End Region
#Region " Measure "
Private MeasureBitmap As Bitmap
Private MeasureGraphics As Graphics 'TODO: Potential issues during multi-threading.
Protected Function Measure() As Size
Return MeasureGraphics.MeasureString(Text, Font, Width).ToSize
End Function
Protected Function Measure(ByVal text As String) As Size
Return MeasureGraphics.MeasureString(text, Font, Width).ToSize
End Function
#End Region
#Region " DrawPixel "
Private DrawPixelBrush As SolidBrush
Protected Sub DrawPixel(ByVal c1 As Color, ByVal x As Integer, ByVal y As Integer)
If _Transparent Then
B.SetPixel(x, y, c1)
Else
DrawPixelBrush = New SolidBrush(c1)
G.FillRectangle(DrawPixelBrush, x, y, 1, 1)
End If
End Sub
#End Region
#Region " DrawCorners "
Private DrawCornersBrush As SolidBrush
Protected Sub DrawCorners(ByVal c1 As Color, ByVal offset As Integer)
DrawCorners(c1, 0, 0, Width, Height, offset)
End Sub
Protected Sub DrawCorners(ByVal c1 As Color, ByVal r1 As Rectangle, ByVal offset As Integer)
DrawCorners(c1, r1.X, r1.Y, r1.Width, r1.Height, offset)
End Sub
Protected Sub DrawCorners(ByVal c1 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal offset As Integer)
DrawCorners(c1, x + offset, y + offset, width - (offset * 2), height - (offset * 2))
End Sub
Protected Sub DrawCorners(ByVal c1 As Color)
DrawCorners(c1, 0, 0, Width, Height)
End Sub
Protected Sub DrawCorners(ByVal c1 As Color, ByVal r1 As Rectangle)
DrawCorners(c1, r1.X, r1.Y, r1.Width, r1.Height)
End Sub
Protected Sub DrawCorners(ByVal c1 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
If _NoRounding Then Return
If _Transparent Then
B.SetPixel(x, y, c1)
B.SetPixel(x + (width - 1), y, c1)
B.SetPixel(x, y + (height - 1), c1)
B.SetPixel(x + (width - 1), y + (height - 1), c1)
Else
DrawCornersBrush = New SolidBrush(c1)
G.FillRectangle(DrawCornersBrush, x, y, 1, 1)
G.FillRectangle(DrawCornersBrush, x + (width - 1), y, 1, 1)
G.FillRectangle(DrawCornersBrush, x, y + (height - 1), 1, 1)
G.FillRectangle(DrawCornersBrush, x + (width - 1), y + (height - 1), 1, 1)
End If
End Sub
#End Region
#Region " DrawBorders "
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal offset As Integer)
DrawBorders(p1, 0, 0, Width, Height, offset)
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal r As Rectangle, ByVal offset As Integer)
DrawBorders(p1, r.X, r.Y, r.Width, r.Height, offset)
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal offset As Integer)
DrawBorders(p1, x + offset, y + offset, width - (offset * 2), height - (offset * 2))
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen)
DrawBorders(p1, 0, 0, Width, Height)
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal r As Rectangle)
DrawBorders(p1, r.X, r.Y, r.Width, r.Height)
End Sub
Protected Sub DrawBorders(ByVal p1 As Pen, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
G.DrawRectangle(p1, x, y, width - 1, height - 1)
End Sub
#End Region
#Region " DrawText "
Private DrawTextPoint As Point
Private DrawTextSize As Size
Protected Sub DrawText(ByVal b1 As Brush, ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer)
DrawText(b1, Text, a, x, y)
End Sub
Protected Sub DrawText(ByVal b1 As Brush, ByVal text As String, ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer)
If text.Length = 0 Then Return
DrawTextSize = Measure(text)
DrawTextPoint = Center(DrawTextSize)
Select Case a
Case HorizontalAlignment.Left
G.DrawString(text, Font, b1, x, DrawTextPoint.Y + y)
Case HorizontalAlignment.Center
G.DrawString(text, Font, b1, DrawTextPoint.X + x, DrawTextPoint.Y + y)
Case HorizontalAlignment.Right
G.DrawString(text, Font, b1, Width - DrawTextSize.Width - x, DrawTextPoint.Y + y)
End Select
End Sub
Protected Sub DrawText(ByVal b1 As Brush, ByVal p1 As Point)
If Text.Length = 0 Then Return
G.DrawString(Text, Font, b1, p1)
End Sub
Protected Sub DrawText(ByVal b1 As Brush, ByVal x As Integer, ByVal y As Integer)
If Text.Length = 0 Then Return
G.DrawString(Text, Font, b1, x, y)
End Sub
#End Region
#Region " DrawImage "
Private DrawImagePoint As Point
Protected Sub DrawImage(ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer)
DrawImage(_Image, a, x, y)
End Sub
Protected Sub DrawImage(ByVal image As Image, ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer)
If image Is Nothing Then Return
DrawImagePoint = Center(image.Size)
Select Case a
Case HorizontalAlignment.Left
G.DrawImage(image, x, DrawImagePoint.Y + y, image.Width, image.Height)
Case HorizontalAlignment.Center
G.DrawImage(image, DrawImagePoint.X + x, DrawImagePoint.Y + y, image.Width, image.Height)
Case HorizontalAlignment.Right
G.DrawImage(image, Width - image.Width - x, DrawImagePoint.Y + y, image.Width, image.Height)
End Select
End Sub
Protected Sub DrawImage(ByVal p1 As Point)
DrawImage(_Image, p1.X, p1.Y)
End Sub
Protected Sub DrawImage(ByVal x As Integer, ByVal y As Integer)
DrawImage(_Image, x, y)
End Sub
Protected Sub DrawImage(ByVal image As Image, ByVal p1 As Point)
DrawImage(image, p1.X, p1.Y)
End Sub
Protected Sub DrawImage(ByVal image As Image, ByVal x As Integer, ByVal y As Integer)
If image Is Nothing Then Return
G.DrawImage(image, x, y, image.Width, image.Height)
End Sub
#End Region
#Region " DrawGradient "
Private DrawGradientBrush As LinearGradientBrush
Private DrawGradientRectangle As Rectangle
Protected Sub DrawGradient(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
DrawGradientRectangle = New Rectangle(x, y, width, height)
DrawGradient(blend, DrawGradientRectangle)
End Sub
Protected Sub DrawGradient(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal angle As Single)
DrawGradientRectangle = New Rectangle(x, y, width, height)
DrawGradient(blend, DrawGradientRectangle, angle)
End Sub
Protected Sub DrawGradient(ByVal blend As ColorBlend, ByVal r As Rectangle)
DrawGradientBrush = New LinearGradientBrush(r, Color.Empty, Color.Empty, 90.0F)
DrawGradientBrush.InterpolationColors = blend
G.FillRectangle(DrawGradientBrush, r)
End Sub
Protected Sub DrawGradient(ByVal blend As ColorBlend, ByVal r As Rectangle, ByVal angle As Single)
DrawGradientBrush = New LinearGradientBrush(r, Color.Empty, Color.Empty, angle)
DrawGradientBrush.InterpolationColors = blend
G.FillRectangle(DrawGradientBrush, r)
End Sub
Protected Sub DrawGradient(ByVal c1 As Color, ByVal c2 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
DrawGradientRectangle = New Rectangle(x, y, width, height)
DrawGradient(c1, c2, DrawGradientRectangle)
End Sub
Protected Sub DrawGradient(ByVal c1 As Color, ByVal c2 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal angle As Single)
DrawGradientRectangle = New Rectangle(x, y, width, height)
DrawGradient(c1, c2, DrawGradientRectangle, angle)
End Sub
Protected Sub DrawGradient(ByVal c1 As Color, ByVal c2 As Color, ByVal r As Rectangle)
DrawGradientBrush = New LinearGradientBrush(r, c1, c2, 90.0F)
G.FillRectangle(DrawGradientBrush, r)
End Sub
Protected Sub DrawGradient(ByVal c1 As Color, ByVal c2 As Color, ByVal r As Rectangle, ByVal angle As Single)
DrawGradientBrush = New LinearGradientBrush(r, c1, c2, angle)
G.FillRectangle(DrawGradientBrush, r)
End Sub
#End Region
#Region " DrawRadial "
Private DrawRadialPath As GraphicsPath
Private DrawRadialBrush1 As PathGradientBrush
Private DrawRadialBrush2 As LinearGradientBrush
Private DrawRadialRectangle As Rectangle
Sub DrawRadial(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(blend, DrawRadialRectangle, width \ 2, height \ 2)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal center As Point)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(blend, DrawRadialRectangle, center.X, center.Y)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal cx As Integer, ByVal cy As Integer)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(blend, DrawRadialRectangle, cx, cy)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal r As Rectangle)
DrawRadial(blend, r, r.Width \ 2, r.Height \ 2)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal r As Rectangle, ByVal center As Point)
DrawRadial(blend, r, center.X, center.Y)
End Sub
Sub DrawRadial(ByVal blend As ColorBlend, ByVal r As Rectangle, ByVal cx As Integer, ByVal cy As Integer)
DrawRadialPath.Reset()
DrawRadialPath.AddEllipse(r.X, r.Y, r.Width - 1, r.Height - 1)
DrawRadialBrush1 = New PathGradientBrush(DrawRadialPath)
DrawRadialBrush1.CenterPoint = New Point(r.X + cx, r.Y + cy)
DrawRadialBrush1.InterpolationColors = blend
If G.SmoothingMode = SmoothingMode.AntiAlias Then
G.FillEllipse(DrawRadialBrush1, r.X + 1, r.Y + 1, r.Width - 3, r.Height - 3)
Else
G.FillEllipse(DrawRadialBrush1, r)
End If
End Sub
Protected Sub DrawRadial(ByVal c1 As Color, ByVal c2 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(c1, c2, DrawRadialRectangle)
End Sub
Protected Sub DrawRadial(ByVal c1 As Color, ByVal c2 As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal angle As Single)
DrawRadialRectangle = New Rectangle(x, y, width, height)
DrawRadial(c1, c2, DrawRadialRectangle, angle)
End Sub
Protected Sub DrawRadial(ByVal c1 As Color, ByVal c2 As Color, ByVal r As Rectangle)
DrawRadialBrush2 = New LinearGradientBrush(r, c1, c2, 90.0F)
G.FillEllipse(DrawRadialBrush2, r)
End Sub
Protected Sub DrawRadial(ByVal c1 As Color, ByVal c2 As Color, ByVal r As Rectangle, ByVal angle As Single)
DrawRadialBrush2 = New LinearGradientBrush(r, c1, c2, angle)
G.FillEllipse(DrawRadialBrush2, r)
End Sub
#End Region
#Region " CreateRound "
Private CreateRoundPath As GraphicsPath
Private CreateRoundRectangle As Rectangle
Function CreateRound(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal slope As Integer) As GraphicsPath
CreateRoundRectangle = New Rectangle(x, y, width, height)
Return CreateRound(CreateRoundRectangle, slope)
End Function
Function CreateRound(ByVal r As Rectangle, ByVal slope As Integer) As GraphicsPath
CreateRoundPath = New GraphicsPath(FillMode.Winding)
CreateRoundPath.AddArc(r.X, r.Y, slope, slope, 180.0F, 90.0F)
CreateRoundPath.AddArc(r.Right - slope, r.Y, slope, slope, 270.0F, 90.0F)
CreateRoundPath.AddArc(r.Right - slope, r.Bottom - slope, slope, slope, 0.0F, 90.0F)
CreateRoundPath.AddArc(r.X, r.Bottom - slope, slope, slope, 90.0F, 90.0F)
CreateRoundPath.CloseFigure()
Return CreateRoundPath
End Function
#End Region
End Class
Module ThemeShare
#Region " Animation "
Private Frames As Integer
Private Invalidate As Boolean
Public ThemeTimer As New PrecisionTimer
Private Const FPS As Integer = 50 '1000 / 50 = 20 FPS
Private Const Rate As Integer = 10
Public Delegate Sub AnimationDelegate(ByVal invalidate As Boolean)
Private Callbacks As New List(Of AnimationDelegate)
Private Sub HandleCallbacks(ByVal state As IntPtr, ByVal reserve As Boolean)
Invalidate = (Frames >= FPS)
If Invalidate Then Frames = 0
SyncLock Callbacks
For I As Integer = 0 To Callbacks.Count - 1
Callbacks(I).Invoke(Invalidate)
Next
End SyncLock
Frames += Rate
End Sub
Private Sub InvalidateThemeTimer()
If Callbacks.Count = 0 Then
ThemeTimer.Delete()
Else
ThemeTimer.Create(0, Rate, AddressOf HandleCallbacks)
End If
End Sub
Sub AddAnimationCallback(ByVal callback As AnimationDelegate)
SyncLock Callbacks
If Callbacks.Contains(callback) Then Return
Callbacks.Add(callback)
InvalidateThemeTimer()
End SyncLock
End Sub
Sub RemoveAnimationCallback(ByVal callback As AnimationDelegate)
SyncLock Callbacks
If Not Callbacks.Contains(callback) Then Return
Callbacks.Remove(callback)
InvalidateThemeTimer()
End SyncLock
End Sub
#End Region
End Module
Enum MouseState As Byte
None = 0
Over = 1
Down = 2
Block = 3
End Enum
Structure Bloom
Public _Name As String
ReadOnly Property Name() As String
Get
Return _Name
End Get
End Property
Private _Value As Color
Property Value() As Color
Get
Return _Value
End Get
Set(ByVal value As Color)
_Value = value
End Set
End Property
Property ValueHex() As String
Get
Return String.Concat("#", _
_Value.R.ToString("X2", Nothing), _
_Value.G.ToString("X2", Nothing), _
_Value.B.ToString("X2", Nothing))
End Get
Set(ByVal value As String)
Try
_Value = ColorTranslator.FromHtml(value)
Catch
Return
End Try
End Set
End Property
Sub New(ByVal name As String, ByVal value As Color)
_Name = name
_Value = value
End Sub
End Structure
'------------------
'Creator: aeonhack
'Site: elitevs.net
'Created: 11/30/2011
'Changed: 11/30/2011
'Version: 1.0.0
'------------------
Class PrecisionTimer
Implements IDisposable
Private _Enabled As Boolean
ReadOnly Property Enabled() As Boolean
Get
Return _Enabled
End Get
End Property
Private Handle As IntPtr
Private TimerCallback As TimerDelegate
<DllImport("kernel32.dll", EntryPoint:="CreateTimerQueueTimer")> _
Private Shared Function CreateTimerQueueTimer( _
ByRef handle As IntPtr, _
ByVal queue As IntPtr, _
ByVal callback As TimerDelegate, _
ByVal state As IntPtr, _
ByVal dueTime As UInteger, _
ByVal period As UInteger, _
ByVal flags As UInteger) As Boolean
End Function
<DllImport("kernel32.dll", EntryPoint:="DeleteTimerQueueTimer")> _
Private Shared Function DeleteTimerQueueTimer( _
ByVal queue As IntPtr, _
ByVal handle As IntPtr, _
ByVal callback As IntPtr) As Boolean
End Function
Delegate Sub TimerDelegate(ByVal r1 As IntPtr, ByVal r2 As Boolean)
Sub Create(ByVal dueTime As UInteger, ByVal period As UInteger, ByVal callback As TimerDelegate)
If _Enabled Then Return
TimerCallback = callback
Dim Success As Boolean = CreateTimerQueueTimer(Handle, IntPtr.Zero, TimerCallback, IntPtr.Zero, dueTime, period, 0)
If Not Success Then ThrowNewException("CreateTimerQueueTimer")
_Enabled = Success
End Sub
Sub Delete()
If Not _Enabled Then Return
Dim Success As Boolean = DeleteTimerQueueTimer(IntPtr.Zero, Handle, IntPtr.Zero)
If Not Success AndAlso Not Marshal.GetLastWin32Error = 997 Then
ThrowNewException("DeleteTimerQueueTimer")
End If
_Enabled = Not Success
End Sub
Private Sub ThrowNewException(ByVal name As String)
Throw New Exception(String.Format("{0} failed. Win32Error: {1}", name, Marshal.GetLastWin32Error))
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Delete()
End Sub
End Class
'IMPORTANT:
'Please leave these comments in place as they help protect intellectual rights and allow
'developers to determine the version of the theme they are using. The preffered method
'of distributing this theme is through the Nimoru Software home page at nimoru.com.
'Name: Net Seal Theme
'Created: 6/21/2013
'Version: 1.0.0.1 beta
'Site: http://nimoru.com/
'This work is licensed under a Creative Commons Attribution 3.0 Unported License.
'To view a copy of this license, please visit http://creativecommons.org/licenses/by/3.0/
'Copyright © 2013 Nimoru Software
Module ThemeModule
Friend G As Graphics
Sub New()
TextBitmap = New Bitmap(1, 1)
TextGraphics = Graphics.FromImage(TextBitmap)
End Sub
Private TextBitmap As Bitmap
Private TextGraphics As Graphics
Friend Function MeasureString(text As String, font As Font) As SizeF
Return TextGraphics.MeasureString(text, font)
End Function
Friend Function MeasureString(text As String, font As Font, width As Integer) As SizeF
Return TextGraphics.MeasureString(text, font, width, StringFormat.GenericTypographic)
End Function
Private CreateRoundPath As GraphicsPath
Private CreateRoundRectangle As Rectangle
Friend Function CreateRound(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal slope As Integer) As GraphicsPath
CreateRoundRectangle = New Rectangle(x, y, width, height)
Return CreateRound(CreateRoundRectangle, slope)
End Function
Friend Function CreateRound(ByVal r As Rectangle, ByVal slope As Integer) As GraphicsPath
CreateRoundPath = New GraphicsPath(FillMode.Winding)
CreateRoundPath.AddArc(r.X, r.Y, slope, slope, 180.0F, 90.0F)
CreateRoundPath.AddArc(r.Right - slope, r.Y, slope, slope, 270.0F, 90.0F)
CreateRoundPath.AddArc(r.Right - slope, r.Bottom - slope, slope, slope, 0.0F, 90.0F)
CreateRoundPath.AddArc(r.X, r.Bottom - slope, slope, slope, 90.0F, 90.0F)
CreateRoundPath.CloseFigure()
Return CreateRoundPath
End Function
End Module
Class NSTheme
Inherits ThemeContainer154
Private _AccentOffset As Integer = 42
Public Property AccentOffset() As Integer
Get
Return _AccentOffset
End Get
Set(ByVal value As Integer)
_AccentOffset = value
Invalidate()
End Set
End Property
Sub New()
Header = 30
BackColor = Color.FromArgb(50, 50, 50)
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(60, 60, 60))
B1 = New SolidBrush(Color.FromArgb(50, 50, 50))
End Sub
Protected Overrides Sub ColorHook()
End Sub
Private R1 As Rectangle
Private P1, P2 As Pen
Private B1 As SolidBrush
Private Pad As Integer
Protected Overrides Sub PaintHook()
G.Clear(BackColor)
DrawBorders(P2, 1)
G.DrawLine(P1, 0, 26, Width, 26)
G.DrawLine(P2, 0, 25, Width, 25)
Pad = Math.Max(Measure().Width + 20, 80)
R1 = New Rectangle(Pad, 17, Width - (Pad * 2) + _AccentOffset, 8)
G.DrawRectangle(P2, R1)
G.DrawRectangle(P1, R1.X + 1, R1.Y + 1, R1.Width - 2, R1.Height)
G.DrawLine(P1, 0, 29, Width, 29)
G.DrawLine(P2, 0, 30, Width, 30)
DrawText(Brushes.Black, HorizontalAlignment.Left, 8, 1)
DrawText(Brushes.WhiteSmoke, HorizontalAlignment.Left, 7, 0)
G.FillRectangle(B1, 0, 27, Width, 2)
DrawBorders(Pens.Black)
End Sub
End Class
Class NSButton
Inherits Control
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(65, 65, 65))
End Sub
Private IsMouseDown As Boolean
Private GP1, GP2 As GraphicsPath
Private SZ1 As SizeF
Private PT1 As PointF
Private P1, P2 As Pen
Private PB1 As PathGradientBrush
Private GB1 As LinearGradientBrush
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7)
GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7)
If IsMouseDown Then
PB1 = New PathGradientBrush(GP1)
PB1.CenterColor = Color.FromArgb(60, 60, 60)
PB1.SurroundColors = {Color.FromArgb(55, 55, 55)}
PB1.FocusScales = New PointF(0.8F, 0.5F)
G.FillPath(PB1, GP1)
Else
GB1 = New LinearGradientBrush(ClientRectangle, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F)
G.FillPath(GB1, GP1)
End If
G.DrawPath(P1, GP1)
G.DrawPath(P2, GP2)
SZ1 = G.MeasureString(Text, Font)
PT1 = New PointF(5, Height \ 2 - SZ1.Height / 2)
If IsMouseDown Then
PT1.X += 1.0F
PT1.Y += 1.0F
End If
G.DrawString(Text, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(Text, Font, Brushes.WhiteSmoke, PT1)
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
IsMouseDown = True
Invalidate()
End Sub
Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
IsMouseDown = False
Invalidate()
End Sub
End Class
Class NSProgressBar
Inherits Control
Private _Minimum As Integer
Property Minimum() As Integer
Get
Return _Minimum
End Get
Set(ByVal value As Integer)
If value < 0 Then
Throw New Exception("Property value is not valid.")
End If
_Minimum = value
If value > _Value Then _Value = value
If value > _Maximum Then _Maximum = value
Invalidate()
End Set
End Property
Private _Maximum As Integer = 100
Property Maximum() As Integer
Get
Return _Maximum
End Get
Set(ByVal value As Integer)
If value < 0 Then
Throw New Exception("Property value is not valid.")
End If
_Maximum = value
If value < _Value Then _Value = value
If value < _Minimum Then _Minimum = value
Invalidate()
End Set
End Property
Private _Value As Integer
Property Value() As Integer
Get
Return _Value
End Get
Set(ByVal value As Integer)
If value > _Maximum OrElse value < _Minimum Then
Throw New Exception("Property value is not valid.")
End If
_Value = value
Invalidate()
End Set
End Property
Private Sub Increment(ByVal amount As Integer)
Value += amount
End Sub
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(55, 55, 55))
B1 = New SolidBrush(Color.FromArgb(51, 181, 229))
End Sub
Private GP1, GP2, GP3 As GraphicsPath
Private R1, R2 As Rectangle
Private P1, P2 As Pen
Private B1 As SolidBrush
Private GB1, GB2 As LinearGradientBrush
Private I1 As Integer
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7)
GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7)
R1 = New Rectangle(0, 2, Width - 1, Height - 1)
GB1 = New LinearGradientBrush(R1, Color.FromArgb(45, 45, 45), Color.FromArgb(50, 50, 50), 90.0F)
G.SetClip(GP1)
G.FillRectangle(GB1, R1)
I1 = CInt((_Value - _Minimum) / (_Maximum - _Minimum) * (Width - 3))
If I1 > 1 Then
GP3 = CreateRound(1, 1, I1, Height - 3, 7)
R2 = New Rectangle(1, 1, I1, Height - 3)
GB2 = New LinearGradientBrush(R2, Color.FromArgb(51, 181, 229), Color.FromArgb(0, 153, 204), 90.0F)
G.FillPath(GB2, GP3)
G.DrawPath(P1, GP3)
G.SetClip(GP3)
G.SmoothingMode = SmoothingMode.None
G.FillRectangle(B1, R2.X, R2.Y + 1, R2.Width, R2.Height \ 2)
G.SmoothingMode = SmoothingMode.AntiAlias
G.ResetClip()
End If
G.DrawPath(P2, GP1)
G.DrawPath(P1, GP2)
End Sub
End Class
Class NSLabel
Inherits Control
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Font = New Font("Segoe UI", 11.25F, FontStyle.Bold)
B1 = New SolidBrush(Color.FromArgb(51, 181, 229))
End Sub
Private _Value1 As String = "NET"
Public Property Value1() As String
Get
Return _Value1
End Get
Set(ByVal value As String)
_Value1 = value
Invalidate()
End Set
End Property
Private _Value2 As String = "SEAL"
Public Property Value2() As String
Get
Return _Value2
End Get
Set(ByVal value As String)
_Value2 = value
Invalidate()
End Set
End Property
Private B1 As SolidBrush
Private PT1, PT2 As PointF
Private SZ1, SZ2 As SizeF
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
SZ1 = G.MeasureString(Value1, Font, Width, StringFormat.GenericTypographic)
SZ2 = G.MeasureString(Value2, Font, Width, StringFormat.GenericTypographic)
PT1 = New PointF(0, Height \ 2 - SZ1.Height / 2)
PT2 = New PointF(SZ1.Width + 1, Height \ 2 - SZ1.Height / 2)
G.DrawString(Value1, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(Value1, Font, Brushes.WhiteSmoke, PT1)
G.DrawString(Value2, Font, Brushes.Black, PT2.X + 1, PT2.Y + 1)
G.DrawString(Value2, Font, B1, PT2)
End Sub
End Class
Class KachClazz
Inherits Control
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Font = New Font("Segoe UI", 11.25F, FontStyle.Bold)
B1 = New SolidBrush(Color.FromArgb(51, 181, 229))
End Sub
Private _Value1 As String = "Ќąȼh"
Public Property Value1() As String
Get
Return _Value1
End Get
Set(ByVal value As String)
_Value1 = value
Invalidate()
End Set
End Property
Private _Value2 As String = "ȼℓąƶƶ"
Public Property Value2() As String
Get
Return _Value2
End Get
Set(ByVal value As String)
_Value2 = value
Invalidate()
End Set
End Property
Private B1 As SolidBrush
Private PT1, PT2 As PointF
Private SZ1, SZ2 As SizeF
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
SZ1 = G.MeasureString(Value1, Font, Width, StringFormat.GenericTypographic)
SZ2 = G.MeasureString(Value2, Font, Width, StringFormat.GenericTypographic)
PT1 = New PointF(0, Height \ 2 - SZ1.Height / 2)
PT2 = New PointF(SZ1.Width + 1, Height \ 2 - SZ1.Height / 2)
G.DrawString(Value1, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(Value1, Font, Brushes.WhiteSmoke, PT1)
G.DrawString(Value2, Font, Brushes.Black, PT2.X + 1, PT2.Y + 1)
G.DrawString(Value2, Font, B1, PT2)
End Sub
End Class
<DefaultEvent("TextChanged")> _
Class NSTextBox
Inherits Control
Private _TextAlign As HorizontalAlignment = HorizontalAlignment.Left
Property TextAlign() As HorizontalAlignment
Get
Return _TextAlign
End Get
Set(ByVal value As HorizontalAlignment)
_TextAlign = value
If Base IsNot Nothing Then
Base.TextAlign = value
End If
End Set
End Property
Private _MaxLength As Integer = 32767
Property MaxLength() As Integer
Get
Return _MaxLength
End Get
Set(ByVal value As Integer)
_MaxLength = value
If Base IsNot Nothing Then
Base.MaxLength = value
End If
End Set
End Property
Private _ReadOnly As Boolean
Property [ReadOnly]() As Boolean
Get
Return _ReadOnly
End Get
Set(ByVal value As Boolean)
_ReadOnly = value
If Base IsNot Nothing Then
Base.ReadOnly = value
End If
End Set
End Property
Private _UseSystemPasswordChar As Boolean
Property UseSystemPasswordChar() As Boolean
Get
Return _UseSystemPasswordChar
End Get
Set(ByVal value As Boolean)
_UseSystemPasswordChar = value
If Base IsNot Nothing Then
Base.UseSystemPasswordChar = value
End If
End Set
End Property
Private _Multiline As Boolean
Property Multiline() As Boolean
Get
Return _Multiline
End Get
Set(ByVal value As Boolean)
_Multiline = value
If Base IsNot Nothing Then
Base.Multiline = value
If value Then
Base.Height = Height - 11
Else
Height = Base.Height + 11
End If
End If
End Set
End Property
Overrides Property Text As String
Get
Return MyBase.Text
End Get
Set(ByVal value As String)
MyBase.Text = value
If Base IsNot Nothing Then
Base.Text = value
End If
End Set
End Property
Overrides Property Font As Font
Get
Return MyBase.Font
End Get
Set(ByVal value As Font)
MyBase.Font = value
If Base IsNot Nothing Then
Base.Font = value
Base.Location = New Point(5, 5)
Base.Width = Width - 8
If Not _Multiline Then
Height = Base.Height + 11
End If
End If
End Set
End Property
Protected Overrides Sub OnHandleCreated(e As EventArgs)
If Not Controls.Contains(Base) Then
Controls.Add(Base)
End If
MyBase.OnHandleCreated(e)
End Sub
Private Base As TextBox
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, True)
Cursor = Cursors.IBeam
Base = New TextBox
Base.Font = Font
Base.Text = Text
Base.MaxLength = _MaxLength
Base.Multiline = _Multiline
Base.ReadOnly = _ReadOnly
Base.UseSystemPasswordChar = _UseSystemPasswordChar
Base.ForeColor = Color.FromArgb(235, 235, 235)
Base.BackColor = Color.FromArgb(50, 50, 50)
Base.BorderStyle = BorderStyle.None
Base.Location = New Point(5, 5)
Base.Width = Width - 14
If _Multiline Then
Base.Height = Height - 11
Else
Height = Base.Height + 11
End If
AddHandler Base.TextChanged, AddressOf OnBaseTextChanged
AddHandler Base.KeyDown, AddressOf OnBaseKeyDown
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(55, 55, 55))
End Sub
Private GP1, GP2 As GraphicsPath
Private P1, P2 As Pen
Private PB1 As PathGradientBrush
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7)
GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7)
PB1 = New PathGradientBrush(GP1)
PB1.CenterColor = Color.FromArgb(50, 50, 50)
PB1.SurroundColors = {Color.FromArgb(45, 45, 45)}
PB1.FocusScales = New PointF(0.9F, 0.5F)
G.FillPath(PB1, GP1)
G.DrawPath(P2, GP1)
G.DrawPath(P1, GP2)
End Sub
Private Sub OnBaseTextChanged(ByVal s As Object, ByVal e As EventArgs)
Text = Base.Text
End Sub
Private Sub OnBaseKeyDown(ByVal s As Object, ByVal e As KeyEventArgs)
If e.Control AndAlso e.KeyCode = Keys.A Then
Base.SelectAll()
e.SuppressKeyPress = True
End If
End Sub
Protected Overrides Sub OnResize(ByVal e As EventArgs)
Base.Location = New Point(5, 5)
Base.Width = Width - 10
Base.Height = Height - 11
MyBase.OnResize(e)
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
Base.Focus()
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnEnter(e As EventArgs)
Base.Focus()
Invalidate()
MyBase.OnEnter(e)
End Sub
Protected Overrides Sub OnLeave(e As EventArgs)
Invalidate()
MyBase.OnLeave(e)
End Sub
End Class
<DefaultEvent("CheckedChanged")> _
Class NSCheckBox
Inherits Control
Event CheckedChanged(sender As Object)
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
P11 = New Pen(Color.FromArgb(55, 55, 55))
P22 = New Pen(Color.FromArgb(24, 24, 24))
P3 = New Pen(Color.Black, 2.0F)
P4 = New Pen(Color.FromArgb(235, 235, 235), 2.0F)
End Sub
Private _Checked As Boolean
Public Property Checked() As Boolean
Get
Return _Checked
End Get
Set(ByVal value As Boolean)
_Checked = value
RaiseEvent CheckedChanged(Me)
Invalidate()
End Set
End Property
Private GP1, GP2 As GraphicsPath
Private SZ1 As SizeF
Private PT1 As PointF
Private P11, P22, P3, P4 As Pen
Private PB1 As PathGradientBrush
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 2, Height - 5, Height - 5, 5)
GP2 = CreateRound(1, 3, Height - 7, Height - 7, 5)
PB1 = New PathGradientBrush(GP1)
PB1.CenterColor = Color.FromArgb(50, 50, 50)
PB1.SurroundColors = {Color.FromArgb(45, 45, 45)}
PB1.FocusScales = New PointF(0.3F, 0.3F)
G.FillPath(PB1, GP1)
G.DrawPath(P11, GP1)
G.DrawPath(P22, GP2)
If _Checked Then
G.DrawLine(P3, 5, Height - 9, 8, Height - 7)
G.DrawLine(P3, 7, Height - 7, Height - 8, 7)
G.DrawLine(P4, 4, Height - 10, 7, Height - 8)
G.DrawLine(P4, 6, Height - 8, Height - 9, 6)
End If
SZ1 = G.MeasureString(Text, Font)
PT1 = New PointF(Height - 3, Height \ 2 - SZ1.Height / 2)
G.DrawString(Text, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(Text, Font, Brushes.WhiteSmoke, PT1)
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
Checked = Not Checked
End Sub
End Class
<DefaultEvent("CheckedChanged")> _
Class NSRadioButton
Inherits Control
Event CheckedChanged(sender As Object)
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
P1 = New Pen(Color.FromArgb(55, 55, 55))
P2 = New Pen(Color.FromArgb(24, 24, 24))
End Sub
Private _Checked As Boolean
Public Property Checked() As Boolean
Get
Return _Checked
End Get
Set(ByVal value As Boolean)
_Checked = value
If _Checked Then
InvalidateParent()
End If
RaiseEvent CheckedChanged(Me)
Invalidate()
End Set
End Property
Private Sub InvalidateParent()
If Parent Is Nothing Then Return
For Each C As Control In Parent.Controls
If Not (C Is Me) AndAlso (TypeOf C Is NSRadioButton) Then
DirectCast(C, NSRadioButton).Checked = False
End If
Next
End Sub
Private GP1 As GraphicsPath
Private SZ1 As SizeF
Private PT1 As PointF
Private P1, P2 As Pen
Private PB1 As PathGradientBrush
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = New GraphicsPath
GP1.AddEllipse(0, 2, Height - 5, Height - 5)
PB1 = New PathGradientBrush(GP1)
PB1.CenterColor = Color.FromArgb(50, 50, 50)
PB1.SurroundColors = {Color.FromArgb(45, 45, 45)}
PB1.FocusScales = New PointF(0.3F, 0.3F)
G.FillPath(PB1, GP1)
G.DrawEllipse(P1, 0, 2, Height - 5, Height - 5)
G.DrawEllipse(P2, 1, 3, Height - 7, Height - 7)
If _Checked Then
G.FillEllipse(Brushes.Black, 6, 8, Height - 15, Height - 15)
G.FillEllipse(Brushes.WhiteSmoke, 5, 7, Height - 15, Height - 15)
End If
SZ1 = G.MeasureString(Text, Font)
PT1 = New PointF(Height - 3, Height \ 2 - SZ1.Height / 2)
G.DrawString(Text, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(Text, Font, Brushes.WhiteSmoke, PT1)
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
Checked = True
MyBase.OnMouseDown(e)
End Sub
End Class
Class NSComboBox
Inherits ComboBox
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
DropDownStyle = ComboBoxStyle.DropDownList
BackColor = Color.FromArgb(50, 50, 50)
ForeColor = Color.FromArgb(235, 235, 235)
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(235, 235, 235), 2.0F)
P3 = New Pen(Brushes.Black, 2.0F)
P4 = New Pen(Color.FromArgb(65, 65, 65))
B1 = New SolidBrush(Color.FromArgb(65, 65, 65))
B2 = New SolidBrush(Color.FromArgb(55, 55, 55))
End Sub
Private GP1, GP2 As GraphicsPath
Private SZ1 As SizeF
Private PT1 As PointF
Private P1, P2, P3, P4 As Pen
Private B1, B2 As SolidBrush
Private GB1 As LinearGradientBrush
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7)
GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7)
GB1 = New LinearGradientBrush(ClientRectangle, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F)
G.SetClip(GP1)
G.FillRectangle(GB1, ClientRectangle)
G.ResetClip()
G.DrawPath(P1, GP1)
G.DrawPath(P4, GP2)
SZ1 = G.MeasureString(Text, Font)
PT1 = New PointF(5, Height \ 2 - SZ1.Height / 2)
G.DrawString(Text, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(Text, Font, Brushes.WhiteSmoke, PT1)
G.DrawLine(P3, Width - 15, 10, Width - 11, 13)
G.DrawLine(P3, Width - 7, 10, Width - 11, 13)
G.DrawLine(Pens.Black, Width - 11, 13, Width - 11, 14)
G.DrawLine(P2, Width - 16, 9, Width - 12, 12)
G.DrawLine(P2, Width - 8, 9, Width - 12, 12)
G.DrawLine(Pens.WhiteSmoke, Width - 12, 12, Width - 12, 13)
G.DrawLine(P1, Width - 22, 0, Width - 22, Height)
G.DrawLine(P4, Width - 23, 1, Width - 23, Height - 2)
G.DrawLine(P4, Width - 21, 1, Width - 21, Height - 2)
End Sub
Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
e.Graphics.FillRectangle(B1, e.Bounds)
Else
e.Graphics.FillRectangle(B2, e.Bounds)
End If
If Not e.Index = -1 Then
e.Graphics.DrawString(GetItemText(Items(e.Index)), e.Font, Brushes.WhiteSmoke, e.Bounds)
End If
End Sub
End Class
Class NSTabControl
Inherits TabControl
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
SizeMode = TabSizeMode.Fixed
Alignment = TabAlignment.Left
ItemSize = New Size(28, 115)
DrawMode = TabDrawMode.OwnerDrawFixed
P1 = New Pen(Color.FromArgb(55, 55, 55))
P2 = New Pen(Color.FromArgb(24, 24, 24))
P3 = New Pen(Color.FromArgb(45, 45, 45), 2)
B1 = New SolidBrush(Color.FromArgb(50, 50, 50))
B2 = New SolidBrush(Color.FromArgb(24, 24, 24))
B3 = New SolidBrush(Color.FromArgb(51, 181, 229))
B4 = New SolidBrush(Color.FromArgb(65, 65, 65))
SF1 = New StringFormat()
SF1.LineAlignment = StringAlignment.Center
End Sub
Protected Overrides Sub OnControlAdded(e As ControlEventArgs)
If TypeOf e.Control Is TabPage Then
e.Control.BackColor = Color.FromArgb(50, 50, 50)
End If
MyBase.OnControlAdded(e)
End Sub
Private GP1, GP2, GP3, GP4 As GraphicsPath
Private R1, R2 As Rectangle
Private P1, P2, P3 As Pen
Private B1, B2, B3, B4 As SolidBrush
Private PB1 As PathGradientBrush
Private TP1 As TabPage
Private SF1 As StringFormat
Private Offset As Integer
Private ItemHeight As Integer
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(Color.FromArgb(50, 50, 50))
G.SmoothingMode = SmoothingMode.AntiAlias
ItemHeight = ItemSize.Height + 2
GP1 = CreateRound(0, 0, ItemHeight + 3, Height - 1, 7)
GP2 = CreateRound(1, 1, ItemHeight + 3, Height - 3, 7)
PB1 = New PathGradientBrush(GP1)
PB1.CenterColor = Color.FromArgb(50, 50, 50)
PB1.SurroundColors = {Color.FromArgb(45, 45, 45)}
PB1.FocusScales = New PointF(0.8F, 0.95F)
G.FillPath(PB1, GP1)
G.DrawPath(P1, GP1)
G.DrawPath(P2, GP2)
For I As Integer = 0 To TabCount - 1
R1 = GetTabRect(I)
R1.Y += 2
R1.Height -= 3
R1.Width += 1
R1.X -= 1
TP1 = TabPages(I)
Offset = 0
If SelectedIndex = I Then
G.FillRectangle(B1, R1)
For J As Integer = 0 To 1
G.FillRectangle(B2, R1.X + 5 + (J * 5), R1.Y + 6, 2, R1.Height - 9)
G.SmoothingMode = SmoothingMode.None
G.FillRectangle(B3, R1.X + 5 + (J * 5), R1.Y + 5, 2, R1.Height - 9)
G.SmoothingMode = SmoothingMode.AntiAlias
Offset += 5
Next
G.DrawRectangle(P3, R1.X + 1, R1.Y - 1, R1.Width, R1.Height + 2)
G.DrawRectangle(P1, R1.X + 1, R1.Y + 1, R1.Width - 2, R1.Height - 2)
G.DrawRectangle(P2, R1)
Else
For J As Integer = 0 To 1
G.FillRectangle(B2, R1.X + 5 + (J * 5), R1.Y + 6, 2, R1.Height - 9)
G.SmoothingMode = SmoothingMode.None
G.FillRectangle(B4, R1.X + 5 + (J * 5), R1.Y + 5, 2, R1.Height - 9)
G.SmoothingMode = SmoothingMode.AntiAlias
Offset += 5
Next
End If
R1.X += 5 + Offset
R2 = R1
R2.Y += 1
R2.X += 1
G.DrawString(TP1.Text, Font, Brushes.Black, R2, SF1)
G.DrawString(TP1.Text, Font, Brushes.WhiteSmoke, R1, SF1)
Next
GP3 = CreateRound(ItemHeight, 0, Width - ItemHeight - 1, Height - 1, 7)
GP4 = CreateRound(ItemHeight + 1, 1, Width - ItemHeight - 3, Height - 3, 7)
G.DrawPath(P2, GP3)
G.DrawPath(P1, GP4)
End Sub
End Class
<DefaultEvent("CheckedChanged")> _
Class NSOnOffBox
Inherits Control
Event CheckedChanged(sender As Object)
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
P1 = New Pen(Color.FromArgb(55, 55, 55))
P2 = New Pen(Color.FromArgb(24, 24, 24))
P3 = New Pen(Color.FromArgb(65, 65, 65))
B1 = New SolidBrush(Color.FromArgb(24, 24, 24))
B2 = New SolidBrush(Color.FromArgb(85, 85, 85))
B3 = New SolidBrush(Color.FromArgb(65, 65, 65))
B4 = New SolidBrush(Color.FromArgb(51, 181, 229))
B5 = New SolidBrush(Color.FromArgb(40, 40, 40))
SF1 = New StringFormat()
SF1.LineAlignment = StringAlignment.Center
SF1.Alignment = StringAlignment.Near
SF2 = New StringFormat()
SF2.LineAlignment = StringAlignment.Center
SF2.Alignment = StringAlignment.Far
Size = New Size(56, 24)
MinimumSize = Size
MaximumSize = Size
End Sub
Private _Checked As Boolean
Public Property Checked() As Boolean
Get
Return _Checked
End Get
Set(ByVal value As Boolean)
_Checked = value
RaiseEvent CheckedChanged(Me)
Invalidate()
End Set
End Property
Private GP1, GP2, GP3, GP4 As GraphicsPath
Private P1, P2, P3 As Pen
Private B1, B2, B3, B4, B5 As SolidBrush
Private PB1 As PathGradientBrush
Private GB1 As LinearGradientBrush
Private R1, R2, R3 As Rectangle
Private SF1, SF2 As StringFormat
Private Offset As Integer
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7)
GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7)
PB1 = New PathGradientBrush(GP1)
PB1.CenterColor = Color.FromArgb(50, 50, 50)
PB1.SurroundColors = {Color.FromArgb(45, 45, 45)}
PB1.FocusScales = New PointF(0.3F, 0.3F)
G.FillPath(PB1, GP1)
G.DrawPath(P1, GP1)
G.DrawPath(P2, GP2)
R1 = New Rectangle(5, 0, Width - 10, Height + 2)
R2 = New Rectangle(6, 1, Width - 10, Height + 2)
R3 = New Rectangle(1, 1, (Width \ 2) - 1, Height - 3)
If _Checked Then
G.DrawString("On", Font, Brushes.Black, R2, SF1)
G.DrawString("On", Font, Brushes.WhiteSmoke, R1, SF1)
R3.X += (Width \ 2) - 1
Else
G.DrawString("Off", Font, B1, R2, SF2)
G.DrawString("Off", Font, B2, R1, SF2)
End If
GP3 = CreateRound(R3, 7)
GP4 = CreateRound(R3.X + 1, R3.Y + 1, R3.Width - 2, R3.Height - 2, 7)
GB1 = New LinearGradientBrush(ClientRectangle, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F)
G.FillPath(GB1, GP3)
G.DrawPath(P2, GP3)
G.DrawPath(P3, GP4)
Offset = R3.X + (R3.Width \ 2) - 3
For I As Integer = 0 To 1
If _Checked Then
G.FillRectangle(B1, Offset + (I * 5), 7, 2, Height - 14)
Else
G.FillRectangle(B3, Offset + (I * 5), 7, 2, Height - 14)
End If
G.SmoothingMode = SmoothingMode.None
If _Checked Then
G.FillRectangle(B4, Offset + (I * 5), 7, 2, Height - 14)
Else
G.FillRectangle(B5, Offset + (I * 5), 7, 2, Height - 14)
End If
G.SmoothingMode = SmoothingMode.AntiAlias
Next
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
Checked = Not Checked
MyBase.OnMouseDown(e)
End Sub
End Class
Class NSControlButton
Inherits Control
Enum Button As Byte
None = 0
Minimize = 1
MaximizeRestore = 2
Close = 3
End Enum
Private _ControlButton As Button = Button.Close
Public Property ControlButton() As Button
Get
Return _ControlButton
End Get
Set(ByVal value As Button)
_ControlButton = value
Invalidate()
End Set
End Property
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Anchor = AnchorStyles.Top Or AnchorStyles.Right
Width = 18
Height = 20
MinimumSize = Size
MaximumSize = Size
Margin = New Padding(0)
End Sub
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
G = e.Graphics
G.Clear(BackColor)
Select Case _ControlButton
Case Button.Minimize
DrawMinimize(3, 10)
Case Button.MaximizeRestore
If FindForm().WindowState = FormWindowState.Normal Then
DrawMaximize(3, 5)
Else
DrawRestore(3, 4)
End If
Case Button.Close
DrawClose(4, 5)
End Select
End Sub
Private Sub DrawMinimize(ByVal x As Integer, ByVal y As Integer)
G.FillRectangle(Brushes.WhiteSmoke, x, y, 12, 5)
G.DrawRectangle(Pens.Black, x, y, 11, 4)
End Sub
Private Sub DrawMaximize(ByVal x As Integer, ByVal y As Integer)
G.DrawRectangle(New Pen(Color.FromArgb(235, 235, 235), 2), x + 2, y + 2, 8, 6)
G.DrawRectangle(Pens.Black, x, y, 11, 9)
G.DrawRectangle(Pens.Black, x + 3, y + 3, 5, 3)
End Sub
Private Sub DrawRestore(ByVal x As Integer, ByVal y As Integer)
G.FillRectangle(Brushes.WhiteSmoke, x + 3, y + 1, 8, 4)
G.FillRectangle(Brushes.WhiteSmoke, x + 7, y + 5, 4, 4)
G.DrawRectangle(Pens.Black, x + 2, y + 0, 9, 9)
G.FillRectangle(Brushes.WhiteSmoke, x + 1, y + 3, 2, 6)
G.FillRectangle(Brushes.WhiteSmoke, x + 1, y + 9, 8, 2)
G.DrawRectangle(Pens.Black, x, y + 2, 9, 9)
G.DrawRectangle(Pens.Black, x + 3, y + 5, 3, 3)
End Sub
Private ClosePath As GraphicsPath
Private Sub DrawClose(ByVal x As Integer, ByVal y As Integer)
If ClosePath Is Nothing Then
ClosePath = New GraphicsPath
ClosePath.AddLine(x + 1, y, x + 3, y)
ClosePath.AddLine(x + 5, y + 2, x + 7, y)
ClosePath.AddLine(x + 9, y, x + 10, y + 1)
ClosePath.AddLine(x + 7, y + 4, x + 7, y + 5)
ClosePath.AddLine(x + 10, y + 8, x + 9, y + 9)
ClosePath.AddLine(x + 7, y + 9, x + 5, y + 7)
ClosePath.AddLine(x + 3, y + 9, x + 1, y + 9)
ClosePath.AddLine(x + 0, y + 8, x + 3, y + 5)
ClosePath.AddLine(x + 3, y + 4, x + 0, y + 1)
End If
G.FillPath(Brushes.WhiteSmoke, ClosePath)
G.DrawPath(Pens.Black, ClosePath)
End Sub
Protected Overrides Sub OnMouseClick(ByVal e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim F As Form = FindForm()
Select Case _ControlButton
Case Button.Minimize
F.WindowState = FormWindowState.Minimized
Case Button.MaximizeRestore
If F.WindowState = FormWindowState.Normal Then
F.WindowState = FormWindowState.Maximized
Else
F.WindowState = FormWindowState.Normal
End If
Case Button.Close
F.Close()
End Select
End If
Invalidate()
MyBase.OnMouseClick(e)
End Sub
End Class
Class NSGroupBox
Inherits ContainerControl
Private _DrawSeperator As Boolean
Public Property DrawSeperator() As Boolean
Get
Return _DrawSeperator
End Get
Set(ByVal value As Boolean)
_DrawSeperator = value
Invalidate()
End Set
End Property
Private _Title As String = "GroupBox"
Public Property Title() As String
Get
Return _Title
End Get
Set(ByVal value As String)
_Title = value
Invalidate()
End Set
End Property
Private _SubTitle As String = "Details"
Public Property SubTitle() As String
Get
Return _SubTitle
End Get
Set(ByVal value As String)
_SubTitle = value
Invalidate()
End Set
End Property
Private _TitleFont As Font
Private _SubTitleFont As Font
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
_TitleFont = New Font("Verdana", 10.0F)
_SubTitleFont = New Font("Verdana", 6.5F)
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(55, 55, 55))
B1 = New SolidBrush(Color.FromArgb(51, 181, 229))
End Sub
Private GP1, GP2 As GraphicsPath
Private PT1 As PointF
Private SZ1, SZ2 As SizeF
Private P1, P2 As Pen
Private B1 As SolidBrush
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7)
GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7)
G.DrawPath(P1, GP1)
G.DrawPath(P2, GP2)
SZ1 = G.MeasureString(_Title, _TitleFont, Width, StringFormat.GenericTypographic)
SZ2 = G.MeasureString(_SubTitle, _SubTitleFont, Width, StringFormat.GenericTypographic)
G.DrawString(_Title, _TitleFont, Brushes.Black, 6, 6)
G.DrawString(_Title, _TitleFont, B1, 5, 5)
PT1 = New PointF(6.0F, SZ1.Height + 4.0F)
G.DrawString(_SubTitle, _SubTitleFont, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(_SubTitle, _SubTitleFont, Brushes.WhiteSmoke, PT1.X, PT1.Y)
If _DrawSeperator Then
Dim Y As Integer = CInt(PT1.Y + SZ2.Height) + 8
G.DrawLine(P1, 4, Y, Width - 5, Y)
G.DrawLine(P2, 4, Y + 1, Width - 5, Y + 1)
End If
End Sub
End Class
Class NSSeperator
Inherits Control
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Height = 10
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(55, 55, 55))
End Sub
Private P1, P2 As Pen
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
G = e.Graphics
G.Clear(BackColor)
G.DrawLine(P1, 0, 5, Width, 5)
G.DrawLine(P2, 0, 6, Width, 6)
End Sub
End Class
<DefaultEvent("Scroll")> _
Class NSTrackBar
Inherits Control
Event Scroll(ByVal sender As Object)
Private _Minimum As Integer
Property Minimum() As Integer
Get
Return _Minimum
End Get
Set(ByVal value As Integer)
If value < 0 Then
Throw New Exception("Property value is not valid.")
End If
_Minimum = value
If value > _Value Then _Value = value
If value > _Maximum Then _Maximum = value
Invalidate()
End Set
End Property
Private _Maximum As Integer = 10
Property Maximum() As Integer
Get
Return _Maximum
End Get
Set(ByVal value As Integer)
If value < 0 Then
Throw New Exception("Property value is not valid.")
End If
_Maximum = value
If value < _Value Then _Value = value
If value < _Minimum Then _Minimum = value
Invalidate()
End Set
End Property
Private _Value As Integer
Property Value() As Integer
Get
Return _Value
End Get
Set(ByVal value As Integer)
If value = _Value Then Return
If value > _Maximum OrElse value < _Minimum Then
Throw New Exception("Property value is not valid.")
End If
_Value = value
Invalidate()
RaiseEvent Scroll(Me)
End Set
End Property
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Height = 17
P1 = New Pen(Color.FromArgb(0, 153, 204), 2)
P2 = New Pen(Color.FromArgb(55, 55, 55))
P3 = New Pen(Color.FromArgb(24, 24, 24))
P4 = New Pen(Color.FromArgb(65, 65, 65))
End Sub
Private GP1, GP2, GP3, GP4 As GraphicsPath
Private R1, R2, R3 As Rectangle
Private I1 As Integer
Private P1, P2, P3, P4 As Pen
Private GB1, GB2, GB3 As LinearGradientBrush
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 5, Width - 1, 10, 5)
GP2 = CreateRound(1, 6, Width - 3, 8, 5)
R1 = New Rectangle(0, 7, Width - 1, 5)
GB1 = New LinearGradientBrush(R1, Color.FromArgb(45, 45, 45), Color.FromArgb(50, 50, 50), 90.0F)
I1 = CInt((_Value - _Minimum) / (_Maximum - _Minimum) * (Width - 11))
R2 = New Rectangle(I1, 0, 10, 20)
G.SetClip(GP2)
G.FillRectangle(GB1, R1)
R3 = New Rectangle(1, 7, R2.X + R2.Width - 2, 8)
GB2 = New LinearGradientBrush(R3, Color.FromArgb(51, 181, 229), Color.FromArgb(0, 153, 204), 90.0F)
G.SmoothingMode = SmoothingMode.None
G.FillRectangle(GB2, R3)
G.SmoothingMode = SmoothingMode.AntiAlias
For I As Integer = 0 To R3.Width - 15 Step 5
G.DrawLine(P1, I, 0, I + 15, Height)
Next
G.ResetClip()
G.DrawPath(P2, GP1)
G.DrawPath(P3, GP2)
GP3 = CreateRound(R2, 5)
GP4 = CreateRound(R2.X + 1, R2.Y + 1, R2.Width - 2, R2.Height - 2, 5)
GB3 = New LinearGradientBrush(ClientRectangle, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F)
G.FillPath(GB3, GP3)
G.DrawPath(P3, GP3)
G.DrawPath(P4, GP4)
End Sub
Private TrackDown As Boolean
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
I1 = CInt((_Value - _Minimum) / (_Maximum - _Minimum) * (Width - 11))
R2 = New Rectangle(I1, 0, 10, 20)
TrackDown = R2.Contains(e.Location)
End If
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
If TrackDown AndAlso e.X > -1 AndAlso e.X < (Width + 1) Then
Value = _Minimum + CInt((_Maximum - _Minimum) * (e.X / Width))
End If
MyBase.OnMouseMove(e)
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
TrackDown = False
MyBase.OnMouseUp(e)
End Sub
End Class
<DefaultEvent("ValueChanged")> _
Class NSRandomPool
Inherits Control
Event ValueChanged(ByVal sender As Object)
Private _Value As New StringBuilder
ReadOnly Property Value() As String
Get
Return _Value.ToString()
End Get
End Property
Private _FullValue As String
ReadOnly Property FullValue() As String
Get
Return BitConverter.ToString(Table).Replace("-", "")
End Get
End Property
Private RNG As New Random()
Private ItemSize As Integer = 9
Private DrawSize As Integer = 8
Private WA As Rectangle
Private RowSize As Integer
Private ColumnSize As Integer
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
P1 = New Pen(Color.FromArgb(55, 55, 55))
P2 = New Pen(Color.FromArgb(24, 24, 24))
B1 = New SolidBrush(Color.FromArgb(30, 30, 30))
End Sub
Protected Overrides Sub OnHandleCreated(e As EventArgs)
UpdateTable()
MyBase.OnHandleCreated(e)
End Sub
Private Table As Byte()
Private Sub UpdateTable()
WA = New Rectangle(5, 5, Width - 10, Height - 10)
RowSize = WA.Width \ ItemSize
ColumnSize = WA.Height \ ItemSize
WA.Width = RowSize * ItemSize
WA.Height = ColumnSize * ItemSize
WA.X = (Width \ 2) - (WA.Width \ 2)
WA.Y = (Height \ 2) - (WA.Height \ 2)
Table = New Byte((RowSize * ColumnSize) - 1) {}
For I As Integer = 0 To Table.Length - 1
Table(I) = CByte(RNG.Next(100))
Next
Invalidate()
End Sub
Protected Overrides Sub OnSizeChanged(e As EventArgs)
UpdateTable()
End Sub
Private Index1 As Integer = -1
Private Index2 As Integer
Private InvertColors As Boolean
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
HandleDraw(e)
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
HandleDraw(e)
MyBase.OnMouseDown(e)
End Sub
Private Sub HandleDraw(e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left OrElse e.Button = Windows.Forms.MouseButtons.Right Then
If Not WA.Contains(e.Location) Then Return
InvertColors = (e.Button = Windows.Forms.MouseButtons.Right)
Index1 = GetIndex(e.X, e.Y)
If Index1 = Index2 Then Return
Dim L As Boolean = Not (Index1 Mod RowSize = 0)
Dim R As Boolean = Not (Index1 Mod RowSize = (RowSize - 1))
Randomize(Index1 - RowSize)
If L Then Randomize(Index1 - 1)
Randomize(Index1)
If R Then Randomize(Index1 + 1)
Randomize(Index1 + RowSize)
_Value.Append(Table(Index1).ToString("X"))
If _Value.Length > 32 Then _Value.Remove(0, 2)
RaiseEvent ValueChanged(Me)
Index2 = Index1
Invalidate()
End If
End Sub
Private GP1, GP2 As GraphicsPath
Private P1, P2 As Pen
Private B1, B2 As SolidBrush
Private PB1 As PathGradientBrush
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
G = e.Graphics
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
GP1 = CreateRound(0, 0, Width - 1, Height - 1, 7)
GP2 = CreateRound(1, 1, Width - 3, Height - 3, 7)
PB1 = New PathGradientBrush(GP1)
PB1.CenterColor = Color.FromArgb(50, 50, 50)
PB1.SurroundColors = {Color.FromArgb(45, 45, 45)}
PB1.FocusScales = New PointF(0.9F, 0.5F)
G.FillPath(PB1, GP1)
G.DrawPath(P1, GP1)
G.DrawPath(P2, GP2)
G.SmoothingMode = SmoothingMode.None
For I As Integer = 0 To Table.Length - 1
Dim C As Integer = Math.Max(Table(I), 75)
Dim X As Integer = ((I Mod RowSize) * ItemSize) + WA.X
Dim Y As Integer = ((I \ RowSize) * ItemSize) + WA.Y
B2 = New SolidBrush(Color.FromArgb(C, C, C))
G.FillRectangle(B1, X + 1, Y + 1, DrawSize, DrawSize)
G.FillRectangle(B2, X, Y, DrawSize, DrawSize)
B2.Dispose()
Next
End Sub
Private Function GetIndex(ByVal x As Integer, ByVal y As Integer) As Integer
Return (((y - WA.Y) \ ItemSize) * RowSize) + ((x - WA.X) \ ItemSize)
End Function
Private Sub Randomize(ByVal index As Integer)
If index > -1 AndAlso index < Table.Length Then
If InvertColors Then
Table(index) = CByte(RNG.Next(100))
Else
Table(index) = CByte(RNG.Next(100, 256))
End If
End If
End Sub
End Class
Class NSKeyboard
Inherits Control
Private TextBitmap As Bitmap
Private TextGraphics As Graphics
Const LowerKeys As String = "1234567890-=qwertyuiop[]asdfghjkl\;'zxcvbnm,./`"
Const UpperKeys As String = "!@#$%^&*()_+QWERTYUIOP{}ASDFGHJKL|:""ZXCVBNM<>?~"
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Font = New Font("Verdana", 8.25F)
TextBitmap = New Bitmap(1, 1)
TextGraphics = Graphics.FromImage(TextBitmap)
MinimumSize = New Size(386, 162)
MaximumSize = New Size(386, 162)
Lower = LowerKeys.ToCharArray()
Upper = UpperKeys.ToCharArray()
PrepareCache()
P1 = New Pen(Color.FromArgb(45, 45, 45))
P2 = New Pen(Color.FromArgb(65, 65, 65))
P3 = New Pen(Color.FromArgb(24, 24, 24))
B1 = New SolidBrush(Color.FromArgb(100, 100, 100))
End Sub
Private _Target As Control
Public Property Target() As Control
Get
Return _Target
End Get
Set(ByVal value As Control)
_Target = value
End Set
End Property
Private Shift As Boolean
Private Pressed As Integer = -1
Private Buttons As Rectangle()
Private Lower As Char()
Private Upper As Char()
Private Other As String() = {"Shift", "Space", "Back"}
Private UpperCache As PointF()
Private LowerCache As PointF()
Private Sub PrepareCache()
Buttons = New Rectangle(50) {}
UpperCache = New PointF(Upper.Length - 1) {}
LowerCache = New PointF(Lower.Length - 1) {}
Dim I As Integer
Dim S As SizeF
Dim R As Rectangle
For Y As Integer = 0 To 3
For X As Integer = 0 To 11
I = (Y * 12) + X
R = New Rectangle(X * 32, Y * 32, 32, 32)
Buttons(I) = R
If Not I = 47 AndAlso Not Char.IsLetter(Upper(I)) Then
S = TextGraphics.MeasureString(Upper(I), Font)
UpperCache(I) = New PointF(R.X + (R.Width \ 2 - S.Width / 2), R.Y + R.Height - S.Height - 2)
S = TextGraphics.MeasureString(Lower(I), Font)
LowerCache(I) = New PointF(R.X + (R.Width \ 2 - S.Width / 2), R.Y + R.Height - S.Height - 2)
End If
Next
Next
Buttons(48) = New Rectangle(0, 4 * 32, 2 * 32, 32)
Buttons(49) = New Rectangle(Buttons(48).Right, 4 * 32, 8 * 32, 32)
Buttons(50) = New Rectangle(Buttons(49).Right, 4 * 32, 2 * 32, 32)
End Sub
Private GP1 As GraphicsPath
Private SZ1 As SizeF
Private PT1 As PointF
Private P1, P2, P3 As Pen
Private B1 As SolidBrush
Private PB1 As PathGradientBrush
Private GB1 As LinearGradientBrush
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
Dim R As Rectangle
Dim Offset As Integer
G.DrawRectangle(P1, 0, 0, (12 * 32) + 1, (5 * 32) + 1)
For I As Integer = 0 To Buttons.Length - 1
R = Buttons(I)
Offset = 0
If I = Pressed Then
Offset = 1
GP1 = New GraphicsPath()
GP1.AddRectangle(R)
PB1 = New PathGradientBrush(GP1)
PB1.CenterColor = Color.FromArgb(60, 60, 60)
PB1.SurroundColors = {Color.FromArgb(55, 55, 55)}
PB1.FocusScales = New PointF(0.8F, 0.5F)
G.FillPath(PB1, GP1)
Else
GB1 = New LinearGradientBrush(R, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F)
G.FillRectangle(GB1, R)
End If
Select Case I
Case 48, 49, 50
SZ1 = G.MeasureString(Other(I - 48), Font)
G.DrawString(Other(I - 48), Font, Brushes.Black, R.X + (R.Width \ 2 - SZ1.Width / 2) + Offset + 1, R.Y + (R.Height \ 2 - SZ1.Height / 2) + Offset + 1)
G.DrawString(Other(I - 48), Font, Brushes.WhiteSmoke, R.X + (R.Width \ 2 - SZ1.Width / 2) + Offset, R.Y + (R.Height \ 2 - SZ1.Height / 2) + Offset)
Case 47
DrawArrow(Color.Black, R.X + Offset + 1, R.Y + Offset + 1)
DrawArrow(Color.FromArgb(235, 235, 235), R.X + Offset, R.Y + Offset)
Case Else
If Shift Then
G.DrawString(Upper(I), Font, Brushes.Black, R.X + 3 + Offset + 1, R.Y + 2 + Offset + 1)
G.DrawString(Upper(I), Font, Brushes.WhiteSmoke, R.X + 3 + Offset, R.Y + 2 + Offset)
If Not Char.IsLetter(Lower(I)) Then
PT1 = LowerCache(I)
G.DrawString(Lower(I), Font, B1, PT1.X + Offset, PT1.Y + Offset)
End If
Else
G.DrawString(Lower(I), Font, Brushes.Black, R.X + 3 + Offset + 1, R.Y + 2 + Offset + 1)
G.DrawString(Lower(I), Font, Brushes.WhiteSmoke, R.X + 3 + Offset, R.Y + 2 + Offset)
If Not Char.IsLetter(Upper(I)) Then
PT1 = UpperCache(I)
G.DrawString(Upper(I), Font, B1, PT1.X + Offset, PT1.Y + Offset)
End If
End If
End Select
G.DrawRectangle(P2, R.X + 1 + Offset, R.Y + 1 + Offset, R.Width - 2, R.Height - 2)
G.DrawRectangle(P3, R.X + Offset, R.Y + Offset, R.Width, R.Height)
If I = Pressed Then
G.DrawLine(P1, R.X, R.Y, R.Right, R.Y)
G.DrawLine(P1, R.X, R.Y, R.X, R.Bottom)
End If
Next
End Sub
Private Sub DrawArrow(color As Color, rx As Integer, ry As Integer)
Dim R As New Rectangle(rx + 8, ry + 8, 16, 16)
G.SmoothingMode = SmoothingMode.AntiAlias
Dim P As New Pen(color, 1)
Dim C As New AdjustableArrowCap(3, 2)
P.CustomEndCap = C
G.DrawArc(P, R, 0.0F, 290.0F)
P.Dispose()
C.Dispose()
G.SmoothingMode = SmoothingMode.None
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
Dim Index As Integer = ((e.Y \ 32) * 12) + (e.X \ 32)
If Index > 47 Then
For I As Integer = 48 To Buttons.Length - 1
If Buttons(I).Contains(e.X, e.Y) Then
Pressed = I
Exit For
End If
Next
Else
Pressed = Index
End If
HandleKey()
Invalidate()
End Sub
Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
Pressed = -1
Invalidate()
End Sub
Private Sub HandleKey()
If _Target Is Nothing Then Return
If Pressed = -1 Then Return
Select Case Pressed
Case 47
_Target.Text = String.Empty
Case 48
Shift = Not Shift
Case 49
_Target.Text &= " "
Case 50
If Not _Target.Text.Length = 0 Then
_Target.Text = _Target.Text.Remove(_Target.Text.Length - 1)
End If
Case Else
If Shift Then
_Target.Text &= Upper(Pressed)
Else
_Target.Text &= Lower(Pressed)
End If
End Select
End Sub
End Class
<DefaultEvent("SelectedIndexChanged")> _
Class NSPaginator
Inherits Control
Public Event SelectedIndexChanged(sender As Object, e As EventArgs)
Private TextBitmap As Bitmap
Private TextGraphics As Graphics
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Size = New Size(202, 26)
TextBitmap = New Bitmap(1, 1)
TextGraphics = Graphics.FromImage(TextBitmap)
InvalidateItems()
B1 = New SolidBrush(Color.FromArgb(50, 50, 50))
B2 = New SolidBrush(Color.FromArgb(55, 55, 55))
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(55, 55, 55))
P3 = New Pen(Color.FromArgb(65, 65, 65))
End Sub
Private _SelectedIndex As Integer
Public Property SelectedIndex() As Integer
Get
Return _SelectedIndex
End Get
Set(ByVal value As Integer)
_SelectedIndex = Math.Max(Math.Min(value, MaximumIndex), 0)
Invalidate()
End Set
End Property
Private _NumberOfPages As Integer
Public Property NumberOfPages() As Integer
Get
Return _NumberOfPages
End Get
Set(ByVal value As Integer)
_NumberOfPages = value
_SelectedIndex = Math.Max(Math.Min(_SelectedIndex, MaximumIndex), 0)
Invalidate()
End Set
End Property
Public ReadOnly Property MaximumIndex As Integer
Get
Return NumberOfPages - 1
End Get
End Property
Private ItemWidth As Integer
Public Overrides Property Font As Font
Get
Return MyBase.Font
End Get
Set(value As Font)
MyBase.Font = value
InvalidateItems()
Invalidate()
End Set
End Property
Private Sub InvalidateItems()
Dim S As Size = TextGraphics.MeasureString("000 ..", Font).ToSize()
ItemWidth = S.Width + 10
End Sub
Private GP1, GP2 As GraphicsPath
Private R1 As Rectangle
Private SZ1 As Size
Private PT1 As Point
Private P1, P2, P3 As Pen
Private B1, B2 As SolidBrush
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
G.SmoothingMode = SmoothingMode.AntiAlias
Dim LeftEllipse, RightEllipse As Boolean
If _SelectedIndex < 4 Then
For I As Integer = 0 To Math.Min(MaximumIndex, 4)
RightEllipse = (I = 4) AndAlso (MaximumIndex > 4)
DrawBox(I * ItemWidth, I, False, RightEllipse)
Next
ElseIf _SelectedIndex > 3 AndAlso _SelectedIndex < (MaximumIndex - 3) Then
For I As Integer = 0 To 4
LeftEllipse = (I = 0)
RightEllipse = (I = 4)
DrawBox(I * ItemWidth, _SelectedIndex + I - 2, LeftEllipse, RightEllipse)
Next
Else
For I As Integer = 0 To 4
LeftEllipse = (I = 0) AndAlso (MaximumIndex > 4)
DrawBox(I * ItemWidth, MaximumIndex - (4 - I), LeftEllipse, False)
Next
End If
End Sub
Private Sub DrawBox(x As Integer, index As Integer, leftEllipse As Boolean, rightEllipse As Boolean)
R1 = New Rectangle(x, 0, ItemWidth - 4, Height - 1)
GP1 = CreateRound(R1, 7)
GP2 = CreateRound(R1.X + 1, R1.Y + 1, R1.Width - 2, R1.Height - 2, 7)
Dim T As String = CStr(index + 1)
If leftEllipse Then T = ".. " & T
If rightEllipse Then T = T & " .."
SZ1 = G.MeasureString(T, Font).ToSize()
PT1 = New Point(R1.X + (R1.Width \ 2 - SZ1.Width \ 2), R1.Y + (R1.Height \ 2 - SZ1.Height \ 2))
If index = _SelectedIndex Then
G.FillPath(B1, GP1)
Dim F As New Font(Font, FontStyle.Underline)
G.DrawString(T, F, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(T, F, Brushes.WhiteSmoke, PT1)
F.Dispose()
G.DrawPath(P1, GP2)
G.DrawPath(P2, GP1)
Else
G.FillPath(B2, GP1)
G.DrawString(T, Font, Brushes.Black, PT1.X + 1, PT1.Y + 1)
G.DrawString(T, Font, Brushes.WhiteSmoke, PT1)
G.DrawPath(P3, GP2)
G.DrawPath(P1, GP1)
End If
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim NewIndex As Integer
Dim OldIndex As Integer = _SelectedIndex
If _SelectedIndex < 4 Then
NewIndex = (e.X \ ItemWidth)
ElseIf _SelectedIndex > 3 AndAlso _SelectedIndex < (MaximumIndex - 3) Then
NewIndex = (e.X \ ItemWidth)
Select Case NewIndex
Case 2
NewIndex = OldIndex
Case Is < 2
NewIndex = OldIndex - (2 - NewIndex)
Case Is > 2
NewIndex = OldIndex + (NewIndex - 2)
End Select
Else
NewIndex = MaximumIndex - (4 - (e.X \ ItemWidth))
End If
If (NewIndex < _NumberOfPages) AndAlso (Not NewIndex = OldIndex) Then
SelectedIndex = NewIndex
RaiseEvent SelectedIndexChanged(Me, Nothing)
End If
End If
MyBase.OnMouseDown(e)
End Sub
End Class
<DefaultEvent("Scroll")> _
Class NSVScrollBar
Inherits Control
Event Scroll(ByVal sender As Object)
Private _Minimum As Integer
Property Minimum() As Integer
Get
Return _Minimum
End Get
Set(ByVal value As Integer)
If value < 0 Then
Throw New Exception("Property value is not valid.")
End If
_Minimum = value
If value > _Value Then _Value = value
If value > _Maximum Then _Maximum = value
InvalidateLayout()
End Set
End Property
Private _Maximum As Integer = 100
Property Maximum() As Integer
Get
Return _Maximum
End Get
Set(ByVal value As Integer)
If value < 1 Then value = 1
_Maximum = value
If value < _Value Then _Value = value
If value < _Minimum Then _Minimum = value
InvalidateLayout()
End Set
End Property
Private _Value As Integer
Property Value() As Integer
Get
If Not ShowThumb Then Return _Minimum
Return _Value
End Get
Set(ByVal value As Integer)
If value = _Value Then Return
If value > _Maximum OrElse value < _Minimum Then
Throw New Exception("Property value is not valid.")
End If
_Value = value
InvalidatePosition()
RaiseEvent Scroll(Me)
End Set
End Property
Property _Percent As Double
Public ReadOnly Property Percent As Double
Get
If Not ShowThumb Then Return 0
Return GetProgress()
End Get
End Property
Private _SmallChange As Integer = 1
Public Property SmallChange() As Integer
Get
Return _SmallChange
End Get
Set(ByVal value As Integer)
If value < 1 Then
Throw New Exception("Property value is not valid.")
End If
_SmallChange = value
End Set
End Property
Private _LargeChange As Integer = 10
Public Property LargeChange() As Integer
Get
Return _LargeChange
End Get
Set(ByVal value As Integer)
If value < 1 Then
Throw New Exception("Property value is not valid.")
End If
_LargeChange = value
End Set
End Property
Private ButtonSize As Integer = 16
Private ThumbSize As Integer = 24 ' 14 minimum
Private TSA As Rectangle
Private BSA As Rectangle
Private Shaft As Rectangle
Private Thumb As Rectangle
Private ShowThumb As Boolean
Private ThumbDown As Boolean
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Width = 18
B1 = New SolidBrush(Color.FromArgb(55, 55, 55))
B2 = New SolidBrush(Color.FromArgb(24, 24, 24))
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(65, 65, 65))
P3 = New Pen(Color.FromArgb(55, 55, 55))
P4 = New Pen(Color.FromArgb(40, 40, 40))
End Sub
Private GP1, GP2, GP3, GP4 As GraphicsPath
Private P1, P2, P3, P4 As Pen
Private B1, B2 As SolidBrush
Dim I1 As Integer
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.Clear(BackColor)
GP1 = DrawArrow(4, 6, False)
GP2 = DrawArrow(5, 7, False)
G.FillPath(B1, GP2)
G.FillPath(B2, GP1)
GP3 = DrawArrow(4, Height - 11, True)
GP4 = DrawArrow(5, Height - 10, True)
G.FillPath(B1, GP4)
G.FillPath(B2, GP3)
If ShowThumb Then
G.FillRectangle(B1, Thumb)
G.DrawRectangle(P1, Thumb)
G.DrawRectangle(P2, Thumb.X + 1, Thumb.Y + 1, Thumb.Width - 2, Thumb.Height - 2)
Dim Y As Integer
Dim LY As Integer = Thumb.Y + (Thumb.Height \ 2) - 3
For I As Integer = 0 To 2
Y = LY + (I * 3)
G.DrawLine(P1, Thumb.X + 5, Y, Thumb.Right - 5, Y)
G.DrawLine(P2, Thumb.X + 5, Y + 1, Thumb.Right - 5, Y + 1)
Next
End If
G.DrawRectangle(P3, 0, 0, Width - 1, Height - 1)
G.DrawRectangle(P4, 1, 1, Width - 3, Height - 3)
End Sub
Private Function DrawArrow(x As Integer, y As Integer, flip As Boolean) As GraphicsPath
Dim GP As New GraphicsPath()
Dim W As Integer = 9
Dim H As Integer = 5
If flip Then
GP.AddLine(x + 1, y, x + W + 1, y)
GP.AddLine(x + W, y, x + H, y + H - 1)
Else
GP.AddLine(x, y + H, x + W, y + H)
GP.AddLine(x + W, y + H, x + H, y)
End If
GP.CloseFigure()
Return GP
End Function
Protected Overrides Sub OnSizeChanged(e As EventArgs)
InvalidateLayout()
End Sub
Private Sub InvalidateLayout()
TSA = New Rectangle(0, 0, Width, ButtonSize)
BSA = New Rectangle(0, Height - ButtonSize, Width, ButtonSize)
Shaft = New Rectangle(0, TSA.Bottom + 1, Width, Height - (ButtonSize * 2) - 1)
ShowThumb = ((_Maximum - _Minimum) > Shaft.Height)
If ShowThumb Then
'ThumbSize = Math.Max(0, 14) 'TODO: Implement this.
Thumb = New Rectangle(1, 0, Width - 3, ThumbSize)
End If
RaiseEvent Scroll(Me)
InvalidatePosition()
End Sub
Private Sub InvalidatePosition()
Thumb.Y = CInt(GetProgress() * (Shaft.Height - ThumbSize)) + TSA.Height
Invalidate()
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left AndAlso ShowThumb Then
If TSA.Contains(e.Location) Then
I1 = _Value - _SmallChange
ElseIf BSA.Contains(e.Location) Then
I1 = _Value + _SmallChange
Else
If Thumb.Contains(e.Location) Then
ThumbDown = True
MyBase.OnMouseDown(e)
Return
Else
If e.Y < Thumb.Y Then
I1 = _Value - _LargeChange
Else
I1 = _Value + _LargeChange
End If
End If
End If
Value = Math.Min(Math.Max(I1, _Minimum), _Maximum)
InvalidatePosition()
End If
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
If ThumbDown AndAlso ShowThumb Then
Dim ThumbPosition As Integer = e.Y - TSA.Height - (ThumbSize \ 2)
Dim ThumbBounds As Integer = Shaft.Height - ThumbSize
I1 = CInt((ThumbPosition / ThumbBounds) * (_Maximum - _Minimum)) + _Minimum
Value = Math.Min(Math.Max(I1, _Minimum), _Maximum)
InvalidatePosition()
End If
MyBase.OnMouseMove(e)
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
ThumbDown = False
MyBase.OnMouseUp(e)
End Sub
Private Function GetProgress() As Double
Return (_Value - _Minimum) / (_Maximum - _Minimum)
End Function
End Class
<DefaultEvent("Scroll")> _
Class NSHScrollBar
Inherits Control
Event Scroll(ByVal sender As Object)
Private _Minimum As Integer
Property Minimum() As Integer
Get
Return _Minimum
End Get
Set(ByVal value As Integer)
If value < 0 Then
Throw New Exception("Property value is not valid.")
End If
_Minimum = value
If value > _Value Then _Value = value
If value > _Maximum Then _Maximum = value
InvalidateLayout()
End Set
End Property
Private _Maximum As Integer = 100
Property Maximum() As Integer
Get
Return _Maximum
End Get
Set(ByVal value As Integer)
If value < 0 Then
Throw New Exception("Property value is not valid.")
End If
_Maximum = value
If value < _Value Then _Value = value
If value < _Minimum Then _Minimum = value
InvalidateLayout()
End Set
End Property
Private _Value As Integer
Property Value() As Integer
Get
If Not ShowThumb Then Return _Minimum
Return _Value
End Get
Set(ByVal value As Integer)
If value = _Value Then Return
If value > _Maximum OrElse value < _Minimum Then
Throw New Exception("Property value is not valid.")
End If
_Value = value
InvalidatePosition()
RaiseEvent Scroll(Me)
End Set
End Property
Private _SmallChange As Integer = 1
Public Property SmallChange() As Integer
Get
Return _SmallChange
End Get
Set(ByVal value As Integer)
If value < 1 Then
Throw New Exception("Property value is not valid.")
End If
_SmallChange = value
End Set
End Property
Private _LargeChange As Integer = 10
Public Property LargeChange() As Integer
Get
Return _LargeChange
End Get
Set(ByVal value As Integer)
If value < 1 Then
Throw New Exception("Property value is not valid.")
End If
_LargeChange = value
End Set
End Property
Private ButtonSize As Integer = 16
Private ThumbSize As Integer = 24 ' 14 minimum
Private LSA As Rectangle
Private RSA As Rectangle
Private Shaft As Rectangle
Private Thumb As Rectangle
Private ShowThumb As Boolean
Private ThumbDown As Boolean
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, False)
Height = 18
B1 = New SolidBrush(Color.FromArgb(55, 55, 55))
B2 = New SolidBrush(Color.FromArgb(24, 24, 24))
P1 = New Pen(Color.FromArgb(24, 24, 24))
P2 = New Pen(Color.FromArgb(65, 65, 65))
P3 = New Pen(Color.FromArgb(55, 55, 55))
P4 = New Pen(Color.FromArgb(40, 40, 40))
End Sub
Private GP1, GP2, GP3, GP4 As GraphicsPath
Private P1, P2, P3, P4 As Pen
Private B1, B2 As SolidBrush
Dim I1 As Integer
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
G = e.Graphics
G.Clear(BackColor)
GP1 = DrawArrow(6, 4, False)
GP2 = DrawArrow(7, 5, False)
G.FillPath(B1, GP2)
G.FillPath(B2, GP1)
GP3 = DrawArrow(Width - 11, 4, True)
GP4 = DrawArrow(Width - 10, 5, True)
G.FillPath(B1, GP4)
G.FillPath(B2, GP3)
If ShowThumb Then
G.FillRectangle(B1, Thumb)
G.DrawRectangle(P1, Thumb)
G.DrawRectangle(P2, Thumb.X + 1, Thumb.Y + 1, Thumb.Width - 2, Thumb.Height - 2)
Dim X As Integer
Dim LX As Integer = Thumb.X + (Thumb.Width \ 2) - 3
For I As Integer = 0 To 2
X = LX + (I * 3)
G.DrawLine(P1, X, Thumb.Y + 5, X, Thumb.Bottom - 5)
G.DrawLine(P2, X + 1, Thumb.Y + 5, X + 1, Thumb.Bottom - 5)
Next
End If
G.DrawRectangle(P3, 0, 0, Width - 1, Height - 1)
G.DrawRectangle(P4, 1, 1, Width - 3, Height - 3)
End Sub
Private Function DrawArrow(x As Integer, y As Integer, flip As Boolean) As GraphicsPath
Dim GP As New GraphicsPath()
Dim W As Integer = 5
Dim H As Integer = 9
If flip Then
GP.AddLine(x, y + 1, x, y + H + 1)
GP.AddLine(x, y + H, x + W - 1, y + W)
Else
GP.AddLine(x + W, y, x + W, y + H)
GP.AddLine(x + W, y + H, x + 1, y + W)
End If
GP.CloseFigure()
Return GP
End Function
Protected Overrides Sub OnSizeChanged(e As EventArgs)
InvalidateLayout()
End Sub
Private Sub InvalidateLayout()
LSA = New Rectangle(0, 0, ButtonSize, Height)
RSA = New Rectangle(Width - ButtonSize, 0, ButtonSize, Height)
Shaft = New Rectangle(LSA.Right + 1, 0, Width - (ButtonSize * 2) - 1, Height)
ShowThumb = ((_Maximum - _Minimum) > Shaft.Width)
If ShowThumb Then
'ThumbSize = Math.Max(0, 14) 'TODO: Implement this.
Thumb = New Rectangle(0, 1, ThumbSize, Height - 3)
End If
RaiseEvent Scroll(Me)
InvalidatePosition()
End Sub
Private Sub InvalidatePosition()
Thumb.X = CInt(GetProgress() * (Shaft.Width - ThumbSize)) + LSA.Width
Invalidate()
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left AndAlso ShowThumb Then
If LSA.Contains(e.Location) Then
I1 = _Value - _SmallChange
ElseIf RSA.Contains(e.Location) Then
I1 = _Value + _SmallChange
Else
If Thumb.Contains(e.Location) Then
ThumbDown = True
MyBase.OnMouseDown(e)
Return
Else
If e.X < Thumb.X Then
I1 = _Value - _LargeChange
Else
I1 = _Value + _LargeChange
End If
End If
End If
Value = Math.Min(Math.Max(I1, _Minimum), _Maximum)
InvalidatePosition()
End If
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
If ThumbDown AndAlso ShowThumb Then
Dim ThumbPosition As Integer = e.X - LSA.Width - (ThumbSize \ 2)
Dim ThumbBounds As Integer = Shaft.Width - ThumbSize
I1 = CInt((ThumbPosition / ThumbBounds) * (_Maximum - _Minimum)) + _Minimum
Value = Math.Min(Math.Max(I1, _Minimum), _Maximum)
InvalidatePosition()
End If
MyBase.OnMouseMove(e)
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
ThumbDown = False
MyBase.OnMouseUp(e)
End Sub
Private Function GetProgress() As Double
Return (_Value - _Minimum) / (_Maximum - _Minimum)
End Function
End Class
Class NSContextMenu
Inherits ContextMenuStrip
Sub New()
Renderer = New ToolStripProfessionalRenderer(New NSColorTable())
ForeColor = Color.FromArgb(235, 235, 235)
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
MyBase.OnPaint(e)
End Sub
End Class
Class NSColorTable
Inherits ProfessionalColorTable
Private BackColor As Color = Color.FromArgb(55, 55, 55)
Public Overrides ReadOnly Property ButtonSelectedBorder() As Color
Get
Return BackColor
End Get
End Property
Public Overrides ReadOnly Property CheckBackground() As Color
Get
Return BackColor
End Get
End Property
Public Overrides ReadOnly Property CheckPressedBackground() As Color
Get
Return BackColor
End Get
End Property
Public Overrides ReadOnly Property CheckSelectedBackground() As Color
Get
Return BackColor
End Get
End Property
Public Overrides ReadOnly Property ImageMarginGradientBegin() As Color
Get
Return BackColor
End Get
End Property
Public Overrides ReadOnly Property ImageMarginGradientEnd() As Color
Get
Return BackColor
End Get
End Property
Public Overrides ReadOnly Property ImageMarginGradientMiddle() As Color
Get
Return BackColor
End Get
End Property
Public Overrides ReadOnly Property MenuBorder() As Color
Get
Return Color.FromArgb(25, 25, 25)
End Get
End Property
Public Overrides ReadOnly Property MenuItemBorder() As Color
Get
Return BackColor
End Get
End Property
Public Overrides ReadOnly Property MenuItemSelected() As Color
Get
Return Color.FromArgb(65, 65, 65)
End Get
End Property
Public Overrides ReadOnly Property SeparatorDark() As Color
Get
Return Color.FromArgb(24, 24, 24)
End Get
End Property
Public Overrides ReadOnly Property ToolStripDropDownBackground() As Color
Get
Return BackColor
End Get
End Property
End Class
'If you have made it this far it's not too late to turn back, you must not continue on! If you are trying to fullfill some
'sick act of masochism by studying the source of the ListView then, may god have mercy on your soul.
Class NSListView
Inherits Control
Class NSListViewItem
Property Text As String
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Property SubItems As New List(Of NSListViewSubItem)
Protected UniqueId As Guid
Sub New()
UniqueId = Guid.NewGuid()
End Sub
Public Overrides Function ToString() As String
Return Text
End Function
Public Overrides Function Equals(obj As Object) As Boolean
If TypeOf obj Is NSListViewItem Then
Return (DirectCast(obj, NSListViewItem).UniqueId = UniqueId)
End If
Return False
End Function
End Class
Class NSListViewSubItem
Property Text As String
Public Overrides Function ToString() As String
Return Text
End Function
End Class
Class NSListViewColumnHeader
Property Text As String
Property Width As Integer = 60
Public Overrides Function ToString() As String
Return Text
End Function
End Class
Private _Items As New List(Of NSListViewItem)
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Property Items() As NSListViewItem()
Get
Return _Items.ToArray()
End Get
Set(ByVal value As NSListViewItem())
_Items = New List(Of NSListViewItem)(value)
InvalidateScroll()
End Set
End Property
Private _SelectedItems As New List(Of NSListViewItem)
Public ReadOnly Property SelectedItems() As NSListViewItem()
Get
Return _SelectedItems.ToArray()
End Get
End Property
Private _Columns As New List(Of NSListViewColumnHeader)
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Property Columns() As NSListViewColumnHeader()
Get
Return _Columns.ToArray()
End Get
Set(ByVal value As NSListViewColumnHeader())
_Columns = New List(Of NSListViewColumnHeader)(value)
InvalidateColumns()
End Set
End Property
Private _MultiSelect As Boolean = True
Public Property MultiSelect() As Boolean
Get
Return _MultiSelect
End Get
Set(ByVal value As Boolean)
_MultiSelect = value
If _SelectedItems.Count > 1 Then
_SelectedItems.RemoveRange(1, _SelectedItems.Count - 1)
End If
Invalidate()
End Set
End Property
Private ItemHeight As Integer = 24
Public Overrides Property Font As Font
Get
Return MyBase.Font
End Get
Set(value As Font)
ItemHeight = CInt(Graphics.FromHwnd(Handle).MeasureString("@", Font).Height) + 6
If VS IsNot Nothing Then
VS.SmallChange = ItemHeight
VS.LargeChange = ItemHeight
End If
MyBase.Font = value
InvalidateLayout()
End Set
End Property
#Region " Item Helper Methods "
'Ok, you've seen everything of importance at this point; I am begging you to spare yourself. You must not read any further!
Public Sub AddItem(text As String, ParamArray subItems As String())
Dim Items As New List(Of NSListViewSubItem)
For Each I As String In subItems
Dim SubItem As New NSListViewSubItem()
SubItem.Text = I
Items.Add(SubItem)
Next
Dim Item As New NSListViewItem()
Item.Text = text
Item.SubItems = Items
_Items.Add(Item)
InvalidateScroll()
End Sub
Public Sub RemoveItemAt(index As Integer)
_Items.RemoveAt(index)
InvalidateScroll()
End Sub
Public Sub RemoveItem(item As NSListViewItem)
_Items.Remove(item)
InvalidateScroll()
End Sub
Public Sub RemoveItems(items As NSListViewItem())
For Each I As NSListViewItem In items
_Items.Remove(I)
Next
InvalidateScroll()
End Sub
#End Region
Private VS As NSVScrollBar
Sub New()
SetStyle(DirectCast(139286, ControlStyles), True)
SetStyle(ControlStyles.Selectable, True)
P1 = New Pen(Color.FromArgb(55, 55, 55))
P2 = New Pen(Color.FromArgb(24, 24, 24))
P3 = New Pen(Color.FromArgb(65, 65, 65))
B1 = New SolidBrush(Color.FromArgb(62, 62, 62))
B2 = New SolidBrush(Color.FromArgb(65, 65, 65))
B3 = New SolidBrush(Color.FromArgb(47, 47, 47))
B4 = New SolidBrush(Color.FromArgb(50, 50, 50))
VS = New NSVScrollBar
VS.SmallChange = ItemHeight
VS.LargeChange = ItemHeight
AddHandler VS.Scroll, AddressOf HandleScroll
AddHandler VS.MouseDown, AddressOf VS_MouseDown
Controls.Add(VS)
InvalidateLayout()
End Sub
Protected Overrides Sub OnSizeChanged(e As EventArgs)
InvalidateLayout()
MyBase.OnSizeChanged(e)
End Sub
Private Sub HandleScroll(sender As Object)
Invalidate()
End Sub
Private Sub InvalidateScroll()
VS.Maximum = (_Items.Count * ItemHeight)
Invalidate()
End Sub
Private Sub InvalidateLayout()
VS.Location = New Point(Width - VS.Width - 1, 1)
VS.Size = New Size(18, Height - 2)
Invalidate()
End Sub
Private ColumnOffsets As Integer()
Private Sub InvalidateColumns()
Dim Width As Integer = 3
ColumnOffsets = New Integer(_Columns.Count - 1) {}
For I As Integer = 0 To _Columns.Count - 1
ColumnOffsets(I) = Width
Width += Columns(I).Width
Next
Invalidate()
End Sub
Private Sub VS_MouseDown(sender As Object, e As MouseEventArgs)
Focus()
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
Focus()
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim Offset As Integer = CInt(VS.Percent * (VS.Maximum - (Height - (ItemHeight * 2))))
Dim Index As Integer = ((e.Y + Offset - ItemHeight) \ ItemHeight)
If Index > _Items.Count - 1 Then Index = -1
If Not Index = -1 Then
'TODO: Handle Shift key
If ModifierKeys = Keys.Control AndAlso _MultiSelect Then
If _SelectedItems.Contains(_Items(Index)) Then
_SelectedItems.Remove(_Items(Index))
Else
_SelectedItems.Add(_Items(Index))
End If
Else
_SelectedItems.Clear()
_SelectedItems.Add(_Items(Index))
End If
End If
Invalidate()
End If
MyBase.OnMouseDown(e)
End Sub
Private P1, P2, P3 As Pen
Private B1, B2, B3, B4 As SolidBrush
Private GB1 As LinearGradientBrush
'I am so sorry you have to witness this. I tried warning you. ;.;
Protected Overrides Sub OnPaint(e As PaintEventArgs)
G = e.Graphics
G.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
G.Clear(BackColor)
Dim X, Y As Integer
Dim H As Single
G.DrawRectangle(P1, 1, 1, Width - 3, Height - 3)
Dim R1 As Rectangle
Dim CI As NSListViewItem
Dim Offset As Integer = CInt(VS.Percent * (VS.Maximum - (Height - (ItemHeight * 2))))
Dim StartIndex As Integer
If Offset = 0 Then StartIndex = 0 Else StartIndex = (Offset \ ItemHeight)
Dim EndIndex As Integer = Math.Min(StartIndex + (Height \ ItemHeight), _Items.Count - 1)
For I As Integer = StartIndex To EndIndex
CI = Items(I)
R1 = New Rectangle(0, ItemHeight + (I * ItemHeight) + 1 - Offset, Width, ItemHeight - 1)
H = G.MeasureString(CI.Text, Font).Height
Y = R1.Y + CInt((ItemHeight / 2) - (H / 2))
If _SelectedItems.Contains(CI) Then
If I Mod 2 = 0 Then
G.FillRectangle(B1, R1)
Else
G.FillRectangle(B2, R1)
End If
Else
If I Mod 2 = 0 Then
G.FillRectangle(B3, R1)
Else
G.FillRectangle(B4, R1)
End If
End If
G.DrawLine(P2, 0, R1.Bottom, Width, R1.Bottom)
If Columns.Length > 0 Then
R1.Width = Columns(0).Width
G.SetClip(R1)
End If
'TODO: Ellipse text that overhangs seperators.
G.DrawString(CI.Text, Font, Brushes.Black, 10, Y + 1)
G.DrawString(CI.Text, Font, Brushes.WhiteSmoke, 9, Y)
If CI.SubItems IsNot Nothing Then
For I2 As Integer = 0 To Math.Min(CI.SubItems.Count, _Columns.Count) - 1
X = ColumnOffsets(I2 + 1) + 4
R1.X = X
R1.Width = Columns(I2).Width
G.SetClip(R1)
G.DrawString(CI.SubItems(I2).Text, Font, Brushes.Black, X + 1, Y + 1)
G.DrawString(CI.SubItems(I2).Text, Font, Brushes.WhiteSmoke, X, Y)
Next
End If
G.ResetClip()
Next
R1 = New Rectangle(0, 0, Width, ItemHeight)
GB1 = New LinearGradientBrush(R1, Color.FromArgb(60, 60, 60), Color.FromArgb(55, 55, 55), 90.0F)
G.FillRectangle(GB1, R1)
G.DrawRectangle(P3, 1, 1, Width - 22, ItemHeight - 2)
Dim LH As Integer = Math.Min(VS.Maximum + ItemHeight - Offset, Height)
Dim CC As NSListViewColumnHeader
For I As Integer = 0 To _Columns.Count - 1
CC = Columns(I)
H = G.MeasureString(CC.Text, Font).Height
Y = CInt((ItemHeight / 2) - (H / 2))
X = ColumnOffsets(I)
G.DrawString(CC.Text, Font, Brushes.Black, X + 1, Y + 1)
G.DrawString(CC.Text, Font, Brushes.WhiteSmoke, X, Y)
G.DrawLine(P2, X - 3, 0, X - 3, LH)
G.DrawLine(P3, X - 2, 0, X - 2, ItemHeight)
Next
G.DrawRectangle(P2, 0, 0, Width - 1, Height - 1)
G.DrawLine(P2, 0, ItemHeight, Width, ItemHeight)
G.DrawLine(P2, VS.Location.X - 1, 0, VS.Location.X - 1, Height)
End Sub
Protected Overrides Sub OnMouseWheel(e As MouseEventArgs)
Dim Move As Integer = -((e.Delta * SystemInformation.MouseWheelScrollLines \ 120) * (ItemHeight \ 2))
Dim Value As Integer = Math.Max(Math.Min(VS.Value + Move, VS.Maximum), VS.Minimum)
VS.Value = Value
MyBase.OnMouseWheel(e)
End Sub
End Class