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
'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.
'Name: Net Seal Theme
'Created: 4/15/2013
'Version: 1.0.0.0 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(35, 35, 35))
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.White, 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(35, 35, 35))
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.White, 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(35, 35, 35))
P2 = New Pen(Color.FromArgb(55, 55, 55))
B1 = New SolidBrush(Color.FromArgb(200, 160, 0))
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(205, 150, 0), Color.FromArgb(150, 110, 0), 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(205, 150, 0))
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.White, 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.White
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(35, 35, 35))
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(35, 35, 35))
P3 = New Pen(Color.Black, 2.0F)
P4 = New Pen(Color.White, 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.White, 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(35, 35, 35))
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.White, 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.White, 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.White
P1 = New Pen(Color.FromArgb(35, 35, 35))
P2 = New Pen(Color.White, 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.White, 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.White, 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.White, 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(35, 35, 35))
P3 = New Pen(Color.FromArgb(45, 45, 45), 2)
B1 = New SolidBrush(Color.FromArgb(50, 50, 50))
B2 = New SolidBrush(Color.FromArgb(35, 35, 35))
B3 = New SolidBrush(Color.FromArgb(205, 150, 0))
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.White, 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(35, 35, 35))
P3 = New Pen(Color.FromArgb(65, 65, 65))
B1 = New SolidBrush(Color.FromArgb(35, 35, 35))
B2 = New SolidBrush(Color.FromArgb(85, 85, 85))
B3 = New SolidBrush(Color.FromArgb(65, 65, 65))
B4 = New SolidBrush(Color.FromArgb(205, 150, 0))
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
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.White, 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.White, 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.White, 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.White, x + 3, y + 1, 8, 4)
G.FillRectangle(Brushes.White, x + 7, y + 5, 4, 4)
G.DrawRectangle(Pens.Black, x + 2, y + 0, 9, 9)
G.FillRectangle(Brushes.White, x + 1, y + 3, 2, 6)
G.FillRectangle(Brushes.White, 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.White, 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(35, 35, 35))
P2 = New Pen(Color.FromArgb(55, 55, 55))
B1 = New SolidBrush(Color.FromArgb(205, 150, 0))
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.White, 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(35, 35, 35))
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(150, 110, 0), 2)
P2 = New Pen(Color.FromArgb(55, 55, 55))
P3 = New Pen(Color.FromArgb(35, 35, 35))
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(205, 150, 0), Color.FromArgb(150, 110, 0), 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(35, 35, 35))
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(35, 35, 35))
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.White, 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.White, 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.White, 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.White, 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(35, 35, 35))
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.White, 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.White, 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 < 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 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(35, 35, 35))
P1 = New Pen(Color.FromArgb(35, 35, 35))
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
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
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
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
ThumbDown = False
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(35, 35, 35))
P1 = New Pen(Color.FromArgb(35, 35, 35))
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
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
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
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
ThumbDown = False
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.White
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(35, 35, 35)
End Get
End Property
Public Overrides ReadOnly Property ToolStripDropDownBackground() As Color
Get
Return BackColor
End Get
End Property
End Class
Comments