Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PictureBoxes - Gruppenweise verschieben

3 views
Skip to first unread message

Josef Morlo

unread,
Dec 17, 2011, 8:34:37 AM12/17/11
to
Hallo

Folgendes Problem:

Habe eine Gruppe von PictureBoxes, die in Packen (Gruppen von 1 x 1, 2 , 3
… oder 2 x 1, 2, 3 … ) auf einem Form angeordnet sind, über einen
Auswahlrahmen selektiert werden, in einer typisierten Liste verwaltet und
verschoben werden sollen. Dazu habe ich folgenden (Standard-)Code:

MouseMove:
For Each pb As PictureBox In mList ‘List(Of PictureBox)
pb.Left = pb.Left + e.X - mOffsetX
pb.Top = pb.Top + e.Y - mOffsetY
pb.BringToFront()
Next

Me.Refresh()

Das funktioniert auch sehr gut, mit dem Nachteil allerdings, dass die
Gruppe unter dem Formularrand verschwinden kann. Wie müsste eine Bedingung
lauten, die das verhindert?

Ich habs wie folgt probiert, zunächst für den Fall, dass eine Picturebox in
der Gruppe am linken Formularrand liegt. Die Gruppe sollte dann nur nach
rechts verschoben werden können.

Private mOnlyRight As Boolean

Sub HandleMouseMove( _
ByVal sender As Object, ByVal e As MouseEventArgs)
If mForm.MovingMode Then

For Each pb As PictureBox In mList
If pb.Location.X = 0 Then
mOnlyRight = True
End If
Next

If mOnlyRight AndAlso e.X >= mOffsetX Then

For Each pb As PictureBox In mList
pb.Left = pb.Left + e.X - mOffsetX
pb.BringToFront()
Next
End If
Me.Refresh()
End If
End Sub

Das funktioniert auch soweit, allerdings mit dem gravierenden Nachteil,
dass sie dann nicht mehr nach links verschoben werden kann, obwohl ja dann
durch die Verschiebung links wieder Platz vorhanden wäre. Wie müsste die
Bedingung umformuliert werden?

Wer hat eine Idee?

Danke und Gruß

Josef Morlo

Peter Fleischer

unread,
Dec 18, 2011, 1:57:35 PM12/18/11
to
Hi Josef,
hier mal eine kleine Demo, wie man das machen kann. Den Code einfach in den
Codeteil eines leeres Formulars kopieren:

Public Class Form11

Private Sub Form11_Load(sender As System.Object, e As System.EventArgs)
Handles MyBase.Load
Me.KeyPreview = True
Dim pb1 As New PictureBox
pb1.Image = Image.FromFile("C:\Users\Public\Pictures\Sample
Pictures\tulips.jpg")
Me.Controls.Add(pb1)
mList.Add(pb1)
Dim pb2 As New PictureBox With {.Left = 100, .Top = 100}
pb2.Image = Image.FromFile("C:\Users\Public\Pictures\Sample
Pictures\tulips.jpg")
Me.Controls.Add(pb2)
mList.Add(pb2)
End Sub

Private mList As New List(Of PictureBox)
Private mOffsetX As Integer = 0
Private mOffsetY As Integer = 0
Private sw As Boolean = False

Private Sub Form1_MouseDown(sender As Object, e As
System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
mOffsetX = e.X
mOffsetY = e.Y
sw = True
End Sub

Private Sub Form1_MouseMove(sender As Object, e As
System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If sw Then
Dim minX = Aggregate e1 In mList Into Min(e1.Left + e.X - mOffsetX)
Dim maxX = Aggregate e1 In mList Into Max(e1.Left + e1.Width + e.X -
mOffsetX)
Dim minY = Aggregate e1 In mList Into Min(e1.Top + e.Y - mOffsetY)
Dim maxY = Aggregate e1 In mList Into Max(e1.Top + e1.Height + e.Y -
mOffsetY)
If minX >= 0 And maxX <= Me.ClientSize.Width And minY >= 0 And maxY <=
Me.ClientSize.Height Then
For Each pb As PictureBox In mList 'List(Of PictureBox)
pb.Left = pb.Left + e.X - mOffsetX
pb.Top = pb.Top + e.Y - mOffsetY
pb.BringToFront()
Next
End If
mOffsetX = e.X
mOffsetY = e.Y
End If
End Sub

Private Sub Form1_MouseUp(sender As Object, e As
System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
sw = False
End Sub

End Class

--
Viele Gruesse
Peter

Josef Morlo

unread,
Dec 18, 2011, 5:40:42 PM12/18/11
to
Hallo Peter,

> hier mal eine kleine Demo, wie man das machen kann
[...]

Hallo Peter,

vielen Dank für das Beispiel. Macht genau das, was ich mir vorgestellt
habe :-)

Die Linq-Passagen werde ich mir noch etwas eingehender zu Gemüte führen
müssen. Ich werde dazu vermutlich noch die ein oder andere Rückfrage haben.

Einstweilen herzlichen Dank!

Josef Morlo

Peter Fleischer

unread,
Dec 18, 2011, 11:39:56 PM12/18/11
to
Hi Josef,
anstelle von kompaktem übersichtlichem LinQ kannst Du es auch traditionell
umständlich machen:

'Dim minX = Aggregate e1 In mList Into Min(e1.Left + e.X - mOffsetX)
'Dim maxX = Aggregate e1 In mList Into Max(e1.Left + e1.Width + e.X -
mOffsetX)
'Dim minY = Aggregate e1 In mList Into Min(e1.Top + e.Y - mOffsetY)
'Dim maxY = Aggregate e1 In mList Into Max(e1.Top + e1.Height + e.Y -
mOffsetY)
Dim minX As Integer = Integer.MaxValue
Dim maxX As Integer = Integer.MinValue
Dim minY As Integer = Integer.MaxValue
Dim maxY As Integer = Integer.MinValue
For Each pb As PictureBox In mList
If pb.Left + e.X - mOffsetX < minX Then minX = pb.Left + e.X - mOffsetX
If pb.Left + pb.Width + e.X - mOffsetX > maxX Then maxX = pb.Left +
pb.Width + e.X - mOffsetX
If pb.Top + e.Y - mOffsetY < minY Then minY = pb.Top + e.Y - mOffsetY
If pb.Top + pb.Height + e.Y - mOffsetY > maxY Then maxY = pb.Top +
pb.Height + e.Y - mOffsetY
Next

--
Viele Gruesse
Peter

Josef Morlo

unread,
Dec 19, 2011, 4:41:33 PM12/19/11
to
Peter Fleischer schrieb:

> anstelle von kompaktem übersichtlichem LinQ kannst Du es auch traditionell
> umständlich machen:
[...]

Überzeugt :-)

Herzlichen Dank und Gruß!

Josef Morlo
0 new messages