欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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方法。

下面给出完整代码:

【界面如下所示】

WinForm拖拽控件生成副本的解决方法

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