LordPankake

[VB.Net] WhiteUI Theme - [7 Controls | Bright]

Aug 13th, 2014
736
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Imports System.Drawing.Drawing2D
  2. '|===========================================================|
  3. '|===|  White UI
  4. '| Creator: LordPankake
  5. '| Created: 8/13/2014, Last edited: 8/19/2014
  6. '|===========================================================|
  7. #Region "Base Classes"
  8. Public Class ThemedControl : Inherits Control
  9.     Public D As New DrawUtils
  10.     Public State As MouseState = MouseState.None
  11.     Public Pal As Palette
  12.     Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
  13.     End Sub
  14.     Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs)
  15.         MyBase.OnMouseEnter(e)
  16.         State = MouseState.Over
  17.         Invalidate()
  18.     End Sub
  19.     Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
  20.         MyBase.OnMouseDown(e)
  21.         State = MouseState.Down
  22.         Invalidate()
  23.     End Sub
  24.     Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)
  25.         MyBase.OnMouseLeave(e)
  26.         State = MouseState.None
  27.         Invalidate()
  28.     End Sub
  29.     Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
  30.         MyBase.OnMouseUp(e)
  31.         State = MouseState.Over
  32.         Invalidate()
  33.     End Sub
  34.     Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
  35.         MyBase.OnTextChanged(e)
  36.         Invalidate()
  37.     End Sub
  38.     Sub New()
  39.         MyBase.New()
  40.         MinimumSize = New Size(20, 20)
  41.         ForeColor = Color.FromArgb(146, 149, 152)
  42.         Font = New Font("Segoe UI", 10.0F)
  43.         DoubleBuffered = True
  44.         Pal = New Palette
  45.         Pal.ColHighest = Color.White
  46.         Pal.ColHigh = Color.FromArgb(215, 215, 215)
  47.         Pal.ColMed = Color.FromArgb(180, 180, 180)
  48.         Pal.ColDim = Color.FromArgb(100, 100, 100)
  49.         Pal.ColDark = Color.FromArgb(50, 50, 50)
  50.         BackColor = Pal.ColDim
  51.     End Sub
  52. End Class
  53. Public Class ThemedContainer : Inherits ContainerControl
  54.     Public D As New DrawUtils
  55.     Protected Drag As Boolean = True
  56.     Public State As MouseState = MouseState.None
  57.     Protected TopCap As Boolean = False
  58.     Protected SizeCap As Boolean = False
  59.     Public Pal As Palette
  60.     Protected MouseP As Point = New Point(0, 0)
  61.     Protected TopGrip As Integer
  62.     Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
  63.     End Sub
  64.     Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs)
  65.         MyBase.OnMouseEnter(e)
  66.         State = MouseState.Over
  67.         Invalidate()
  68.     End Sub
  69.     Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
  70.         MyBase.OnMouseDown(e)
  71.         State = MouseState.Down
  72.         If e.Button = Windows.Forms.MouseButtons.Left Then
  73.             If New Rectangle(0, 0, Width, TopGrip).Contains(e.Location) Then
  74.                 TopCap = True : MouseP = e.Location
  75.             ElseIf Drag And New Rectangle(Width - 15, Height - 15, 15, 15).Contains(e.Location) Then
  76.                 SizeCap = True : MouseP = e.Location
  77.             End If
  78.         End If
  79.     End Sub
  80.     Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)
  81.         MyBase.OnMouseLeave(e)
  82.         State = MouseState.None
  83.         Invalidate()
  84.     End Sub
  85.     Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
  86.         MyBase.OnMouseUp(e)
  87.         State = MouseState.Over
  88.         TopCap = False
  89.         If Drag Then
  90.             SizeCap = False
  91.         End If
  92.  
  93.     End Sub
  94.     Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
  95.         MyBase.OnMouseMove(e)
  96.  
  97.         If TopCap Then
  98.             Parent.Location = MousePosition - MouseP
  99.         End If
  100.         If Drag And SizeCap Then
  101.             MouseP = e.Location
  102.             Parent.Size = New Size(MouseP)
  103.             Invalidate()
  104.         End If
  105.  
  106.     End Sub
  107.     Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
  108.         MyBase.OnTextChanged(e)
  109.         Invalidate()
  110.     End Sub
  111.     Sub New()
  112.         MyBase.New()
  113.         MinimumSize = New Size(20, 20)
  114.         ForeColor = Color.FromArgb(146, 149, 152)
  115.         Font = New Font("Trebuchet MS", 10.0F)
  116.         DoubleBuffered = True
  117.         Pal = New Palette
  118.         Pal.ColHighest = Color.White
  119.         Pal.ColHigh = Color.FromArgb(215, 215, 215)
  120.         Pal.ColMed = Color.FromArgb(180, 180, 180)
  121.         Pal.ColDim = Color.FromArgb(100, 100, 100)
  122.         Pal.ColDark = Color.FromArgb(50, 50, 50)
  123.         BackColor = Pal.ColDim
  124.     End Sub
  125. End Class
  126. #End Region
  127. #Region "Theme"
  128. Public Class WhiteUIForm : Inherits ThemedContainer
  129.     Sub New()
  130.         MyBase.New()
  131.         MinimumSize = New Size(305, 150)
  132.         Dock = DockStyle.Fill
  133.         TopGrip = 30
  134.         Font = New Font("Segoe UI", 10.0F, FontStyle.Bold)
  135.     End Sub
  136.     Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  137.         Dim G As Graphics = e.Graphics
  138.         MyBase.OnPaint(e)
  139.         Try
  140.             Me.ParentForm.TransparencyKey = Color.Fuchsia
  141.             Me.ParentForm.MinimumSize = MinimumSize
  142.             If Not Me.ParentForm.FormBorderStyle = FormBorderStyle.None Then
  143.                 Me.ParentForm.FormBorderStyle = FormBorderStyle.None
  144.             End If
  145.         Catch ex As Exception : End Try
  146.         G.Clear(Me.ParentForm.TransparencyKey)
  147.         '| Background static noise
  148.        Dim BGStatic As Bitmap = D.CodeToImage(D.BGWhiteStatic)
  149.         Dim BGTextureBrush As New TextureBrush(BGStatic, WrapMode.TileFlipXY)
  150.         Dim MainPath As GraphicsPath = D.RoundRect(New Rectangle(0, 0, Width - 1, Height - 1), 10)
  151.  
  152.  
  153.         G.FillPath(BGTextureBrush, MainPath)
  154.         G.DrawPath(New Pen(Pal.ColHigh), MainPath)
  155.         G.DrawLine(New Pen(Pal.ColHigh), New Point(0, TopGrip), New Point(Width - 1, TopGrip))
  156.         D.DrawTextWithShadow(G, New Rectangle(8, 0, Width - 17, TopGrip), Text, Font, HorizontalAlignment.Left, Pal.ColDim, Color.FromArgb(200, 200, 200))
  157.     End Sub
  158. End Class
  159. Public Class WhiteUITopButton : Inherits ThemedControl
  160.     Public Property Action As BtnAction = BtnAction.Close
  161.     Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
  162.         MyBase.OnMouseDown(e)
  163.         State = MouseState.Down
  164.         Invalidate()
  165.         If Action = BtnAction.Close Then
  166.             FindForm.Close()
  167.         Else
  168.             FindForm.WindowState = FormWindowState.Minimized
  169.         End If
  170.     End Sub
  171.     Enum BtnAction
  172.         Close
  173.         Minimize
  174.     End Enum
  175.     Sub New()
  176.         MyBase.New()
  177.         Font = New Font("Segoe UI", 10.0F, FontStyle.Bold)
  178.     End Sub
  179.     Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  180.         Dim G As Graphics = e.Graphics
  181.         MyBase.OnPaint(e)
  182.         G.Clear(Me.Parent.BackColor)
  183.         G.SmoothingMode = SmoothingMode.HighQuality
  184.  
  185.         Dim BGStatic As Bitmap = D.CodeToImage(D.BGWhiteStatic)
  186.         Dim BGTextureBrush As New TextureBrush(BGStatic, WrapMode.TileFlipXY)
  187.         Dim TextRect As New Rectangle(0, 0, Width + 1, Height - 3)
  188.         Dim MainPath As GraphicsPath = D.RoundRect(New Rectangle(2, 2, Width - 6, Height - 6), 5)
  189.         Dim DropShadowPath As GraphicsPath = D.RoundRect(New Rectangle(0, 0, Width - 1, Height - 1), 5)
  190.         G.FillRectangle(BGTextureBrush, New Rectangle(-1, -1, Width + 1, Height + 1))
  191.  
  192.  
  193.         '| Dropshadow
  194.        Dim ColBlend As ColorBlend = New ColorBlend(3)
  195.         ColBlend.Colors = {Color.Transparent, Color.FromArgb(30, Color.DimGray), Color.FromArgb(60, Color.DimGray)}
  196.         ColBlend.Positions = {0, 1 / 2, 1}
  197.         D.DrawShadowPath(G, ColBlend, DropShadowPath)
  198.  
  199.         '| Drawing the button
  200.        Dim BtnText As String
  201.         If Action = BtnAction.Close Then
  202.             BtnText = "x"
  203.         Else
  204.             BtnText = "_"
  205.         End If
  206.         Select Case State
  207.             Case MouseState.None
  208.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height * (3 / 2)), Color.FromArgb(240, 240, 240), Color.FromArgb(220, 220, 220))
  209.                 G.FillPath(ButtonLGB, MainPath)
  210.                 D.DrawText(G, TextRect, BtnText, Font, HorizontalAlignment.Center, Color.FromArgb(200, 200, 200))
  211.             Case MouseState.Over
  212.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height * (3 / 2)), Color.White, Color.FromArgb(230, 230, 230))
  213.                 G.FillPath(ButtonLGB, MainPath)
  214.                 D.DrawText(G, TextRect, BtnText, Font, HorizontalAlignment.Center, Color.FromArgb(210, 210, 210))
  215.             Case MouseState.Down
  216.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height * (3 / 2)), Color.FromArgb(230, 230, 230), Color.FromArgb(210, 210, 210))
  217.                 G.FillPath(ButtonLGB, MainPath)
  218.                 D.DrawText(G, TextRect, BtnText, Font, HorizontalAlignment.Center, Color.FromArgb(170, 170, 170))
  219.         End Select
  220.         G.DrawPath(New Pen(Pal.ColHigh), MainPath)
  221.     End Sub
  222. End Class
  223. Public Class WhiteUIButton : Inherits ThemedControl
  224.     Sub New()
  225.         MyBase.New()
  226.         Font = New Font("Segoe UI", 10.0F, FontStyle.Bold)
  227.     End Sub
  228.     Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  229.         Dim G As Graphics = e.Graphics
  230.         MyBase.OnPaint(e)
  231.         G.Clear(Me.Parent.BackColor)
  232.         G.SmoothingMode = SmoothingMode.HighQuality
  233.  
  234.         Dim BGStatic As Bitmap = D.CodeToImage(D.BGWhiteStatic)
  235.         Dim BGTextureBrush As New TextureBrush(BGStatic, WrapMode.TileFlipXY)
  236.         Dim TextRect As New Rectangle(0, 0, Width + 1, Height - 3)
  237.         Dim MainPath As GraphicsPath = D.RoundRect(New Rectangle(2, 2, Width - 6, Height - 6), 5)
  238.         Dim DropShadowPath As GraphicsPath = D.RoundRect(New Rectangle(-2, 0, Width + 1, Height), 5)
  239.         G.FillRectangle(BGTextureBrush, New Rectangle(-1, -1, Width + 1, Height + 1))
  240.  
  241.  
  242.         '| Dropshadow
  243.        Dim ColBlend As ColorBlend = New ColorBlend(3)
  244.         ColBlend.Colors = {Color.Transparent, Color.FromArgb(30, Color.DimGray), Color.FromArgb(60, Color.DimGray)}
  245.         ColBlend.Positions = {0, 1 / 10, 1}
  246.         D.DrawShadowPath(G, ColBlend, DropShadowPath)
  247.  
  248.         '| Main button drawing
  249.        Select Case State
  250.             Case MouseState.None
  251.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height * (3 / 2)), Color.WhiteSmoke, Pal.ColHigh)
  252.                 G.FillPath(ButtonLGB, MainPath)
  253.             Case MouseState.Over
  254.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height * (3 / 2)), Color.White, Color.FromArgb(230, 230, 230))
  255.                 G.FillPath(ButtonLGB, MainPath)
  256.             Case MouseState.Down
  257.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height), Color.FromArgb(240, 240, 240), Pal.ColHigh)
  258.                 G.FillPath(ButtonLGB, MainPath)
  259.         End Select
  260.  
  261.         D.DrawTextWithShadow(G, TextRect, Text, Font, HorizontalAlignment.Center, Pal.ColDim, Color.FromArgb(200, 200, 200))
  262.         G.DrawPath(New Pen(Pal.ColHigh), MainPath)
  263.     End Sub
  264. End Class
  265. Public Class WhiteUICircularButton : Inherits ThemedControl
  266.     Sub New()
  267.         MyBase.New()
  268.         Font = New Font("Segoe UI", 10.0F, FontStyle.Bold)
  269.     End Sub
  270.     Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  271.         Dim G As Graphics = e.Graphics
  272.         MyBase.OnPaint(e)
  273.         G.Clear(Me.Parent.BackColor)
  274.         G.SmoothingMode = SmoothingMode.HighQuality
  275.  
  276.         Dim BGStatic As Bitmap = D.CodeToImage(D.BGWhiteStatic)
  277.         Dim BGTextureBrush As New TextureBrush(BGStatic, WrapMode.TileFlipXY)
  278.         Dim TextRect As New Rectangle(0, 0, Width + 1, Height - 3)
  279.         Dim MainPath As Rectangle = New Rectangle(2, 2, Width - 6, Height - 6)
  280.         Dim DropShadowPath As Rectangle = New Rectangle(-2, 0, Width + 1, Height)
  281.         G.FillRectangle(BGTextureBrush, New Rectangle(-1, -1, Width + 1, Height + 1))
  282.         '| Dropshadow
  283.        D.DrawShadowEllipse(G, Color.FromArgb(30, Color.DimGray), DropShadowPath)
  284.  
  285.         '| Main button drawing
  286.        Select Case State
  287.             Case MouseState.None
  288.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height * (3 / 2)), Color.WhiteSmoke, Pal.ColHigh)
  289.                 G.FillEllipse(ButtonLGB, MainPath)
  290.             Case MouseState.Over
  291.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height * (3 / 2)), Color.White, Color.FromArgb(230, 230, 230))
  292.                 G.FillEllipse(ButtonLGB, MainPath)
  293.             Case MouseState.Down
  294.                 Dim ButtonLGB As New LinearGradientBrush(New Point(0, 2), New Point(0, Height), Color.FromArgb(240, 240, 240), Pal.ColHigh)
  295.                 G.FillEllipse(ButtonLGB, MainPath)
  296.         End Select
  297.  
  298.         D.DrawTextWithShadow(G, TextRect, Text, Font, HorizontalAlignment.Center, Pal.ColDim, Color.FromArgb(200, 200, 200))
  299.         G.DrawEllipse(New Pen(Pal.ColHigh), MainPath)
  300.     End Sub
  301. End Class
  302. Public Class WhiteUICheckbox : Inherits ThemedControl
  303.     Public Property Checked As Boolean
  304.     Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
  305.         MyBase.OnMouseDown(e)
  306.         Checked = Not Checked
  307.     End Sub
  308.     Sub New()
  309.         MyBase.New()
  310.         Font = New Font("Segoe UI", 10.0F, FontStyle.Bold)
  311.     End Sub
  312.     Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  313.         Dim G As Graphics = e.Graphics
  314.         MyBase.OnPaint(e)
  315.         G.Clear(Me.Parent.BackColor)
  316.         G.SmoothingMode = SmoothingMode.HighQuality
  317.         Height = 31
  318.         Dim BGStatic As Bitmap = D.CodeToImage(D.BGWhiteStatic)
  319.         Dim BGTextureBrush As New TextureBrush(BGStatic, WrapMode.TileFlipXY)
  320.         Dim TextRect As New Rectangle(30, 0, Width + 1, Height - 1)
  321.         Dim CheckboxPath As GraphicsPath = D.RoundRect(New Rectangle(2, 2, Height - 6, Height - 6), 5)
  322.         Dim CheckboxLGB As New LinearGradientBrush(New Point(0, 0), New Point(0, Height * (3 / 2)), Color.FromArgb(200, 200, 200), Color.FromArgb(245, 245, 245))
  323.         Dim DropShadowPath As GraphicsPath = D.RoundRect(New Rectangle(-1, 0, Height, Height - 1), 5)
  324.         G.FillRectangle(BGTextureBrush, New Rectangle(-1, -1, Width + 1, Height + 1))
  325.  
  326.  
  327.         '| Dropshadow
  328.        Dim ShadowBlend As ColorBlend = New ColorBlend(3)
  329.         ShadowBlend.Colors = {Color.Transparent, Color.FromArgb(30, Pal.ColDim), Color.FromArgb(60, Color.DimGray)}
  330.         ShadowBlend.Positions = {0, 1 / 8, 1}
  331.         D.DrawShadowPath(G, ShadowBlend, DropShadowPath)
  332.  
  333.         '| Main checkbox drawing
  334.        G.FillPath(CheckboxLGB, CheckboxPath)
  335.  
  336.         '| Check drawing
  337.        If Checked Then
  338.             Dim chkPoly As Rectangle = New Rectangle(2 + (Height - 6) / 4, 2 + (Height - 6) / 4, (Height - 6) \ 2, (Height - 6) \ 2)
  339.             Dim Poly, PolyShad As New GraphicsPath
  340.             With Poly
  341.                 .AddLine(New Point(chkPoly.X, chkPoly.Y + chkPoly.Height \ 2), New Point(chkPoly.X + chkPoly.Width \ 2, chkPoly.Y + chkPoly.Height))
  342.                 .AddLine(New Point(chkPoly.X + chkPoly.Width \ 2, chkPoly.Y + chkPoly.Height), New Point(chkPoly.X + chkPoly.Width + 1, chkPoly.Y - 2))
  343.             End With
  344.             With PolyShad
  345.                 .AddLine(New Point(chkPoly.X, 2 + chkPoly.Y + chkPoly.Height \ 2), New Point(chkPoly.X + chkPoly.Width \ 2, chkPoly.Y + 2 + chkPoly.Height))
  346.                 .AddLine(New Point(chkPoly.X + chkPoly.Width \ 2, 2 + chkPoly.Y + chkPoly.Height), New Point(chkPoly.X + chkPoly.Width + 1, chkPoly.Y))
  347.             End With
  348.             G.DrawPath(New Pen(Color.FromArgb(180, 180, 180), 3), PolyShad)
  349.             G.DrawPath(New Pen(Color.FromArgb(255, 255, 255), 3), Poly)
  350.         End If
  351.  
  352.         D.DrawTextWithShadow(G, TextRect, Text, Font, HorizontalAlignment.Left, Pal.ColDim, Color.FromArgb(200, 200, 200))
  353.         G.DrawPath(New Pen(Color.FromArgb(50, Pal.ColDim)), CheckboxPath)
  354.     End Sub
  355. End Class
  356. Public Class WhiteUIRadiobutton : Inherits ThemedControl
  357.     Public Property Checked As Boolean
  358.     Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
  359.         MyBase.OnMouseDown(e)
  360.         For Each Cont As Control In Parent.Controls
  361.             If TypeOf Cont Is WhiteUIRadiobutton Then
  362.                 DirectCast(Cont, WhiteUIRadiobutton).Checked = False
  363.                 Cont.Invalidate()
  364.             End If
  365.         Next
  366.         Checked = True
  367.     End Sub
  368.     Sub New()
  369.         MyBase.New()
  370.         Font = New Font("Segoe UI", 10.0F, FontStyle.Bold)
  371.     End Sub
  372.     Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  373.         Dim G As Graphics = e.Graphics
  374.         MyBase.OnPaint(e)
  375.         G.Clear(Me.Parent.BackColor)
  376.         G.SmoothingMode = SmoothingMode.HighQuality
  377.         Height = 31
  378.         Dim BGStatic As Bitmap = D.CodeToImage(D.BGWhiteStatic)
  379.         Dim BGTextureBrush As New TextureBrush(BGStatic, WrapMode.TileFlipXY)
  380.         Dim TextRect As New Rectangle(30, 0, Width + 1, Height - 1)
  381.         Dim RadiobuttonRect As Rectangle = New Rectangle(2, 2, Height - 6, Height - 6)
  382.         Dim RadiobuttonLGB As New LinearGradientBrush(New Point(0, 0), New Point(0, Height * (3 / 2)), Color.FromArgb(200, 200, 200), Color.FromArgb(245, 245, 245))
  383.         Dim DropShadowCircle As Rectangle = New Rectangle(-1, 0, Height, Height - 1)
  384.         G.FillRectangle(BGTextureBrush, New Rectangle(-1, -1, Width + 1, Height + 1))
  385.  
  386.  
  387.         '| Dropshadow
  388.        D.DrawShadowEllipse(G, Color.FromArgb(30, Color.DimGray), DropShadowCircle)
  389.  
  390.         '| Main checkbox drawing
  391.        G.FillEllipse(RadiobuttonLGB, RadiobuttonRect)
  392.  
  393.         '| Check drawing
  394.        If Checked Then
  395.             Dim CheckedLGB As New LinearGradientBrush(New Point(0, 0), New Point(0, Height * (3 / 2)), Color.FromArgb(230, 230, 230), Color.FromArgb(255, 255, 255))
  396.             Dim CheckedCircle As New Rectangle(6, 6, Height - 14, Height - 14)
  397.             G.FillEllipse(CheckedLGB, CheckedCircle)
  398.             G.DrawEllipse(New Pen(Color.FromArgb(50, Pal.ColDim)), CheckedCircle)
  399.         End If
  400.  
  401.         D.DrawTextWithShadow(G, TextRect, Text, Font, HorizontalAlignment.Left, Pal.ColDim, Color.FromArgb(200, 200, 200))
  402.         G.DrawEllipse(New Pen(Color.FromArgb(50, Pal.ColDim)), RadiobuttonRect)
  403.     End Sub
  404. End Class
  405. Public Class WhiteUIHorizontalBar : Inherits ThemedControl
  406.     Public Property Minimum As Integer = 0
  407.     Public Property Value As Integer = 50
  408.     Public Property Maximum As Integer = 100
  409.     Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
  410.         MyBase.OnMouseDown(e)
  411.         If e.Button = Windows.Forms.MouseButtons.Left Then
  412.             Dim NewMin = Minimum - 10
  413.             Dim NewMax = Maximum + 10
  414.             Dim Offset As Integer = 24
  415.             If e.X > Offset And e.X < Width - Offset Then
  416.                 Value = (NewMin + (e.X * ((NewMax - NewMin) / Width)))
  417.             ElseIf e.X <= Offset Then
  418.                 Value = (NewMin + (Offset * ((NewMax - NewMin) / Width)))
  419.             ElseIf e.X >= Width - Offset Then
  420.                 Value = (NewMin + ((Width - Offset) * ((NewMax - NewMin) / Width)))
  421.             End If
  422.             Invalidate()
  423.         End If
  424.     End Sub
  425.     Sub New()
  426.         MyBase.New()
  427.         Font = New Font("Segoe UI", 10.0F, FontStyle.Bold)
  428.     End Sub
  429.     Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  430.         Dim G As Graphics = e.Graphics
  431.         MyBase.OnPaint(e)
  432.         G.Clear(Me.Parent.BackColor)
  433.         G.SmoothingMode = SmoothingMode.HighQuality
  434.         Dim BGStatic As Bitmap = D.CodeToImage(D.BGWhiteStatic)
  435.         Dim BGTextureBrush As New TextureBrush(BGStatic, WrapMode.TileFlipXY)
  436.         Dim MainPath As GraphicsPath = D.RoundRect(New Rectangle(2, 4, Width - 6, Height - 14), 5)
  437.         Dim MainPathhighlight As GraphicsPath = D.RoundRect(New Rectangle(2, 6, Width - 6, Height - 12), 5)
  438.         Dim MainPathLGB As New LinearGradientBrush(New Point(0, 0), New Point(0, Height - 1), Color.FromArgb(225, 225, 225), Color.FromArgb(240, 240, 240))
  439.         Dim MainPathHighlightLGB As New LinearGradientBrush(New Point(0, 0), New Point(0, Height), Color.FromArgb(185, 185, 185), Color.White)
  440.         G.FillRectangle(BGTextureBrush, New Rectangle(-1, -1, Width + 1, Height + 1))
  441.  
  442.         '| Main shape
  443.        G.FillPath(MainPathLGB, MainPath)
  444.         G.DrawPath(New Pen(MainPathHighlightLGB, 2), MainPathhighlight)
  445.  
  446.         '| Grip
  447.        Dim GripX As Integer = ValueToPercentage(Value) * Width - 15
  448.         Dim GripRect As New Rectangle(GripX, 0, 30, Height - 5)
  449.         Dim GripPath As GraphicsPath = D.RoundRect(GripRect, 6)
  450.         Dim GripShadowRect As New Rectangle(GripX - 2, -1, 34, Height)
  451.         Dim GripShadowPath As GraphicsPath = D.RoundRect(GripShadowRect, 6)
  452.         Dim GripLGB As New LinearGradientBrush(New Point(0, 0), New Point(0, Height), Color.White, Color.FromArgb(220, 220, 220))
  453.  
  454.         '| Grip dropshadow
  455.        Dim ColBlend As ColorBlend = New ColorBlend(3)
  456.         ColBlend.Colors = {Color.Transparent, Color.FromArgb(30, Color.DimGray), Color.FromArgb(60, Color.DimGray)}
  457.         ColBlend.Positions = {0, 1 / 10, 1}
  458.         D.DrawShadowPath(G, ColBlend, GripShadowPath)
  459.  
  460.         '| Grip drawing
  461.        G.FillPath(GripLGB, GripPath)
  462.         G.DrawPath(New Pen(Color.FromArgb(100, Pal.ColDim)), GripPath)
  463.         D.DrawTextWithShadow(G, GripRect, Value, Font, HorizontalAlignment.Center, Pal.ColDim, Color.FromArgb(200, 200, 200))
  464.     End Sub
  465.     Private Function ValueToPercentage(value As Integer) As Single
  466.         Dim min = Minimum - 10
  467.         Dim max = Maximum + 10
  468.         Return (value - min) / (max - min)
  469.         'vertical:  Return 1 - (value - min) / (max - min)
  470.    End Function
  471. End Class
  472. #End Region
  473. #Region "Theme Utility Stuff"
  474. Public Class Palette
  475.     Public ColHighest As Color
  476.     Public ColHigh As Color
  477.     Public ColMed As Color
  478.     Public ColDim As Color
  479.     Public ColDark As Color
  480. End Class
  481. Public Enum MouseState As Byte
  482.     None = 0
  483.     Over = 1
  484.     Down = 2
  485.     Block = 3
  486. End Enum
  487. Public Enum GradientAlignment As Byte
  488.     Vertical = 0
  489.     Horizontal = 1
  490. End Enum
  491. Public Class DrawUtils
  492.     Public BGWhiteStatic As String = "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"
  493.     Public Sub FillGradientBeam(ByVal g As Graphics, ByVal Col1 As Color, ByVal Col2 As Color, ByVal rect As Rectangle, ByVal align As GradientAlignment)
  494.         Dim stored As SmoothingMode = g.SmoothingMode
  495.         Dim Blend As New ColorBlend
  496.         g.SmoothingMode = SmoothingMode.HighQuality
  497.         Select Case align
  498.             Case GradientAlignment.Vertical
  499.                 Dim PathGradient As New LinearGradientBrush(New Point(rect.X, rect.Y), New Point(rect.X + rect.Width - 1, rect.Y), Color.Black, Color.Black)
  500.                 Blend.Positions = {0, 1 / 2, 1}
  501.                 Blend.Colors = {Col1, Col2, Col1}
  502.                 PathGradient.InterpolationColors = Blend
  503.                 g.FillRectangle(PathGradient, rect)
  504.             Case GradientAlignment.Horizontal
  505.                 Dim PathGradient As New LinearGradientBrush(New Point(rect.X, rect.Y), New Point(rect.X, rect.Y + rect.Height), Color.Black, Color.Black)
  506.                 Blend.Positions = {0, 1 / 2, 1}
  507.                 Blend.Colors = {Col1, Col2, Col1}
  508.                 PathGradient.InterpolationColors = Blend
  509.                 PathGradient.RotateTransform(0)
  510.                 g.FillRectangle(PathGradient, rect)
  511.         End Select
  512.         g.SmoothingMode = stored
  513.     End Sub
  514.     Public Sub DrawShadowPath(ByVal G As Graphics, ByVal ColBlend As ColorBlend, ByVal Path As GraphicsPath)
  515.         Using ShadowBrush As PathGradientBrush = New PathGradientBrush(Path)
  516.             ShadowBrush.WrapMode = WrapMode.Clamp
  517.             ShadowBrush.InterpolationColors = ColBlend
  518.             G.FillPath(ShadowBrush, Path)
  519.         End Using
  520.     End Sub
  521.     Public Sub DrawShadowEllipse(ByVal G As Graphics, ByVal col As Color, ByVal Path As Rectangle)
  522.         Dim gp As New GraphicsPath()
  523.         gp.AddEllipse(Path)
  524.  
  525.         Dim pgb As New PathGradientBrush(gp)
  526.  
  527.         pgb.CenterPoint = New PointF(Path.Width / 2, Path.Height / 2)
  528.         pgb.CenterColor = col
  529.         pgb.SurroundColors = New Color() {Color.Transparent}
  530.         pgb.SetBlendTriangularShape(0.1F, 1.0F)
  531.         pgb.FocusScales = New PointF(0.0F, 0.0F)
  532.  
  533.         G.FillPath(pgb, gp)
  534.     End Sub
  535.     Public Function CodeToImage(ByVal Code As String) As Image
  536.         Return Image.FromStream(New System.IO.MemoryStream(Convert.FromBase64String(Code)))
  537.     End Function
  538.     Public Sub DrawTextWithShadow(ByVal G As Graphics, ByVal ContRect As Rectangle, ByVal Text As String, ByVal TFont As Font, ByVal TAlign As HorizontalAlignment, ByVal TColor As Color, ByVal BColor As Color)
  539.         DrawText(G, New Rectangle(ContRect.X + 1, ContRect.Y + 2, ContRect.Width + 1, ContRect.Height + 2), Text, TFont, TAlign, BColor)
  540.         DrawText(G, ContRect, Text, TFont, TAlign, TColor)
  541.     End Sub
  542.     Public Sub DrawText(ByVal G As Graphics, ByVal ContRect As Rectangle, ByVal Text As String, ByVal TFont As Font, ByVal TAlign As HorizontalAlignment, ByVal TColor As Color)
  543.         If String.IsNullOrEmpty(Text) Then Return
  544.         Dim TextSize As Size = G.MeasureString(Text, TFont).ToSize
  545.         Dim CenteredY As Integer = ContRect.Height \ 2 - TextSize.Height \ 2
  546.         Select Case TAlign
  547.             Case HorizontalAlignment.Left
  548.                 G.DrawString(Text, TFont, New SolidBrush(TColor), ContRect.X, CenteredY)
  549.             Case HorizontalAlignment.Right
  550.                 G.DrawString(Text, TFont, New SolidBrush(TColor), ContRect.X + ContRect.Width - TextSize.Width - 5, CenteredY)
  551.             Case HorizontalAlignment.Center
  552.                 G.DrawString(Text, TFont, New SolidBrush(TColor), ContRect.X + ContRect.Width \ 2 - TextSize.Width \ 2, CenteredY)
  553.         End Select
  554.     End Sub
  555.     Public Function RoundRect(ByVal Rectangle As Rectangle, ByVal Curve As Integer) As GraphicsPath
  556.         Dim Path As New GraphicsPath
  557.         Dim ArcRectangleWidth As Integer = Curve * 2
  558.         With Path
  559.             .AddArc(New Rectangle(Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -180, 90)
  560.             .AddArc(New Rectangle(Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -90, 90)
  561.             .AddArc(New Rectangle(Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 0, 90)
  562.             .AddArc(New Rectangle(Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 90, 90)
  563.             .AddLine(New Point(Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y), New Point(Rectangle.X, Curve + Rectangle.Y))
  564.         End With
  565.         Return Path
  566.     End Function
  567.     Public Function RoundedTopRect(ByVal Rectangle As Rectangle, ByVal Curve As Integer) As GraphicsPath
  568.         Dim Path As GraphicsPath = New GraphicsPath()
  569.         Dim ArcRectangleWidth As Integer = Curve * 2
  570.         With Path
  571.             .AddArc(New Rectangle(Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -180, 90)
  572.             .AddArc(New Rectangle(Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -90, 90)
  573.             .AddLine(New Point(Rectangle.X + Rectangle.Width, Rectangle.Y + ArcRectangleWidth), New Point(Rectangle.X + Rectangle.Width, Rectangle.Y + Rectangle.Height))
  574.             .AddLine(New Point(Rectangle.X, Rectangle.Height + Rectangle.Y), New Point(Rectangle.X, Rectangle.Y + Curve))
  575.         End With
  576.         Return Path
  577.     End Function
  578. End Class
  579. #End Region
Advertisement
Add Comment
Please, Sign In to add comment