代码改变世界

【转载】窗体之间的控件拖动

2008-05-06 12:49  Virus-BeautyCode  阅读(911)  评论(6编辑  收藏  举报
原作者: LeoMaya

用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可以在两个窗体间自由的拖动没?