Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[C#] Problem bei Neupositionierung eines Controls

Empfohlene Antworten

Veröffentlicht

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.