フォーム間のコントロールのドラッグ

16862 ワード

原作者:
LeoMaya
DoDragDropでできる
まず、DragDropObjectのClassをカプセル化
C# code

   
     

public class MovingObject
{
protected Control control;

public MovingObject(Control ctrl)
{
control
= ctrl;
}

public Control MovingControl
{
get { return control; }
}
}


もう1つのHelperクラスをカプセル化
C# code

   
     

public class User32
{
[DllImport(
" User32.dll " )]
public static extern int GetWindowRect(IntPtr handle, ref Rectangle rect);
}


OK、今勝手にForm 2をTest用のサブフォームとして書いて、リストボックスコントロールを1つだけ並べます.
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);
}
}


同様に、フォーム3のサブフォームを1つ書きます.Buttonコントロールは1つしかありません.
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を出して、Form 1と言います.Form 1の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();
}
}


どうですか.button 1とlistBox 1は2つのフォーム間で自由にドラッグできることを発見しましたか?