'Creator: Aeonhack 'Date: 5/01/2011 (roughly) 'Site: www.elitevs.net 'Version: 1.4 'Credits to Vorfin for the original concept. Imports System.Drawing.Drawing2D Imports System.ComponentModel MustInherit Class ThemeControl Inherits Control #Region " Initialization " Protected G As Graphics, B As Bitmap Sub New() SetStyle(DirectCast(139270, ControlStyles), True) B = New Bitmap(1, 1) G = Graphics.FromImage(B) End Sub Sub AllowTransparent() SetStyle(ControlStyles.Opaque, False) SetStyle(ControlStyles.SupportsTransparentBackColor, True) End Sub Overrides Property Text As String Get Return MyBase.Text End Get Set(ByVal v As String) MyBase.Text = v Invalidate() End Set End Property #End Region #Region " Mouse Handling " Protected Enum State As Byte MouseNone = 0 MouseOver = 1 MouseDown = 2 End Enum Protected MouseState As State Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs) ChangeMouseState(State.MouseNone) MyBase.OnMouseLeave(e) End Sub Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs) ChangeMouseState(State.MouseOver) MyBase.OnMouseEnter(e) End Sub Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs) ChangeMouseState(State.MouseOver) MyBase.OnMouseUp(e) End Sub Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs) If e.Button = MouseButtons.Left Then ChangeMouseState(State.MouseDown) MyBase.OnMouseDown(e) End Sub Private Sub ChangeMouseState(ByVal e As State) MouseState = e Invalidate() End Sub #End Region #Region " Convienence " MustOverride Sub PaintHook() Protected NotOverridable Overrides Sub OnPaint(ByVal e As PaintEventArgs) If Width = 0 OrElse Height = 0 Then Return PaintHook() e.Graphics.DrawImage(B, 0, 0) End Sub Protected Overrides Sub OnSizeChanged(ByVal e As EventArgs) If Not Width = 0 AndAlso Not Height = 0 Then B = New Bitmap(Width, Height) G = Graphics.FromImage(B) Invalidate() End If MyBase.OnSizeChanged(e) End Sub 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) _Image = value Invalidate() End Set End Property ReadOnly Property ImageWidth() As Integer Get If _Image Is Nothing Then Return 0 Return _Image.Width End Get End Property ReadOnly Property ImageTop() As Integer Get If _Image Is Nothing Then Return 0 Return Height \ 2 - _Image.Height \ 2 End Get End Property Private _Size As Size Private _Rectangle As Rectangle Private _Gradient As LinearGradientBrush Private _Brush As SolidBrush Protected Sub DrawCorners(ByVal c As Color, ByVal rect As Rectangle) If _NoRounding Then Return B.SetPixel(rect.X, rect.Y, c) B.SetPixel(rect.X + (rect.Width - 1), rect.Y, c) B.SetPixel(rect.X, rect.Y + (rect.Height - 1), c) B.SetPixel(rect.X + (rect.Width - 1), rect.Y + (rect.Height - 1), c) End Sub Protected Sub DrawBorders(ByVal p1 As Pen, ByVal p2 As Pen, ByVal rect As Rectangle) G.DrawRectangle(p1, rect.X, rect.Y, rect.Width - 1, rect.Height - 1) G.DrawRectangle(p2, rect.X + 1, rect.Y + 1, rect.Width - 3, rect.Height - 3) End Sub Protected Sub DrawText(ByVal a As HorizontalAlignment, ByVal c As Color, ByVal x As Integer) DrawText(a, c, x, 0) End Sub Protected Sub DrawText(ByVal a As HorizontalAlignment, ByVal c As Color, ByVal x As Integer, ByVal y As Integer) If String.IsNullOrEmpty(Text) Then Return _Size = G.MeasureString(Text, Font).ToSize _Brush = New SolidBrush(c) Select Case a Case HorizontalAlignment.Left G.DrawString(Text, Font, _Brush, x, Height \ 2 - _Size.Height \ 2 + y) Case HorizontalAlignment.Right G.DrawString(Text, Font, _Brush, Width - _Size.Width - x, Height \ 2 - _Size.Height \ 2 + y) Case HorizontalAlignment.Center G.DrawString(Text, Font, _Brush, Width \ 2 - _Size.Width \ 2 + x, Height \ 2 - _Size.Height \ 2 + y) End Select End Sub Protected Sub DrawIcon(ByVal a As HorizontalAlignment, ByVal x As Integer) DrawIcon(a, x, 0) End Sub Protected Sub DrawIcon(ByVal a As HorizontalAlignment, ByVal x As Integer, ByVal y As Integer) If _Image Is Nothing Then Return Select Case a Case HorizontalAlignment.Left G.DrawImage(_Image, x, Height \ 2 - _Image.Height \ 2 + y) Case HorizontalAlignment.Right G.DrawImage(_Image, Width - _Image.Width - x, Height \ 2 - _Image.Height \ 2 + y) Case HorizontalAlignment.Center G.DrawImage(_Image, Width \ 2 - _Image.Width \ 2, Height \ 2 - _Image.Height \ 2) End Select 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) _Rectangle = New Rectangle(x, y, width, height) _Gradient = New LinearGradientBrush(_Rectangle, c1, c2, angle) G.FillRectangle(_Gradient, _Rectangle) End Sub #End Region End Class Class RandomPool Inherits ThemeControl Private GO As Graphics, _Size As Size Event CharacterSelection(ByVal s As Object, ByVal c As Char) Sub New() GO = Graphics.FromHwndInternal(Handle) End Sub Private _Range As String = "0123456789ABCDEF" Property Range() As String Get Return _Range End Get Set(ByVal v As String) _Range = v UpdateSize() End Set End Property Private _RangePadding As Integer = 2 Public Property RangePadding() As Integer Get Return _RangePadding End Get Set(ByVal v As Integer) _RangePadding = v UpdateSize() End Set End Property Overrides Property Font As Font Get Return MyBase.Font End Get Set(ByVal v As Font) MyBase.Font = v UpdateSize() End Set End Property Private _Brush As Brush = SystemBrushes.ControlText Overrides Property ForeColor As Color Get Return MyBase.ForeColor End Get Set(ByVal v As Color) MyBase.ForeColor = v _Brush = New SolidBrush(v) Invalidate() End Set End Property Private Count As Integer Private Sub UpdateSize() _Size = New Size(0, 0) Dim T As Size For I As Integer = 0 To _Range.Length - 1 T = GO.MeasureString(_Range(I), Font).ToSize() T.Width += _RangePadding T.Height += _RangePadding If T.Height > _Size.Height Then _Size.Height = T.Height If T.Width > _Size.Width Then _Size.Width = T.Width Next Randomize() End Sub Private Index1, Index2 As Integer, Items As Char() Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) Index1 = GetIndex(e.X, e.Y) If Index1 = Index2 Then Return RaiseEvent CharacterSelection(Me, Items(Index1)) Randomize(Index1 - Count) Randomize(Index1 - 1) Randomize(Index1) Randomize(Index1 + 1) Randomize(Index1 + Count) Index2 = Index1 Invalidate() End Sub Protected Overrides Sub OnSizeChanged(ByVal e As EventArgs) If _Size.Width = 0 Then UpdateSize() Else Randomize() MyBase.OnSizeChanged(e) End Sub Overrides Sub PaintHook() G.Clear(BackColor) For X As Integer = 0 To Width - 1 Step _Size.Width For Y As Integer = 0 To Height - 1 Step _Size.Height G.DrawString(Items(GetIndex(X, Y)), Font, _Brush, X, Y) Next Next End Sub Private Function GetIndex(ByVal x As Integer, ByVal y As Integer) As Integer Return (y \ _Size.Height) * Count + (x \ _Size.Width) End Function Private RN As Random Private Sub Randomize() Count = CInt(Math.Ceiling(Width / _Size.Width)) RN = New Random(Guid.NewGuid.GetHashCode) Items = New Char(CInt(Math.Ceiling(Width / _Size.Width) * Math.Ceiling(Height / _Size.Height)) - 1) {} For I As Integer = 0 To Items.Length - 1 Items(I) = _Range(RN.Next(_Range.Length)) Next Invalidate() End Sub Private Sub Randomize(ByVal index As Integer) If index > -1 AndAlso index < Items.Length Then Items(index) = _Range(RN.Next(_Range.Length)) End Sub End Class