C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

作者:leslie_xin 时间:2021-06-09 14:09:24 

一、前言

拖拽(Drag&Drop),属于是极其常用的基础功能。
无论是在系统上、应用上、还是在网页上,拖拽随处可见。同时拖拽时的鼠标效果也很漂亮,像这样:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

这样:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

还有这样:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

等等等等。
这些拖拽时的鼠标效果,直观又美观。
然后,在我们写程序时,程序确实是支持了拖拽,但是效果却是这样的:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

很是朴实无华。
而在某些时候,我们的程序也需要比较个性化的拖拽效果。
所以,我们就通过这一系列文章,来一步一步实现自己的个性化拖拽效果,同时,也会去仿一些经典的拖拽效果。

相信看完的你,一定会有所收获!

本文地址:https://www.jb51.net/article/243532.htm

二、基本原理

(一)基本事件方法

与拖拽相关的事件和方法,一共有7个:

1,DragDrop:在完成拖放操作时发生。
2,DragEnter:在将对象拖入控件的边界时发生。
3,DragLeave:在将对象拖出控件的边界时发生。
4,DragOver:在将对象拖到控件的边界上发生。
5,DoDragDrop:开始拖放操作。
6,GiveFeedback:在执行拖动操作期间发生。
7,QueryContinueDrag:在拖放操作期间发生,并且允许拖动源确定是否应取消拖放操作。

其中:

作用于拖拽发起方的是:

1,DoDragDrop
2,GiveFeedback
3,QueryContinueDrag

作用于拖拽接收方的是:

1,DragDrop
2,DragEnter
3,DragLeave
4,DragOver

(二)拖拽时上事件方法作用流程

上述7个事件的和方法的作用时机和流程如下,摘自MSDN:
(这里不得不说,之前的离线版的MSDN是真好用,主要是翻译的到位。现在的在线微软Docs,大多都是机翻,差太多了。)

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

简单的拖拽演示

在这里,简单写一个演示程序,演示下上述各方法和事件具体的调用和实现。
演示程序的效果,就是拖动标签(Label)到另一个标签(Label)上,根据是否按着Shift、Ctrl等键,实现不同的效果。

1,设计界面

界面的设计如下,分别实现图中对应的事件和属性。

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

2,拖拽发起方

对于拖拽的发起方,要实现的便是:在鼠标点击后,按着左键移动鼠标到目标位置,并根据是否按着Shift、Ctrl等键,实现不同的效果。
所以,涉及到的事件有:MouseDown、MouseMove、MouseUp。
代码如下:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

3,拖拽接收方

对于拖拽接收方,既然需要接收拖拽其上的数据,那么就需要将属性 AllowDrop 设置为 true,表示允许接收拖拽。
同时,还要实现DragEnter、DragDrop、DragDrop等事件,以在鼠标拖动数据到控件上后,根据按钮状态,设置不同的效果,并对拖动的数据,进行进一步处理。
代码如下:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

4,实际演示

运行程序,效果如下:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

三、自定义拖拽时鼠标效果

在这里,我们来实现一个简单的自定义拖拽效果:
拖动图片到另一个控件上,在拖拽时,鼠标变为图片;同时,如果控件不允许接收图片,则图片变为半透明;如果允许接收图片,则图片变为不透明。
下面我们来看一下如何去实现这种效果。

(一)实现原理

通过上面的MSDN,我们知道,在GiveFeedback,可以进一步的判断拖放状态效果,进而进行一定的处理。
而我们上面的效果,就要在GiveFeedback中去操作。
操作方式也很简单,就是根据不同的拖放效果,改变不同的鼠标即可,当然这里的鼠标是我们根据图片实时生成的。

(二)开始实现

1,界面设计

界面的设计如下,分别实现图中对应的事件和属性。
这里需要注意下,我们为窗体(Form)也设置了 AllowDrop=true,这是为了使拖动时划过非目标控件时,也能响应变化。

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

2,拖拽发起方

此处和上文的实现原理是一样的,涉及到的事件有:MouseDown、MouseMove、MouseUp。
代码如下:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

3,拖拽接收方

此处和上文的实现原理是一样的,要实现DragEnter、DragDrop、DragDrop等事件。
代码如下:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

4,GiveFeedback实现鼠标样式切换

GiveFeedback,就是用来实现不同的拖拽效果的地方。
因为涉及到图片的透明度处理,以及尺寸的调整,所以我们首先写个方法去处理下图片。

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

接着,在GiveFeedback中,针对不同的拖放状态,设置不同的鼠标。

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

4,实际演示

运行程序,效果如下:

C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

四、源码下载

本篇文章演示程序的完整源代码下载:

http://xiazai.jb51.net/202204/yuanma/DragDropDemo_jb51.rar

五、总结

说实话,在拖拽时实现拖拽效果并不难,而且MSDN上自带的例子也涉及到了鼠标的切换,稍微转换下思路,就可以实现多种多样的拖拽效果。
不过话说回来,这种拖拽效果的实现逻辑和教程,反而很难在网上搜到,真是奇怪。
在系列后续,会去实现一些个性化的拖拽效果,以及去仿一些经典拖拽效果,如:Win10/Win11中开始菜单的拖拽效果,网页中的拖拽效果等等。还会分享下在实现这些效果时,所遇到的问题,以及解决经验。

来源:https://www.cnblogs.com/lesliexin/p/16073879.html

标签:C#,自定义,鼠标,拖拽
0
投稿

猜你喜欢

  • C#使用Resources资源文件

    2023-07-04 08:42:48
  • C#基于QRCode实现动态生成自定义二维码图片功能示例

    2023-04-03 04:08:43
  • JAVA如何调用Shell脚本

    2022-11-25 01:13:13
  • Java异常处理中的一些特殊情况举例

    2021-10-11 20:31:54
  • java 自动生成略缩图示例代码

    2021-11-11 01:27:37
  • Java封装公共Result结果返回类的实现

    2023-06-17 08:47:47
  • 浅析如何截获C#程序产生的日志

    2023-06-24 12:24:50
  • 为什么Java项目中别用!=null做判空

    2023-12-19 20:26:13
  • 浅谈Android开发中项目的文件结构及规范化部署建议

    2022-05-13 12:47:37
  • 一文搞懂Java MD5算法的原理及实现

    2023-01-04 21:10:24
  • 详解java中float与double的区别

    2021-09-12 11:04:47
  • redis与ssm整合方法(mybatis二级缓存)

    2022-02-27 22:14:27
  • Javassist用法详解

    2023-06-26 17:11:54
  • Java实战之基于swing的QQ邮件收发功能实现

    2023-11-15 01:34:26
  • C#中的委托和事件

    2023-11-27 12:33:34
  • Java 抽象类特点总结

    2023-07-28 10:39:46
  • 详解从零开始---用C#制作扫雷游戏

    2022-06-14 13:33:12
  • Java中static变量作用和用法详解

    2021-11-09 12:01:04
  • .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用

    2021-08-08 23:56:44
  • 基于springboot i18n国际化后台多种语言设置的方式

    2022-03-28 16:02:56
  • asp之家 软件编程 m.aspxhome.com