Files
Pilz/Pilz.UI.WinForms/DisplayHelp.vb
2025-06-16 11:50:17 +02:00

233 lines
9.6 KiB
VB.net

Imports System.Drawing
Imports System.Drawing.Drawing2D
Public Class DisplayHelp
Public Shared Sub FillRectangle(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal color1 As Color)
FillRectangle(g, bounds, color1, Color.Empty, 90)
End Sub
Public Shared Sub FillRectangle(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal color1 As Color, ByVal color2 As Color)
FillRectangle(g, bounds, color1, color2, 90)
End Sub
Public Shared Sub FillRectangle(ByVal g As Graphics, ByVal r As Rectangle, ByVal color1 As Color, ByVal color2 As Color, ByVal gradientAngle As Integer)
If r.Width = 0 OrElse r.Height = 0 Then Return
If color2.IsEmpty Then
If Not color1.IsEmpty Then
Dim sm As SmoothingMode = g.SmoothingMode
g.SmoothingMode = SmoothingMode.None
Using brush As SolidBrush = New SolidBrush(color1)
g.FillRectangle(brush, r)
End Using
g.SmoothingMode = sm
End If
Else
Using brush As LinearGradientBrush = CreateLinearGradientBrush(r, color1, color2, gradientAngle)
g.FillRectangle(brush, r)
End Using
End If
End Sub
Public Shared Sub FillRectangle(ByVal g As Graphics, ByVal r As Rectangle, ByVal color1 As Color, ByVal color2 As Color, ByVal gradientAngle As Integer, ByVal factors As Single(), ByVal positions As Single())
If r.Width = 0 OrElse r.Height = 0 Then Return
If color2.IsEmpty Then
If Not color1.IsEmpty Then
Dim sm As SmoothingMode = g.SmoothingMode
g.SmoothingMode = SmoothingMode.None
Using brush As SolidBrush = New SolidBrush(color1)
g.FillRectangle(brush, r)
End Using
g.SmoothingMode = sm
End If
Else
Using brush As LinearGradientBrush = CreateLinearGradientBrush(r, color1, color2, gradientAngle)
Dim blend As Blend = New Blend(factors.Length)
blend.Factors = factors
blend.Positions = positions
brush.Blend = blend
g.FillRectangle(brush, r)
End Using
End If
End Sub
Public Shared Sub FillRoundedRectangle(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal cornerSize As Integer, ByVal color1 As Color, ByVal color2 As Color, ByVal gradientAngle As Integer)
If color2.IsEmpty Then
If Not color1.IsEmpty Then
Using brush As SolidBrush = New SolidBrush(color1)
FillRoundedRectangle(g, brush, bounds, cornerSize)
End Using
End If
Else
Using brush As LinearGradientBrush = CreateLinearGradientBrush(bounds, color1, color2, gradientAngle)
FillRoundedRectangle(g, brush, bounds, cornerSize)
End Using
End If
End Sub
Public Shared Sub FillRoundedRectangle(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal cornerSize As Integer, ByVal color1 As Color, ByVal color2 As Color)
FillRoundedRectangle(g, bounds, cornerSize, color1, color2, 90)
End Sub
Public Shared Sub FillRoundedRectangle(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal cornerSize As Integer, ByVal color1 As Color)
Using brush As SolidBrush = New SolidBrush(color1)
FillRoundedRectangle(g, brush, bounds, cornerSize)
End Using
End Sub
Public Shared Sub FillRoundedRectangle(ByVal g As Graphics, ByVal brush As Brush, ByVal bounds As Rectangle, ByVal cornerSize As Integer)
If cornerSize <= 0 Then
Dim sm As SmoothingMode = g.SmoothingMode
g.SmoothingMode = SmoothingMode.None
g.FillRectangle(brush, bounds)
g.SmoothingMode = sm
Else
bounds.Width -= 1
bounds.Height -= 1
Using path As GraphicsPath = GetRoundedRectanglePath(bounds, cornerSize)
g.FillPath(brush, path)
End Using
End If
End Sub
Public Shared Sub DrawRectangle(ByVal g As System.Drawing.Graphics, ByVal color As Color, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
Using pen As Pen = New Pen(color, 1)
DrawRectangle(g, pen, x, y, width, height)
End Using
End Sub
Public Shared Sub DrawRectangle(ByVal g As System.Drawing.Graphics, ByVal color As Color, ByVal r As System.Drawing.Rectangle)
DrawRectangle(g, color, r.X, r.Y, r.Width, r.Height)
End Sub
Public Shared Sub DrawRectangle(ByVal g As System.Drawing.Graphics, ByVal pen As System.Drawing.Pen, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
width -= 1
height -= 1
g.DrawRectangle(pen, x, y, width, height)
End Sub
Public Shared Sub DrawRoundedRectangle(ByVal g As System.Drawing.Graphics, ByVal color As Color, ByVal bounds As Rectangle, ByVal cornerSize As Integer)
If Not color.IsEmpty Then
Using pen As Pen = New Pen(color)
DrawRoundedRectangle(g, pen, bounds.X, bounds.Y, bounds.Width, bounds.Height, cornerSize)
End Using
End If
End Sub
Public Shared Sub DrawRoundedRectangle(ByVal g As System.Drawing.Graphics, ByVal pen As System.Drawing.Pen, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal cornerSize As Integer)
DrawRoundedRectangle(g, pen, Nothing, x, y, width, height, cornerSize)
End Sub
Public Shared Sub DrawRoundedRectangle(ByVal g As System.Drawing.Graphics, ByVal pen As System.Drawing.Pen, ByVal fill As Brush, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal cornerSize As Integer)
width -= 1
height -= 1
Dim r As Rectangle = New Rectangle(x, y, width, height)
Using path As GraphicsPath = GetRoundedRectanglePath(r, cornerSize)
If fill IsNot Nothing Then g.FillPath(fill, path)
g.DrawPath(pen, path)
End Using
End Sub
Public Shared Function GetRoundedRectanglePath(ByVal r As Rectangle, ByVal cornerSize As Integer) As GraphicsPath
Dim path As GraphicsPath = New GraphicsPath()
If cornerSize = 0 Then
path.AddRectangle(r)
Else
AddCornerArc(path, r, cornerSize, eCornerArc.TopLeft)
AddCornerArc(path, r, cornerSize, eCornerArc.TopRight)
AddCornerArc(path, r, cornerSize, eCornerArc.BottomRight)
AddCornerArc(path, r, cornerSize, eCornerArc.BottomLeft)
path.CloseAllFigures()
End If
Return path
End Function
Public Shared Function CreateLinearGradientBrush(ByVal r As Rectangle, ByVal color1 As Color, ByVal color2 As Color, ByVal gradientAngle As Single) As LinearGradientBrush
If r.Width <= 0 Then r.Width = 1
If r.Height <= 0 Then r.Height = 1
Return New LinearGradientBrush(New Rectangle(r.X, r.Y - 1, r.Width, r.Height + 1), color1, color2, gradientAngle)
End Function
Public Shared Sub AddCornerArc(ByVal path As GraphicsPath, ByVal bounds As Rectangle, ByVal cornerDiameter As Integer, ByVal corner As eCornerArc)
If cornerDiameter > 0 Then
Dim a As ArcData = GetCornerArc(bounds, cornerDiameter, corner)
path.AddArc(a.X, a.Y, a.Width, a.Height, a.StartAngle, a.SweepAngle)
Else
If corner = eCornerArc.TopLeft Then
path.AddLine(bounds.X, bounds.Y + 2, bounds.X, bounds.Y)
ElseIf corner = eCornerArc.BottomLeft Then
path.AddLine(bounds.X + 2, bounds.Bottom, bounds.X, bounds.Bottom)
ElseIf corner = eCornerArc.TopRight Then
path.AddLine(bounds.Right - 2, bounds.Y, bounds.Right, bounds.Y)
ElseIf corner = eCornerArc.BottomRight Then
path.AddLine(bounds.Right, bounds.Bottom - 2, bounds.Right, bounds.Bottom)
End If
End If
End Sub
Friend Shared Function GetCornerArc(ByVal bounds As Rectangle, ByVal cornerDiameter As Integer, ByVal corner As eCornerArc) As ArcData
Dim a As ArcData
If cornerDiameter = 0 Then cornerDiameter = 1
Dim diameter As Integer = cornerDiameter * 2
Select Case corner
Case eCornerArc.TopLeft
a = New ArcData(bounds.X, bounds.Y, diameter, diameter, 180, 90)
Case eCornerArc.TopRight
a = New ArcData(bounds.Right - diameter, bounds.Y, diameter, diameter, 270, 90)
Case eCornerArc.BottomLeft
a = New ArcData(bounds.X, bounds.Bottom - diameter, diameter, diameter, 90, 90)
Case Else
a = New ArcData(bounds.Right - diameter, bounds.Bottom - diameter, diameter, diameter, 0, 90)
End Select
Return a
End Function
Public Enum eCornerArc
TopLeft
TopRight
BottomLeft
BottomRight
End Enum
Friend Structure ArcData
Public X As Integer
Public Y As Integer
Public Width As Integer
Public Height As Integer
Public StartAngle As Single
Public SweepAngle As Single
Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal startAngle As Single, ByVal sweepAngle As Single)
Me.X = x
Me.Y = y
Me.Width = width
Me.Height = height
Me.StartAngle = startAngle
Me.SweepAngle = sweepAngle
End Sub
End Structure
End Class