【转载】窗体之间的控件拖动
2008-05-06 12:49 Virus-BeautyCode 阅读(911) 评论(6) 编辑 收藏 举报
原作者:
LeoMaya
用DoDragDrop可以做到的
首先, 封装一个DragDropObject的Class
再封装一个Helper类
OK, 现在随便写一个Form2作为Test用的一个子窗体, 上面只摆一个ListBox控件
同样, 写一个Form3的子窗体, 上面只有一个Button控件
好, 现在再弄个MainForm出来, 就叫做Form1吧, 记得要把Form1的IsMdiContainer设为True哦~
怎么样? 发现button1和listBox1可以在两个窗体间自由的拖动没?
用DoDragDrop可以做到的
首先, 封装一个DragDropObject的Class
- C# code
public class MovingObject
{
protected Control control;
public MovingObject(Control ctrl)
{
control = ctrl;
}
public Control MovingControl
{
get { return control; }
}
}
再封装一个Helper类
- C# code
public class User32
{
[DllImport("User32.dll")]
public static extern int GetWindowRect(IntPtr handle, ref Rectangle rect);
}
OK, 现在随便写一个Form2作为Test用的一个子窗体, 上面只摆一个ListBox控件
- C# code
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
AllowDrop = true;
listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown);
DragEnter += new DragEventHandler(Form2_DragEnter);
DragDrop += new DragEventHandler(Form2_DragDrop);
}
void Form2_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(MovingObject)))
{
MovingObject movingObj = e.Data.GetData(typeof(MovingObject)) as MovingObject;
if (movingObj != null)
{
Rectangle rect = Rectangle.Empty;
User32.GetWindowRect(Handle, ref rect);
movingObj.MovingControl.Location = new Point(e.X - rect.Location.X - 6, e.Y - rect.Location.Y - 34);
Controls.Add(movingObj.MovingControl);
}
}
}
void Form2_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(MovingObject)))
e.Effect = DragDropEffects.Copy;
}
void listBox1_MouseDown(object sender, MouseEventArgs e)
{
DoDragDrop(new MovingObject(listBox1), DragDropEffects.Copy);
}
}
同样, 写一个Form3的子窗体, 上面只有一个Button控件
- C# code
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
AllowDrop = true;
button1.MouseDown += new MouseEventHandler(button1_MouseDown);
DragEnter += new DragEventHandler(Form3_DragEnter);
DragDrop += new DragEventHandler(Form3_DragDrop);
}
void Form3_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(MovingObject)))
{
MovingObject movingObj = e.Data.GetData(typeof(MovingObject)) as MovingObject;
if (movingObj != null)
{
Rectangle rect = Rectangle.Empty;
User32.GetWindowRect(Handle, ref rect);
movingObj.MovingControl.Location = new Point(e.X - rect.Location.X - 6, e.Y - rect.Location.Y - 34);
Controls.Add(movingObj.MovingControl);
}
}
}
void Form3_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(MovingObject)))
e.Effect = DragDropEffects.Copy;
}
void button1_MouseDown(object sender, MouseEventArgs e)
{
DoDragDrop(new MovingObject(button1), DragDropEffects.Copy);
}
}
好, 现在再弄个MainForm出来, 就叫做Form1吧, 记得要把Form1的IsMdiContainer设为True哦~
- C# code
public partial class Form1 : Form
{
private Form2 f2;
private Form3 f3;
public Form1()
{
InitializeComponent();
f2 = new Form2();
f3 = new Form3();
f2.MdiParent = this;
f3.MdiParent = this;
f2.Show();
f3.Show();
}
}
怎么样? 发现button1和listBox1可以在两个窗体间自由的拖动没?