我放了两个panel 可以拖着一个label.不知道这样满足的了你的要求不.?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TestPanel
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
c = panel1;
}
Point pt;
//bool moves = true;
private void label1_MouseDown(object sender, MouseEventArgs e)
{
pt = Cursor.Position;
}
Control c = null;
private void label1_MouseMove(object sender, MouseEventArgs e)
{
int mx = 0;
int my = 0;
int px = 0;
int py = 0;
int x = 0;
int y = 0;
if (e.Button == MouseButtons.Left)
{
x = Cursor.Position.X - this.Location.X - 14;
y = Cursor.Position.Y - this.Location.Y - 32;
px = Cursor.Position.X - pt.X;
py = Cursor.Position.Y - pt.Y;
mx = label1.Location.X + px;
my = label1.Location.Y + py;
label1.Location = new Point(mx, my);
pt = Cursor.Position;
if (panel1.Bounds.Contains(x, y))
{
if (c.Equals(panel1)) return;
mx = label1.Location.X - panel1.Bounds.X;
my = label1.Location.Y - panel1.Bounds.Y;
label1.Location = new Point(mx, my);
c.Controls.Remove(label1);
panel1.Controls.Add(label1);
c = panel1;
}
else if (panel2.Bounds.Contains(x, y))
{
if (c.Equals(panel2)) return;
mx = label1.Location.X - panel2.Bounds.X;
my = label1.Location.Y - panel2.Bounds.Y;
label1.Location = new Point(mx, my);
c.Controls.Remove(label1);
panel2.Controls.Add(label1);
c = panel2;
}
else if (this.Bounds.Contains(x, y))
{
if (c.Equals(this)) return;
mx = label1.Location.X + c.Bounds.X;
my = label1.Location.Y + c.Bounds.Y;
label1.Location = new Point(mx, my);
c.Controls.Remove(label1);
this.Controls.Add(label1);
c = this;
}
}
}
private void label1_MouseUp(object sender, MouseEventArgs e)
{
//moves = true;
}
}
}
我试了一下……拖不动呀~你能把代码加上注释发到我邮箱windyk508@163.com吗?谢谢了
至少得告诉我x,y,mx,my,px,py都指的是什么,-14,-32什么的那段一定要告诉我,有点看不懂了
@巴索罗缪库玛:
x = Cursor.Position.X - this.Location.X - 14;//得到鼠标在窗口中对应的位置
y = Cursor.Position.Y - this.Location.Y - 32;//14和32是 窗口的左上角 与 窗口的可用区域 的 左上角 的两个坐标差 这个我没有找到具体的属性取到它,所以就写死了
px = Cursor.Position.X - pt.X;//取得鼠标相对移动的位置
py = Cursor.Position.Y - pt.Y;//pt是存储上次鼠标移动后的位置
mx = label1.Location.X + px;//把鼠标移动大小复给label,让label也移动鼠标移动的大小
my = label1.Location.Y + py;
label1.Location = new Point(mx, my);
pt = Cursor.Position;//重新存储鼠标位置
if (panel1.Bounds.Contains(x, y))//判断鼠标是否移动到了panel1中
{
if (c.Equals(panel1)) return;//如果移动到了panel1中,并且上次移动也是在panel1中那么不做处理
mx = label1.Location.X - panel1.Bounds.X;//下面这几句是当鼠标的位置切换容器时,把label1也切换控件,并且从新初始化label1的位置
my = label1.Location.Y - panel1.Bounds.Y;
label1.Location = new Point(mx, my);
c.Controls.Remove(label1);
panel1.Controls.Add(label1);
c = panel1;//从新记录容器
}
下面两个if和这个是做一样的处理,
@发粪图墙: 非常感谢你,确实是实现了,但是我接下来要做仿真动画,是不能用label的,只能是在panel中画一个矩形,然后可以用鼠标拖拽这个矩形,这回只有一个panel。如果能将这个问题帮我解决就更感谢啦~~
@巴索罗缪库玛: 我没做过画图的,不知道是什么情况,那东西应该也是根据坐标来做的吧。你把代码改改试试吧
@发粪图墙: 好吧,不过谢谢你了
学习了。。。