Przemieszczanie kontrolek przez użytkownika

0

otóż mam taki problem gdyż mam pictureBoxa z tłem białym (imituje mi kartke a4) teraz tworze dynamicznie labele picture boxy i układam na nim... Mam oprogramowane przemieszczanie tych elementów lecz gdy robie przemieszczenie to strzasznie migają (pomimą DoubleBuffered na formie) i pojawiają się tak jakby 2 kontrolki te same (po przestaniu przesuwania znika jedna)

Oto kod

 private Point Pnl_Srodek(int Width,int Height)
        {
            int pnl_wysokosc = pb_roboczy.Height;
            int pnl_szerokosc = pb_roboczy.Width;
            Point pnl_srodek = new Point((pnl_szerokosc-Width) / 2, (pnl_wysokosc-Height) / 2);
            return pnl_srodek;            
        }

       
        private void btn_pole_tekstowe_Click(object sender, EventArgs e)
        {   
            Label label = new Label();            
            label.MouseDown += new MouseEventHandler(label_MouseDown);
            label.MouseUp += new MouseEventHandler(label_MouseUp);
            label.MouseMove += new MouseEventHandler(label_MouseMove);
            label.MouseDoubleClick += new MouseEventHandler(label_MouseDoubleClick);
            label.AutoSize = true;
            label.Name = "etykieta_" + Licznik_labeli.ToString();
            label.Text = "Przykładowy tekst";
            label.Location = Pnl_Srodek(label.Width, label.Height);
            Licznik_labeli++;
            pb_roboczy.Controls.Add(label);
        }

        void label_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Control ctrl = (Control)sender;
            if (ctrl is Label)
            {
                Licznik_labeli--;
            }
            else if (ctrl is PictureBox)
            {
                Licznik_Picture_Box--;
            }
            ctrl.Dispose();
        }

        private Point ostatni = Point.Empty;
        private Point aktualnie = Point.Empty;
        private void label_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {                
                pb_roboczy.Invalidate(true);
                pb_roboczy.Update();
                Control ctrl = (Control)sender;
                aktualnie.X = e.X - ostatni.X;                
                aktualnie.Y = e.Y-ostatni.Y;
                if (aktualnie.X < 5)
                    aktualnie.X = 5;
                if (aktualnie.Y < 5)
                    aktualnie.Y = 5;
                if (aktualnie.X > pb_roboczy.Width - ctrl.Width - 5)
                    aktualnie.X = pb_roboczy.Width - ctrl.Width - 5;
                if (aktualnie.Y > pb_roboczy.Height - ctrl.Width - 5)
                    aktualnie.Y = pb_roboczy.Height - ctrl.Height - 5;
                ctrl.Location = aktualnie;
                ctrl.Invalidate();
                
                pb_roboczy.Invalidate(true);
                ctrl.Update();
            }
        }

        private void label_MouseUp(object sender, MouseEventArgs e)
        {            
            Control ctrl = (Control)sender;
            ctrl.Font = new Font("Microsoft Sans Serif",9);
            ctrl.ForeColor = Color.Black;
            ostatni = Point.Empty;
            aktualnie = Point.Empty;
        }

        private void label_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Control ctrl = (Control)sender; 
                ctrl.Font = new Font("Arial", 10, FontStyle.Bold);
                ctrl.ForeColor = Color.FromArgb(60, 236, 40);
                ostatni.X = e.X;
                ostatni.Y = e.Y;
                ctrl.Invalidate();
                ctrl.Update();
                
            }
        }

Proszę o pilną pomoc

0

no u mnie dziala taki kod (po co w mouse move masz update i invalidaterect ? rysujesz cos wiecej na pictureboxie niz biale tlo ??)

private bool zlapana = false;//czy zlapana

        private void label1_MouseUp(object sender, MouseEventArgs e)
        {
            if (zlapana)
            {
                zlapana = false;
                label1.Capture = false;
            }
        }

        private void label1_MouseMove(object sender, MouseEventArgs e)
        {
            if (zlapana)
            {
                //przeliczamy wspolrzedne
                //najpierw z labela na wspolrzedne globalne
                //potem ze wspolrzednych globalnych do formularza 
                label1.Location = PointToClient(label1.PointToScreen(new Point(e.X, e.Y)));                                                                
            }
        }

        private void label1_MouseDown(object sender, MouseEventArgs e)
        {
            //lapiemy lewym
            if (e.Button == MouseButtons.Left)
            {
//to jakby ktos raptownie pociagnal mysza poza formularz i.e. caly czas mamy mysz dla label
                label1.Capture = true;
                zlapana = true;
            }
        }
0

już sobie poradziłem z tym i mam jeszcze prościej )

0

teraz potrzebuje to przepisać z VB na C# i nie wiem jak

Select Case True
                Case e.X <= (mWidth * 4) And _
            e.Y <= (mWidth * 4) 'top left corner
                    c.Cursor = Cursors.SizeAll
                    mEdge = EdgeEnum.TopLeft
                Case e.X <= mWidth 'left edge
                    c.Cursor = Cursors.VSplit
                    mEdge = EdgeEnum.Left
                Case e.X > c.Width - (mWidth + 1) 'right edge
                    c.Cursor = Cursors.VSplit
                    mEdge = EdgeEnum.Right
                Case e.Y <= mWidth 'top edge
                    c.Cursor = Cursors.HSplit
                    mEdge = EdgeEnum.Top
                Case e.Y > c.Height - (mWidth + 1) 'bottom edge
                    c.Cursor = Cursors.HSplit
                    mEdge = EdgeEnum.Bottom
                Case Else 'no edge
                    c.Cursor = Cursors.Default
                    mEdge = EdgeEnum.None
            End Select

Chodzi o pierwszą linie i to felerne true

1 użytkowników online, w tym zalogowanych: 0, gości: 1