php可以拖控件吗,C#_WinForm拖拽控件生成副本的解决方法,本文讲述了WinForm中实现拖拽效 - phpStudy...

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相关阅读:

Win7免费升级到win10系统操作步骤图文教程

thinkphp模板的包含与渲染实例分析

想安装win10最新预览版 固态硬盘内存不够用该怎么办?

Linux系统下设置静态IP或自动获取动态IP的简单方法

MySQL数据库优化技术之配置技巧总结

Win10/Win8.1自动维护功能怎么快速开启和关闭?

浏览器兼容性问题大汇总

WinXP下如何将HTML文档设置为屏保让其更个性

总结IOS中隐藏软键盘的三种方式

win10 10074预览版开始菜单打不开怎么办?

Mac系统检测是否受到Shellshock攻击的技巧

win7权限如何设置最高管理员权限呢?

JS常见问题之为什么点击弹出的i总是最后一个

C语言实现排序算法之归并排序详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值