Vielleicht so ....
Public Class frmDynamic
Dim buttoncounter As Integer
Dim ctlfile As String = "C:\daten\controls.txt"
Dim controlkeypressed As Boolean = False 'Ist die CTRL-Taste gedrückt?
Dim buttontomove As Button = Nothing 'Referenz: zu bewegender Button
Private Sub frmDynamic_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
Me.KeyPreview = True 'Für das Erkennen der CTRL-Taste
Me.BackColor = Color.LightGray
If Not IO.File.Exists(ctlfile) Then Exit Sub
Dim ctlDaten() As String = IO.File.ReadAllLines(ctlfile)
Dim c As Integer
For i As Integer = 0 To ctlDaten.Length - 1
If ctlDaten(i).StartsWith("Button") Then
buttoncounter += 1
Dim angaben() As String = ctlDaten(i).Split("|"c)
Dim t As Integer = CInt(angaben(1))
Dim l As Integer = CInt(angaben(2))
Dim btn As New Button With _
{.Parent = Me, _
.Top = t, .Left = l, _
.Tag = CStr(buttoncounter), _
.Text = angaben(3)}
ButtonHandlers(btn)
End If
Next
End Sub
'Wenn die CTRL-Taste gedrückt bleibt,
'können dynamisch erstellte Buttons bewegt werden
Private Sub frmDynamic_KeyDown(sender As Object, _
e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.ControlKey Then
Me.BackColor = Color.Gray 'Bewegungsmögl. anzeigen
controlkeypressed = True
End If
End Sub
Private Sub frmDynamic_KeyUp(sender As Object, _
e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
If controlkeypressed Then
controlkeypressed = False
Me.BackColor = Color.LightGray
End If
End Sub
Private Sub ButtonHandlers(ByVal btn As Button)
'Handler für die dynamisch erstellten Buttons
AddHandler btn.Click, AddressOf ButtonDyn_Click
AddHandler btn.MouseDown, AddressOf ButtonDyn_MouseDown
AddHandler btn.MouseUp, AddressOf ButtonDyn_MouseUp
AddHandler btn.MouseMove, AddressOf ButtonDyn_MouseMove
End Sub
Private Sub frmDynamic_MouseDown(sender As Object, _
e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If e.Button = Windows.Forms.MouseButtons.Right Then
buttoncounter += 1
Dim btn As New Button With _
{.Parent = Me, _
.Location = e.Location, _
.Tag = CStr(buttoncounter), _
.Text = "Neu" & CStr(.Tag)}
ButtonHandlers(btn)
If Not IO.File.Exists(ctlfile) Then
Dim fs As IO.FileStream = IO.File.Create(ctlfile)
fs.Close()
End If
Dim ctlDaten() As String = IO.File.ReadAllLines(ctlfile)
Array.Resize(ctlDaten, ctlDaten.Length + 1)
ctlDaten(ctlDaten.Length - 1) = _
"Button | " & CStr(btn.Top) & " | " & CStr(btn.Left) & " | " & _
btn.Text
IO.File.WriteAllLines(ctlfile, ctlDaten)
End If
End Sub
Private Sub ButtonDyn_Click(sender As System.Object, _
e As System.EventArgs)
Dim buttontag As Integer = CInt(CType(sender, Button).Tag)
If Not controlkeypressed Then
MsgBox("Button Nummer " & CStr(buttontag))
End If
End Sub
Private Sub ButtonDyn_MouseDown(sender As System.Object, _
e As MouseEventArgs)
If controlkeypressed Then
'Referenz auf den zu bewegenden Button notieren
buttontomove = CType(sender, Button)
End If
End Sub
Private Sub ButtonDyn_MouseMove(sender As Object, e As MouseEventArgs)
If buttontomove IsNot Nothing Then
'zu bewegender Button folgt der Maus
Dim loc As New Point(e.Location.X + buttontomove.Left, _
e.Location.Y + buttontomove.Top)
With Me.ClientRectangle
If loc.X > 20 And loc.X < .Width - buttontomove.Width _
And loc.Y > 20 And loc.Y < .Height - buttontomove.Height Then
'Ausrichtung auf Gitter
loc.X = (loc.X \ 20) * 20
loc.Y = (loc.Y \ 20) * 20
buttontomove.Location = loc
End If
End With
End If
End Sub
Private Sub ButtonDyn_MouseUp(sender As Object, _
e As MouseEventArgs)
'Button-Bewegung beenden
buttontomove = Nothing
End Sub
End Class
Beitrag wurde zuletzt am 20.01.14 um 23:07:16 editiert. |