有一个主窗体FORM,下面有两个多文档子窗体,怎么用C#实现相互之间控件的拖动啊?

解决方案 »

  1.   

    就是要这种作假的效果,看似是拖了一个窗体的控件,其实是在另一个窗体中new了一个同样的控件,可是这个怎么实现啊?就是mousedown的是Form1的控件,通过mousemove到另一个窗体Form2,form1的控件不变,然后在Form2里mouseup的时候new一个同样的控件,这个怎么实现啊?哪位大侠能告诉我啊,谢谢啦
      

  2.   

    既然有主窗体,子控件应该只是Parent属性的不同吧!
    :-) 猜的!!
      

  3.   

    用DoDragDrop可以做到的首先, 封装一个DragDropObject的Class public class MovingObject
    {
    protected Control control; public MovingObject(Control ctrl)
    {
    control = ctrl;
    } public Control MovingControl
    {
    get { return control; }
    }
    }
    再封装一个Helper类 public class User32
    {
    [DllImport("User32.dll")]
    public static extern int GetWindowRect(IntPtr handle, ref Rectangle rect);
    }
    OK, 现在随便写一个Form2作为Test用的一个子窗体, 上面只摆一个ListBox控件    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控件 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哦~    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可以在两个窗体间自由的拖动没?