WinForm拖拽控件生成副本的解决方法
程序员文章站
2024-02-19 09:10:28
本文讲述了winform中实现拖拽效果的功能,即在winform中有一个button,可以实现拖拽这个button到目标位置后生成一个该控件的副本的功能。具体操作步骤如下:...
本文讲述了winform中实现拖拽效果的功能,即在winform中有一个button,可以实现拖拽这个button到目标位置后生成一个该控件的副本的功能。具体操作步骤如下:
要实现该功能主要分成如下三步:
1)确定被拖拽的对象:这里是button(要使得button被单击之后可以拖拽,那么必须处理其mousedown事件,同时调用其dodragdrop——该函数接受两个参数:i)要拖动的数据。ii)拖动的效果(该效果是2“目标位置”所能够接受的效果,是一个枚举值):
c#代码如下:
button1.dodragdrop(button1, dragdropeffects.copy || dragdropeffects.move); //形成拖拽效果,移动+拷贝的组合效果
vb.net页面代码如下:
button1.dodragdrop(button1, dragdropeffects.copy or dragdropeffects.move) '形成拖拽效果,移动+拷贝的组合效果
2)目标位置:这里是form窗体自身。为了使得和windows资源管理器中实现的文件拖拽效果一样(即拖拽一个文件到目标位置的中途,鼠标出现“+”号的效果)。那么应当处理dragenter事件——即拖拽控件途中进入form体内把效果设置成copy的效果。
c#代码如下:
private void form1_dragenter(system.object sender, system.windows.forms.drageventargs e) { //当button被拖拽到winform上时候,鼠标效果出现 if ((e.data.getdatapresent(typeof(button)))) { e.effect = dragdropeffects.copy; } }
vb.net页面代码如下:
private sub form1_dragenter(sender as system.object, e as system.windows.forms.drageventargs) handles mybase.dragenter if (e.data.getdatapresent(gettype(button))) then '当button被拖拽到winform上时候,鼠标效果出现 e.effect = dragdropeffects.copy end if end sub
同时,为了使得form自身支持接受拖拽传来的控件,必须设置其allowdrag=true:
另外,一旦松开鼠标,那么拖拽过程结束。此时应当处理dragdrop事件,复制一个按钮:
c#代码如下:
private void form1_dragdrop(system.object sender, system.windows.forms.drageventargs e) { //拖放完毕之后,自动生成新控件 button btn = new button(); btn.size = button1.size; btn.location = this.pointtoclient(new point(e.x, e.y)); //用这个方法计算出客户端容器界面的x,y坐标。否则直接使用x,y是屏幕坐标 this.controls.add(btn); btn.text = "按钮" + count.tostring; count = count + 1; }
vb.net页面代码如下:
private sub form1_dragdrop(sender as system.object, e as system.windows.forms.drageventargs) handles mybase.dragdrop '拖放完毕之后,自动生成新控件 dim btn as new button btn.size = button1.size btn.location = me.pointtoclient(new point(e.x, e.y)) '用这个方法计算出客户端容器界面的x,y坐标。否则直接使用x,y是屏幕坐标 me.controls.add(btn) btn.text = "按钮" + count.tostring count = count + 1 end sub
这里需要注意点:location属性(指定控件放置位置的起始点)不能直接用e.x或e.y——因为这是屏幕坐标,要根据实际的控件界面坐标进行适度转换,最简单方法是——pointtoclient方法。
下面给出完整代码:
【界面如下所示】
c#代码如下:
using microsoft.visualbasic; using system; using system.collections; using system.collections.generic; using system.data; using system.diagnostics; public class form1 { //计数变量,说明输出了第n个button private int count = 1; private void form1_load(system.object sender, system.eventargs e) { this.allowdrop = true; //窗体自身支持接受拖拽来的控件 } private void button1_mousedown(system.object sender, system.windows.forms.mouseeventargs e) { //左键的话,标志位为true(表示拖拽开始) if ((e.button == system.windows.forms.mousebuttons.left)) { button1.dodragdrop(button1, dragdropeffects.copy | dragdropeffects.move); //形成拖拽效果,移动+拷贝的组合效果 } } private void form1_dragenter(system.object sender, system.windows.forms.drageventargs e) { //当button被拖拽到winform上时候,鼠标效果出现 if ((e.data.getdatapresent(typeof(button)))) { e.effect = dragdropeffects.copy; } } private void form1_dragdrop(system.object sender, system.windows.forms.drageventargs e) { //拖放完毕之后,自动生成新控件 button btn = new button(); btn.size = button1.size; btn.location = this.pointtoclient(new point(e.x, e.y)); //用这个方法计算出客户端容器界面的x,y坐标。否则直接使用x,y是屏幕坐标 this.controls.add(btn); btn.text = "按钮" + count.tostring(); count = count + 1; } public form1() { dragdrop += form1_dragdrop; dragenter += form1_dragenter; load += form1_load; } }
vb.net页面代码如下:
public class form1 '计数变量,说明输出了第n个button private count as integer = 1 private sub form1_load(sender as system.object, e as system.eventargs) handles mybase.load me.allowdrop = true '窗体自身支持接受拖拽来的控件 end sub private sub button1_mousedown(sender as system.object, e as system.windows.forms.mouseeventargs) handles button1.mousedown '左键的话,标志位为true(表示拖拽开始) if (e.button = windows.forms.mousebuttons.left) then button1.dodragdrop(button1, dragdropeffects.copy or dragdropeffects.move) '形成拖拽效果,移动+拷贝的组合效果 end if end sub private sub form1_dragenter(sender as system.object, e as system.windows.forms.drageventargs) handles mybase.dragenter if (e.data.getdatapresent(gettype(button))) then '当button被拖拽到winform上时候,鼠标效果出现 e.effect = dragdropeffects.copy end if end sub private sub form1_dragdrop(sender as system.object, e as system.windows.forms.drageventargs) handles mybase.dragdrop '拖放完毕之后,自动生成新控件 dim btn as new button btn.size = button1.size btn.location = me.pointtoclient(new point(e.x, e.y)) '用这个方法计算出客户端容器界面的x,y坐标。否则直接使用x,y是屏幕坐标 me.controls.add(btn) btn.text = "按钮" + count.tostring count = count + 1 end sub end class