Files
crypters-scode/scode (SpaceCrypter - Free Edition/SpaceCrypter - Free Edition/Classe/RandomPool.vb
T
2026-08-27 11:04:21 -06:00

310 lines
9.5 KiB
VB.net

'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
<DefaultEvent("CharacterSelection")>
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