| |
VB.NET - FortgeschritteneMehrere Controls auf Form Markieren und Verschieben | | | Autor: TimZwingmann | Datum: 28.11.17 09:32 |
| Hallo,
wie ist es möglich einen Bereich auf einer Form in VB.net mittels Maus zu markieren und die darin befindenden Controls zu "Markieren" und verschieben.
Selbe Funktion wie auf dem Desktop
Mit freundlichen Grüßen
Beitrag wurde zuletzt am 28.11.17 um 09:34:01 editiert. | |
Re: Mehrere Controls auf Form Markieren und Verschieben | | | Autor: Manfred X | Datum: 28.11.17 11:42 |
| Hallo!
Wie soll markiert werden?
Mit der Maus ein Rechteck auf der Form zeichnen und die darin
befindlichen Controls gemeinsam um einen Betrag X/Y auf der
Form verschieben?
Was geschieht, wenn das Ziel-Rechteck nicht vollständig auf die
Form passt? Löschen der Controls im überstehenden Bereich?
Oder neu einapssen/anordnen? | |
Re: Mehrere Controls auf Form Markieren und Verschieben | | | Autor: TimZwingmann | Datum: 28.11.17 11:53 |
| Danke für die schnelle Antwort!
Ja es soll sozusagen ein Rechteck gezeichnet werden und die darin befindlichen Controls
so verschieben wie man die Maus bewegt.
Public Class Form1
Private firstklick As Boolean = False
Private verschieben As Boolean = False
Private strg As Boolean = False
Private pn As Panel
Private oldx As Integer
Private oldy As Integer
Private xm As Integer
Private ym As Integer
Private clist As List(Of Control) = New List(Of Control)
Private Sub StartToolStripMenuItem1_Click(sender As Object, e As EventArgs) _
Handles StartToolStripMenuItem1.Click
strg = True
End Sub
Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles _
Me.MouseDown
If Not strg Then Return
If clist.Count > 0 Then
For Each c As Control In clist
Highlighter1.SetHighlightColor(c, _
DevComponents.DotNetBar.Validator.eHighlightColor.None)
Next
End If
clist.Clear()
xm = e.X
ym = e.Y
pn = New Panel
With pn
.Location = New Point(xm, ym)
.BorderStyle = BorderStyle.FixedSingle
End With
oldx = xm
oldy = ym
firstklick = True
End Sub
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles _
Me.MouseMove
If firstklick Then
xm = e.X
ym = e.Y
With pn
.Size = New Size(xm - oldx, ym - oldy)
.Visible = True
End With
Controls.Add(pn)
End If
End Sub
Private Sub Form1_MouseUp(sender As Object, e As MouseEventArgs) Handles _
Me.MouseUp
If Not strg Then Return
For Each c As Control In Controls
If TypeOf c IsNot Panel Then
If c.Location.X > oldx And c.Location.Y > oldy AndAlso _
c.Location.X < xm And c.Location.Y < ym Then
clist.Add(c)
End If
End If
Next
For Each c As Control In clist
Highlighter1.SetHighlightColor(c, _
DevComponents.DotNetBar.Validator.eHighlightColor.Blue)
Next
firstklick = False
strg = False
Me.Controls.Remove(pn)
End Sub
Private Sub MoseDwonAll(sender As Object, e As MouseEventArgs) Handles _
TextBox2.MouseDown, TextBox1.MouseDown, Label2.MouseDown, _
Label1.MouseDown, Button2.MouseDown, Button1.MouseDown
verschieben = True
End Sub
Private Sub MouseMoveAll(sender As Object, e As MouseEventArgs) Handles _
TextBox2.MouseMove, TextBox1.MouseMove, Label2.MouseMove, _
Label1.MouseMove, Button2.MouseMove, Button1.MouseMove
If Not verschieben Then Return
End Sub
Private Sub MouseUpAll(sender As Object, e As MouseEventArgs) Handles _
TextBox2.MouseUp, TextBox1.MouseUp, Label2.MouseUp, Label1.MouseUp, _
Button2.MouseUp, Button1.MouseUp
verschieben = False
End Sub So sieht mein Code derzeit aus, ich zeichne mithilfe meiner Maus ein Panel. Und die Controls die sich eben in diesem Panel Befinden sollen einen Highlighter bekommen damit es erkenntlich wird.
Diese Controls werden in eine Liste gespeichert damit man auf sie zugreifen kann.
Nun ist meine Frage wie ich alle Controls verschieben kann, aber die proportionen also die Abstände zwischen den Controls beibehalten kann | |
Re: Mehrere Controls auf Form Markieren und Verschieben | | | Autor: Manfred X | Datum: 28.11.17 13:17 |
| End ClassDevComponents besitze ich nicht!
Hier ein Winforms-Beispiel:
Public Class frmMove
Dim Moveables As New List(Of Control)
Private Sub FillMoveable()
Dim cWidth As Integer = 60, cheight As Integer = 30
For i As Integer = 1 To 5
For k As Integer = 1 To 5
Moveables.Add(New Button With _
{.Left = (i - 1) * CInt(1.2 * cWidth), _
.Top = (k - 1) * CInt(1.2 * cheight), _
.Width = cWidth, .Height = cheight, _
.Text = i.ToString + k.ToString,
.Parent = Me})
AddHandler Moveables(Moveables.Count - 1).MouseDown, _
AddressOf moveable_mousedown
AddHandler Moveables(Moveables.Count - 1).MouseUp, _
AddressOf moveable_mouseup
Next k
Next i
End Sub
Private Sub moveable_mousedown(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Right Then
xmove = e.X : ymove = e.Y
End If
End Sub
Private Sub moveable_mouseup(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Right Then
moveit(e.X - xmove, e.Y - ymove)
xmove = -1 : ymove = -1
End If
End Sub
Private Sub frmMove_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
FillMoveable()
End Sub
Dim xmark% = -1, ymark% = -1, mark_rect As Rectangle
Dim mark_color As Color = Me.BackColor
Dim xmove% = -1, ymove% = -1
Private Sub frmMove_MouseDown(sender As Object, _
e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
xmark = e.X : ymark = e.Y : mark_color = Color.Red
ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
xmove = e.X : ymove = e.Y
End If
End Sub
Private Sub frmMove_MouseMove(sender As Object, _
e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim w, h, t, l As Integer
w = Math.Abs(xmark - e.X)
h = Math.Abs(ymark - e.Y)
l = Math.Min(xmark, e.X)
t = Math.Min(ymark, e.Y)
mark_rect = New Rectangle(l, t, w, h)
If xmark >= 0 Then
Me.Invalidate()
Mark_Moveables()
End If
End If
End Sub
Private Sub Mark_Moveables()
For i As Integer = 0 To Moveables.Count - 1
Dim control_rect As New Rectangle(Moveables(i).Location, Moveables( _
i).Size)
Dim r As Rectangle = Rectangle.Intersect(control_rect, mark_rect)
If Not (r.Width = 0 Or r.Height = 0) Then
If Moveables(i).Tag Is Nothing Then
Moveables(i).Tag = Moveables(i).BackColor
Moveables(i).BackColor = Color.Blue
End If
ElseIf Moveables(i).Tag IsNot Nothing Then
Moveables(i).BackColor = DirectCast(Moveables(i).Tag, Color)
Moveables(i).Tag = Nothing
End If
Next i
End Sub
Private Sub moveit(dx As Integer, dy As Integer)
For i As Integer = 0 To Moveables.Count - 1
If Moveables(i).Tag IsNot Nothing Then
Moveables(i).Top += dy
Moveables(i).Left += dx
End If
Next i
Mark_Moveables()
End Sub
Private Sub frmMove_MouseUp(sender As Object, _
e As System.Windows.Forms.MouseEventArgs) _
Handles Me.MouseUp
If e.Button = Windows.Forms.MouseButtons.Left Then
mark_color = Me.BackColor
xmark = -1 : ymark = -1 : mark_rect = Nothing
Me.Invalidate()
ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
moveit(e.X - xmove, e.Y - ymove)
xmove = -1 : ymove = -1
End If
End Sub
Private Sub frmMove_Paint(sender As Object, _
e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
If xmark > 0 Then
Using p As New Pen(mark_color)
e.Graphics.DrawRectangle(p, mark_rect)
End Using
End If
End Sub
Beitrag wurde zuletzt am 28.11.17 um 13:24:39 editiert. | |
Re: Mehrere Controls auf Form Markieren und Verschieben | | | Autor: TimZwingmann | Datum: 28.11.17 13:26 |
| Vielen Dank!
Das ist genau dass was ich brauche! | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|