78 lines
2.4 KiB
VB.net
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
|