WinForm支持拖拽效果

转载 2016年06月02日 10:17:17
有一个MSDN客户提问在WinForm中如何实现拖拽效果——比如在WinForm中有一个Button,我要实现的效果是拖拽这个Button到目标位置后生成一个该控件的副本。

其实这个操作主要分成三步走:

1)确定被拖拽的对象:

这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,

同时调用其DoDragDrop——该函数接受两个参数:

i)要拖动的数据。

ii)拖动的效果(该效果是2“目标位置”所能够接受的效果,是一个枚举值):

Button1.DoDragDrop(Button1, DragDropEffects.Copy || DragDropEffects.Move);
 //形成拖拽效果,移动+拷贝的组合效果

2)目标位置:这里是Form窗体自身。

为了使得和Windows资源管理器中实现的文件拖拽效果一样(即拖拽一个文件到目标位置的中途,鼠标出现“+”号的效果)。

那么应当处理DragEnter事件——即拖拽控件途中进入Form体内把效果设置成Copy的效果。

同时,为了使得Form自身支持接受拖拽传来的控件,必须设置其AllowDrag=True(接收的控件):

private void Form1_DragEnter(System.Object sender, System.Windows.Forms.DragEventArgs e)
{
//当Button被拖拽到WinForm上时候,鼠标效果出现
if ((e.Data.GetDataPresent(typeof(Button)))) {
e.Effect
= DragDropEffects.Copy;
}
}

另外,一旦松开鼠标,那么拖拽过程结束。此时应当处理DragDrop事件,复制一个按钮:

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;
}



================================================================

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;
}
}

C# winform 拖拽效果

步骤: 1、 通过DragEnter事件获得被拖入窗口的“信息”(可以是若干文件,一些文字等等),在DragDrop事件中对“信息”进行解析。 2、接受拖放控件的AllowDrop属性必须设置...
  • shuanger_
  • shuanger_
  • 2015年09月17日 16:57
  • 628

C# WinForm 实现文件的拖入和拖出(拖拽操作)

PS:最近在整理浏览器收藏夹中以前收藏的一些文章,把自己以前用到的或者感觉以后会用到的都转帖一下,勿拍砖。 本文通过五个步骤详细介绍C# WinForm 实现文件的拖入和拖出(拖拽操作),每个步骤都提...
  • u012543266
  • u012543266
  • 2014年03月22日 23:30
  • 7199

Winform支持拖拽效果

以下为转载内容:     有一个MSDN客户提问在WinForm中如何实现拖拽效果——比如在WinForm中有一个Button,我要实现的效果是拖拽这个Button到目标位置后生成一个该控件的副...
  • ziyaziya05
  • ziyaziya05
  • 2013年06月08日 15:18
  • 428

WinForm 实现鼠标拖动控件跟随效果(图文)

1. 运行初始窗口如下:   2. 拖动后效果如下:   3. 代码如下: public partial class Form1 : Form { /* ...
  • MYsce
  • MYsce
  • 2017年05月24日 00:12
  • 622

让你的Winform应用在运行时可自由拖放控件位置

有这样一个场景,有AB两个客户总对界面摆放有着不同的喜好,一个喜欢查询条件输入区(被放在一个groupbox中)在界面的上半部分,输入区在下半部分(被放在另一个groupbox中),另一个用户则正...
  • hejishan
  • hejishan
  • 2008年03月11日 11:34
  • 434

C# Winform 的淡入淡出效果 及 控件拖拽效果

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy...
  • huaming84
  • huaming84
  • 2010年05月06日 17:24
  • 1254

WinForm之控件拖动总结(原理篇)

WinForm之控件拖动总结(原理篇)     这几天在公司做项目涉及到了Winform的中涉及到控件项拖动的功能实现,比如TreeView中的项拖动添加到ListView中等。以前...
  • SunCherryDream
  • SunCherryDream
  • 2014年03月07日 11:59
  • 2948

如何实现拖曳功能

问题引入:设一个窗体的背景,把外边一个图片文件,拖曳到窗体上,窗体上可以显示图片内容。解决方案:把窗体上的Form.AllowDrop属性设为true在窗体的DragEnter事件中写入以下内容  p...
  • soniklee
  • soniklee
  • 2006年08月02日 11:39
  • 746

c# winform TreeView控件中实现拖拽的功能

    曾经做过一个Windows Form,需要在TreeView空间中实现拖拽的功能,首先我想介绍一下Windows Form中的TreeView控件:使用 Windows 窗体 TreeView...
  • mzoy
  • mzoy
  • 2007年08月27日 10:50
  • 8996

C#Winform 实现ListBox中项的拖拽

private void lstRead_MouseDown(object sender, MouseEventArgs e) { if (this.lstRe...
  • pp_fzp
  • pp_fzp
  • 2016年11月24日 14:02
  • 1447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinForm支持拖拽效果
举报原因:
原因补充:

(最多只允许输入30个字)