2025-04-10 18:01:00 +02:00

78 lines
2.4 KiB
VB.net

Imports System.Drawing
Imports System.Windows.Forms
Public Class ClassSnapPanel
Inherits Panel
Private _ShowGrid As Boolean = True
Private _GridSize As Integer = 16
Public Sub New()
Me.AutoScroll = True ' Scrollbars aktivieren
End Sub
Public Property GridSize As Integer
Get
Return _GridSize
End Get
Set(value As Integer)
_GridSize = value
Refresh()
End Set
End Property
Public Property ShowGrid As Boolean
Get
Return _ShowGrid
End Get
Set(value As Boolean)
_ShowGrid = value
Refresh()
End Set
End Property
Protected Overrides Sub OnControlAdded(e As ControlEventArgs)
AddHandler e.Control.LocationChanged, AddressOf AlignToGrid
AddHandler e.Control.DragDrop, AddressOf AlignToGrid
MyBase.OnControlAdded(e)
UpdateScrollArea()
End Sub
Protected Overrides Sub OnControlRemoved(e As ControlEventArgs)
RemoveHandler e.Control.LocationChanged, AddressOf AlignToGrid
RemoveHandler e.Control.DragDrop, AddressOf AlignToGrid
MyBase.OnControlRemoved(e)
UpdateScrollArea()
End Sub
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
If _ShowGrid Then
ControlPaint.DrawGrid(e.Graphics, ClientRectangle, New Size(_GridSize, _GridSize), BackColor)
End If
MyBase.OnPaint(e)
End Sub
Private Sub AlignToGrid(sender As Object, e As EventArgs)
If _ShowGrid Then
Dim item As Control = CType(sender, Control)
Dim x As Integer = Math.Round(item.Left / _GridSize) * _GridSize
Dim y As Integer = Math.Round(item.Top / _GridSize) * _GridSize
item.Location = New Point(x, y)
UpdateScrollArea()
End If
End Sub
Private Sub UpdateScrollArea()
Dim maxWidth As Integer = 0
Dim maxHeight As Integer = 0
' Größte X- und Y-Koordinate der enthaltenen Controls bestimmen
For Each ctrl As Control In Controls
Dim right As Integer = ctrl.Right
Dim bottom As Integer = ctrl.Bottom
If right > maxWidth Then maxWidth = right
If bottom > maxHeight Then maxHeight = bottom
Next
' Scrollbereich setzen
Me.AutoScrollMinSize = New Size(maxWidth, maxHeight)
End Sub
End Class