Zum Inhalt springen

[C#] Problem bei Neupositionierung eines Controls


Goulasz

Empfohlene Beiträge

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               

            }

        }

post-63994-14430448712821_thumb.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...