フォーム間のコントロールのドラッグ
16862 ワード
原作者:
LeoMaya
DoDragDropでできる
まず、DragDropObjectのClassをカプセル化
C# code
もう1つのHelperクラスをカプセル化
C# code
OK、今勝手にForm 2をTest用のサブフォームとして書いて、リストボックスコントロールを1つだけ並べます.
C# code
同様に、フォーム3のサブフォームを1つ書きます.Buttonコントロールは1つしかありません.
C# code
はい、今からMainFormを出して、Form 1と言います.Form 1のIsmdiContainerをTrueにするのを覚えています.
C# code
どうですか.button 1とlistBox 1は2つのフォーム間で自由にドラッグできることを発見しましたか?
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つのフォーム間で自由にドラッグできることを発見しましたか?