【转载】窗体之间的控件拖动
2008-05-06 12:49 Virus-BeautyCode 阅读(912) 评论(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可以在两个窗体间自由的拖动没?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构