Hallo!
Das Framework stellt für die Organisation eines Formulars bei Größenänderung
zahlreiche Hilfsmittel zur Verfügung.
Du kannst Containersteuerelemente (z.B. diverse Panels) zur Flächenaufteilung
verwenden und die Conrols dort per Dock- oder Anchor-Eigenschaft anpassen und
ausrichten lassen.
Aber man kann auch volle Kontrolle über Location und Size der Controls
per Code ausüben. Dafür gibt es ebenfalls Hilfsmittel, z.B. Control in Listen
aufzubewahren und in Schleifen die Positionierung durchzuführen.
Hier ein kleines Beispiel:
Public Class frmResizeDemo
Dim buttons As New List(Of Button)
Dim textboxes As New List(Of TextBox)
Dim trv1, trv2 As New TreeView With {.Parent = Me}
Private Sub frmResizeDemo_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
Me.MinimumSize = New Size(300, 350) 'Mindestgröße des Formulars
'Buttons in Liste erstellen und mit Ereignishandler versehen
For i As Integer = 1 To 8
buttons.Add _
(New Button With {.Text = "but" & i.ToString, .Parent = Me})
AddHandler buttons(i - 1).Click, AddressOf button_click
AddHandler buttons(i - 1).KeyDown, AddressOf Key_Down
Next
'Textboxen in Liste erstellen und mit Ereignishandler versehen
For i As Integer = 1 To 4
textboxes.Add _
(New TextBox With {.Parent = Me, .Name = "Textbox" & CStr(i)})
AddHandler textboxes(i - 1).TextChanged, AddressOf text_changed
AddHandler textboxes(i - 1).KeyDown, AddressOf Key_Down
Next
'Grundanordnung der Treeviews
trv1.Location = New Point(10, 10)
trv2.Top = 10
trv1.BackColor = Color.LightGray
trv2.BackColor = Color.LightCoral
Form1_ResizeEnd(Me, EventArgs.Empty)
End Sub
Private Sub button_click(ByVal sender As Object, e As EventArgs)
'Alle Button-Click-Ereignisse kommen hier an
Dim btn As Button = DirectCast(sender, Button)
MsgBox("Button " & btn.Text & " ist gedrückt worden")
End Sub
Private Sub text_changed(ByVal sender As Object, e As EventArgs)
'Alle Textbox-Changed-Ereignisse kommen hier an
Dim txt As TextBox = DirectCast(sender, TextBox)
MsgBox("Textbox " & txt.Name & " ist geändert worden")
End Sub
Private Sub Key_Down(sender As Object, _
e As System.Windows.Forms.KeyEventArgs)
'Hier kommen alle KeyDowns für Buttons und Textboxen an
If TypeOf sender Is Button Then
Dim btn As Button = DirectCast(sender, Button)
MsgBox("KeyDown auf Button " & btn.Text)
Else
Dim txt As TextBox = DirectCast(sender, TextBox)
MsgBox("Keydown auf Textbox " & txt.Name)
End If
End Sub
Private Sub frmResizeDemo_ResizeEnd(sender As Object, _
e As EventArgs) Handles MyBase.ResizeEnd
Dim ctrl_height As Integer = 30
Dim left2 As Integer = (Me.Width - 2 * trv1.Left) \ 2
Dim trv_height As Integer = Me.Height - ctrl_height * 9
trv1.Size = New Size(left2 - 2 * trv1.Left, trv_height)
trv2.Size = trv1.Size : trv2.Left = left2
'Buttons an Formgröße (2 Spalten)
For i As Integer = 0 To buttons.Count - 1
Dim lft As Integer = If(i Mod 2 = 0, trv1.Left, left2)
buttons(i).Location = New Point _
(lft, trv1.Top * 2 + trv_height + (i \ 2) * ctrl_height)
buttons(i).Size = New Size(trv1.Width, ctrl_height)
Next i
'Textboxen an Formgröße anpassen (2 Spalten)
For i As Integer = 0 To textboxes.Count - 1
Dim lft As Integer = If(i Mod 2 = 0, trv1.Left, left2)
textboxes(i).Location = New Point _
(lft, trv1.Top * 2 + trv_height + 5 * ctrl_height + (i \ 2) * _
ctrl_height)
textboxes(i).Size = New Size(trv1.Width, ctrl_height)
Next i
End Sub
Private Sub frmResizeDemo_SizeChanged(sender As Object, _
e As System.EventArgs) Handles Me.SizeChanged
If Not Me.WindowState = FormWindowState.Minimized Then
Form1_ResizeEnd(Me, EventArgs.Empty)
End If
End Sub
End Class Ich nehme an, Du möchstest alle Knoten innerhalb der Hierarchie, die zu
einem geänderten Knoten führt, farbig markieren. Dann kannst Du in dieser Routine
bei jedem ret-Knotenverweis in der while-Schleife die Farbmarkierung eintragen.
Beitrag wurde zuletzt am 25.06.17 um 22:06:10 editiert. |