Goulasz Geschrieben 8. Juni 2010 Teilen Geschrieben 8. Juni 2010 Hallo liebe Leser , ich habe ein kleines Problem bei der manuellen Neupositionierung einer PictureBox(Control ist eigentlich völlig egal). Man stelle sich das ganze wie eine Videoschnitt-Anwendung mit Drag&Drop und mehreren Spuren vor. In der Anwendung verschiebe ich ein Steuerelement manuell auf einer Spur. Wenn es in den Bereich um 10px der äußeren Kanten eines anderen Steuerelementes kommt(auf der gleichen oder einer anderen Spur), soll es auf den Pixel genau an das Steuerelement andocken. Das Andocken funktioniert soweit auch, nur "flimmert" das Steuerelement zwischen der aktuellen Mauskoordinate und der "zu dockenden" Koordinate hin und her. MouseUp aufrufen kommt übrigens nicht in Frage. Jetzt suche ich nach einer Möglichkeit, die Position innerhalb dieses Minimalabstandes erst dann zu verändern, wenn die Maus von der angedockten Position um mindestens 10px in eine Richtung bewegt wurde; bin da allerdings noch nicht großartig weitergekommen. Das heißt die Maus soll sich innerhalb der 10px um ein Control bewegen, das angehängte Steuerelement jedoch erst außerhalb. Ich würde mich über Hinweise und/oder andere Beispiele freuen. Gruß, Patrick Anbei Quellcode und Screenshot. private void pictureBox2_MouseMove(object sender, MouseEventArgs e) //Methode für Bewegen der Maus auf der pictureBox2 { PictureBox PictureBox_Aktuell = (PictureBox)sender; //PictureBox_Aktuell ist die momentan behandelte PictureBox Label_Infolabel.Text = _IntSicherungX.ToString(); if (e.Button == MouseButtons.Left) //Wenn die linke Maustaste gedrückt ist { PictureBox_Aktuell.Left = e.X + PictureBox_Aktuell.Left - _Int_ClickOffsetX; //Abstand der aktuellen Box zum linken Rand beträgt: Aktuelle Mauskoordinate - Aktuellen Abstand nach links - Versatzkoordinate der Maus int KantenPosition = PictureBox_Aktuell.Left; //KantenPosition entspricht dem Abstand der linken Kante der aktuellen PictureBox zum übergeordneten Container if (Control.ModifierKeys == Keys.Control) //Wenn die Strg-Taste während des Ziehvorgangs gedrückt wird... { KantenPosition = PictureBox_Aktuell.Right; //...ist KantenPosition der Abstand der rechten Kante der aktuellen PictureBox zum übergeordneten Container } if ((Control.ModifierKeys == Keys.Shift) == false) //Wenn die Shift-Taste nicht gedrückt ist { for (int i = 0; i < _ListSnappoints.Count; i++) { //Durchlaufe die Liste der Anschnapp-Punkte ListBox_Koordinaten.Items.Clear(); ListBox_Koordinaten.Items.Insert(0, "P1: Left " + Math.Abs(KantenPosition - _ListSnappoints[0]).ToString()); ListBox_Koordinaten.Items.Insert(1, "P1: Right " + Math.Abs(KantenPosition - _ListSnappoints[1]).ToString()); ListBox_Koordinaten.Items.Insert(2, "P2: Left " + Math.Abs(KantenPosition - _ListSnappoints[2]).ToString()); ListBox_Koordinaten.Items.Insert(3, "P2: Right " + Math.Abs(KantenPosition - _ListSnappoints[3]).ToString()); //Anzeige des Abstands zu den jeweiligen Punkten der Schnappliste if (Math.Abs(KantenPosition - _ListSnappoints[i]) < _IntSnap_Abstand) //Wenn der Abstand zwischen der Kante des bewegten Objektes und einem möglichen Anschnapppunkt kleiner ist als der gewünschte //Minimalabstand zum Anschnappen(10px) { if ((Control.ModifierKeys == Keys.Control) == true) //Wenn die Strg-Taste gedrückt wird... { PictureBox_Aktuell.Left = _ListSnappoints[i] - PictureBox_Aktuell.Width; //...wird der Abstand der linken Kante der aktuell behandelten PictureBox zum linken Rand des Steuerelementes auf die //Entfernung "Momentaner Schnapppunkt - Breite der Box", also links der oberen Box, gesetzt if (_BoolAngedockt == false) { Point PT = PointToClient(Cursor.Position); _IntSicherungX = PT.X; _BoolAngedockt = true; Console.Beep(440, 1); } } else //Wenn die Strg-Taste nicht gedrückt wird... { PictureBox_Aktuell.Left = _ListSnappoints[i]; //...wird der Abstand der linken Kante der aktuell behandelten PictureBox zum linken Rand des Steuerelementes auf die //Entfernung "Momentaner Schnapppunkt", also rechts der oberen Box, gesetzt if (_BoolAngedockt == false) { Point PT = PointToClient(Cursor.Position); _IntSicherungX = PT.X; _BoolAngedockt = true; Console.Beep(440, 1); } } } } } Panel_ClipContainer.Refresh(); //ClipContainer neu zeichnen } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.