我想实现在界面上拖动控件的功能,在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;
}
}
{
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;
}
}
位移量的值每次移动完之后就设为0 了,而且,每次移动的的时候 offsetx,offsety的值都能正确取出来,但是没但运行完
pb.Location = new Point(pb.Location.X + offsetX, pb.Location.Y + offsetY);
后pb.laction的值就变成-3万多了 ...
你还有一个点应该注意到,就是当你在mousemove时,那个在panel的点的位置。
因为我扫了一眼你的代码,貌似没出现那个位置。
不仅仅是点相对于picturebox的坐标要注意,相对于panel的坐标也该注意
[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);
}
上代码吧,我这个是移动图片的,希望对你有帮助。 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对象
}
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);
}
}