我想实现在界面上拖动控件的功能,在panel中添加了一个picturebox控件,给它注册了mousedown ,mousemove , mouseup事件 , 当在picturebox上按下鼠标时,将picturebox的可移动Flag设为true 同时记录下激发鼠标事件时的鼠标坐标,当移动鼠标时,计算出鼠标的位移量, 让后把picturebox的坐标加上位移量来实现控件移动,现在问题出来了,当改控件第一次激活移动事件的时候,控件能正常移动,第二次移动的时候控件出现了晃动 , 但三次的时候 ,控件就完全找不到位置了, 我此时现在的picturebox.location 的值是 就离谱的要是,全是-3W多....问题出在哪 ,求解,或者谁又更好的方法实现 ...  void pb_MouseDown(object sender, MouseEventArgs e)
        {
            PictureBox pb = sender as PictureBox;
            mouseStartX = e.Location.X;
            mouseStartY = e.Location.Y;
            moveSet = true;
            hsPb.Add("movecontrol", pb);
            pb.MouseMove += new MouseEventHandler(pb_MouseMove);
        }        void pb_MouseMove(object sender, MouseEventArgs e)
        {
            if (moveSet)
            {
                //MessageBox.Show(e.Delta.ToString());
                mouseCurX = e.Location.X;
                mouseCurY = e.Location.Y;
                offsetX = mouseCurX - mouseStartX;
                offsetY = mouseCurY - mouseStartY;                PictureBox pb = hsPb["movecontrol"] as PictureBox;
               
               //Point offset = new Point(offsetX, offsetY);
                pb.Location = new Point(pb.Location.X + offsetX, pb.Location.Y + offsetY);
                
                // panel1.Controls.Add(pb);
                label7.Text = offsetX.ToString();
                label8.Text = offsetY.ToString();
                label6.Text = offset.ToString();
                //label1.Text = value.ToString();
                label2.Text = mouseStartX.ToString();
                label3.Text = mouseStartY.ToString();
                label4.Text = mouseCurX.ToString();
                label5.Text = mouseCurY.ToString();
                pb.MouseUp += new MouseEventHandler(pb_MouseUp);
            }        void pb_MouseUp(object sender, MouseEventArgs e)
        {
            if (hsPb["movecontrol"] != null)
            {
                PictureBox ob = hsPb["movecontrol"] as PictureBox;
                //ob.Location = e.Location;
                moveSet = false;
                hsPb.Remove("movecontrol");
                mouseStartX = 0;
                mouseStartY = 0;
                mouseCurX = 0;
                mouseCurY = 0;
                //                 label2.Text = mouseStartX.ToString();
                //                 label3.Text = mouseStartY.ToString();
                //                 label4.Text = mouseCurX.ToString();
                //                 label5.Text = mouseCurY.ToString();            }
            else
                return;
        }
        }

解决方案 »

  1.   


    位移量的值每次移动完之后就设为0 了,而且,每次移动的的时候 offsetx,offsety的值都能正确取出来,但是没但运行完         
       pb.Location = new Point(pb.Location.X + offsetX, pb.Location.Y + offsetY);
    后pb.laction的值就变成-3万多了  ...
      

  2.   

    这个问题我以前做过,不难,但挺有意思的。
    你还有一个点应该注意到,就是当你在mousemove时,那个在panel的点的位置。
    因为我扫了一眼你的代码,貌似没出现那个位置。
    不仅仅是点相对于picturebox的坐标要注意,相对于panel的坐标也该注意
      

  3.   

    改种方式吧,
            [DllImport("user32.dll")]
            private static extern int SendMessage(IntPtr hwnd, uint wMsg, uint wParam, uint lParam);
            [DllImport("user32.dll")]
            private static extern int ReleaseCapture();        private void pb_MouseDown(object sender, MouseEventArgs e)
            {
                ReleaseCapture();
                SendMessage((sender as Control).Handle, 0x0112, 0xF010 + 0x0002, 0);
            }
      

  4.   

    pb.Location = new Point(pb.Location.X + offsetX, pb.Location.Y + offsetY);看下这句是不是有问题,你移动鼠标的时候,可能会多次触发移动事件,从而多次调用pb_MouseMove,使得位置坐标不断增大。
      

  5.   

    你是想移动PictureBox,还是移动里面的图片???
    上代码吧,我这个是移动图片的,希望对你有帮助。        int a, b, c, d;        bool is_move = false;
            
            Point p = new Point(0,0);        private void pic_MouseDown(object sender, MouseEventArgs e)
            {       
            pic.Cursor = System.Windows.Forms.Cursors.SizeAll;         a = e.X - p.X;         b = e.Y - p.Y;         is_move = true;
            }        private void pic_MouseUp(object sender, MouseEventArgs e)
            {
                is_move = false;
                pic.Cursor = System.Windows.Forms.Cursors.Hand;
            }        private void pic_MouseMove(object sender, MouseEventArgs e)
            {
                if (is_move)
                {
                    c = e.Location.X - a;                d = e.Location.Y - b;                p.X = c;
                    
                    p.Y = d;                this.pic.Refresh();
                }
            }
            private void pic_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawImage(img, p); // img为Bitmap对象
            }       
      

  6.   


            bool move = false;
            Point old;
            private void main_MouseDown(object sender, MouseEventArgs e)
            {
                move = true;
                old = new Point(e.X, e.Y);
            }
            private void main_MouseUp(object sender, MouseEventArgs e)
            {
                move = false;
            }        private void main_MouseMove(object sender, MouseEventArgs e)
            {
                if (move)
                {
                    this.Location = new Point(e.X - old.X + this.Location.X, e.Y - old.Y + this.Location.Y);
                }
            }