首页 > 编程 > C# > 正文

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

2020-01-24 02:35:48
字体:
来源:转载
供稿:网友

本文讲述了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 SubEnd Class
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表