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

本文讲述了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
(0)

相关推荐

  • C#中WinForm控件的拖动和缩放的实现代码

    C# WinForm控件的拖动和缩放是个很有用的功能.实现起来其实很简单的,主要是设计控件的MouseDown.MouseLeave.MouseMove事件,下面的几个步骤将逐步实现C# WinForm控件的拖动和缩放的功能. 1.定义一个枚举类型,描述光标状态 private enum EnumMousePointPosition { MouseSizeNone = 0, //'无 MouseSizeRight = 1, //'拉伸右边框 MouseSizeLeft = 2, //'拉伸左边框

  • C# WinForm实现窗体上控件自由拖动功能示例

    本文实例讲述了C# WinForm实现窗体上控件自由拖动功能.分享给大家供大家参考,具体如下: 说明:首先在窗体上放一个PictrueBox控件,命名为pb1,拖动完整代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usin

  • WinForm实现移除控件某个事件的方法

    本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下.具体功能代码如下: 主要功能部分代码如下: /// <summary> /// 移除控件某个事件 /// </summary> /// <param name="control">控件</param> /// <param name="eventName">需要移除的控件名称eg:EventClick</param> p

  • WinForm自定义控件应用实例

    C#的WinForm有一些控件具备自绘的功能,这就意味着你可以对这些控件进行自绘,可以起到意想不到的视觉效果.本文所述的以下控件就是通过一些简单的控件转变过来的.具体示例如下: 1.横向选项卡重绘: 这里的"横向"对话框其实是通过一个TabControl进行"方向旋转".重绘控件项等操作进行实现的.步骤如下: ①.Alignment:用于控制选项卡的方向(设置为Left). ②.SizeMode:用于调整每个选项卡,默认是Normal(非自绘模式),此处应该设置为F

  • C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法

    本文实例讲述了C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法.分享给大家供大家参考,具体如下: winform 程序运行过程中,用户用鼠标拖动窗体大小时,如将窗体调整得极小,可能窗体上的控件就面目全非(或看不到了),用下面的代码可以设定窗口的最小尺寸,以防止这种情况 private void Form1_ResizeEnd(object sender, EventArgs e) { //this.Text = "2width:" + this.Width.ToStrin

  • WinForm实现的图片拖拽与缩放功能示例

    本文实例讲述了WinForm实现的图片拖拽与缩放功能.分享给大家供大家参考,具体如下: 最近做项目的时候遇到上传施工平面布置图,查看,因为图片比较大,一般的显示器分辨率无法显示全,然后还需要放大看清楚图片里面的文字内容,所以需要用到图片的拖拽与缩放功能.这里整理下具体操作. 首先新建一个窗体,拖一个panel控件到窗体中,然后在拖一个pictureobx控件到panel中,然后在添加个上传图片的按钮: 具体代码: using System; using System.Collections.Ge

  • C#的winform控件命名规范

    本文详细讲述了C#的winform控件命名规范.分享给大家供大家参考.具体如下: 注:这里用红字标记的部分表示有重复出现,括号内为替代表示方案 1.标准控件 序号 控件类型简写 控件类型 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 llb LinkLabel 8 lst ListBox 9 lvw ListView 10 mtx MaskedT

  • winform实现拖动文件到窗体上的方法

    本文实例讲述了winform实现拖动文件到窗体上的方法.分享给大家供大家参考.具体如下: private void Form5_Load(object sender, EventArgs e) { this.AllowDrop=true; } private void Form5_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files

  • C# Winform 让整个窗口都可以拖动

    今天在网上查一些资料的时候, 无意中发现另一种办法, 非常方便, 调用系统的 API 来实现的, 效果也很好. 赶紧收藏了~ 复制代码 代码如下: [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int

  • WinForm子窗体访问父窗体控件的实现方法

    Form1主窗体: 复制代码 代码如下: public delegate void SetVisiableHandler();//定义委托类型 private void button1_Click(object sender,EventArgs e)//单击事件,打开子窗体{    Form2 frm = new Form2(new SetVisiableHandler(SetVisiable));    frm.Show();} private void SetVisiable(){    d

随机推荐