C#自定義鼠標(biāo)拖拽Drag&Drop效果之基本原理及基本實(shí)現(xiàn)代碼
一、前言
拖拽(Drag&Drop),屬于是極其常用的基礎(chǔ)功能。
無論是在系統(tǒng)上、應(yīng)用上、還是在網(wǎng)頁上,拖拽隨處可見。同時(shí)拖拽時(shí)的鼠標(biāo)效果也很漂亮,像這樣:
這樣:
還有這樣:
等等等等。
這些拖拽時(shí)的鼠標(biāo)效果,直觀又美觀。
然后,在我們寫程序時(shí),程序確實(shí)是支持了拖拽,但是效果卻是這樣的:
很是樸實(shí)無華。
而在某些時(shí)候,我們的程序也需要比較個(gè)性化的拖拽效果。
所以,我們就通過這一系列文章,來一步一步實(shí)現(xiàn)自己的個(gè)性化拖拽效果,同時(shí),也會(huì)去仿一些經(jīng)典的拖拽效果。
相信看完的你,一定會(huì)有所收獲!
本文地址:http://chabaoo.cn/article/243532.htm
二、基本原理
(一)基本事件方法
與拖拽相關(guān)的事件和方法,一共有7個(gè):
1,DragDrop:在完成拖放操作時(shí)發(fā)生。
2,DragEnter:在將對(duì)象拖入控件的邊界時(shí)發(fā)生。
3,DragLeave:在將對(duì)象拖出控件的邊界時(shí)發(fā)生。
4,DragOver:在將對(duì)象拖到控件的邊界上發(fā)生。
5,DoDragDrop:開始拖放操作。
6,GiveFeedback:在執(zhí)行拖動(dòng)操作期間發(fā)生。
7,QueryContinueDrag:在拖放操作期間發(fā)生,并且允許拖動(dòng)源確定是否應(yīng)取消拖放操作。
其中:
作用于拖拽發(fā)起方的是:
1,DoDragDrop
2,GiveFeedback
3,QueryContinueDrag
作用于拖拽接收方的是:
1,DragDrop
2,DragEnter
3,DragLeave
4,DragOver
(二)拖拽時(shí)上事件方法作用流程
上述7個(gè)事件的和方法的作用時(shí)機(jī)和流程如下,摘自MSDN:
(這里不得不說,之前的離線版的MSDN是真好用,主要是翻譯的到位?,F(xiàn)在的在線微軟Docs,大多都是機(jī)翻,差太多了。)
簡單的拖拽演示
在這里,簡單寫一個(gè)演示程序,演示下上述各方法和事件具體的調(diào)用和實(shí)現(xiàn)。
演示程序的效果,就是拖動(dòng)標(biāo)簽(Label)到另一個(gè)標(biāo)簽(Label)上,根據(jù)是否按著Shift、Ctrl等鍵,實(shí)現(xiàn)不同的效果。
1,設(shè)計(jì)界面
界面的設(shè)計(jì)如下,分別實(shí)現(xiàn)圖中對(duì)應(yīng)的事件和屬性。
2,拖拽發(fā)起方
對(duì)于拖拽的發(fā)起方,要實(shí)現(xiàn)的便是:在鼠標(biāo)點(diǎn)擊后,按著左鍵移動(dòng)鼠標(biāo)到目標(biāo)位置,并根據(jù)是否按著Shift、Ctrl等鍵,實(shí)現(xiàn)不同的效果。
所以,涉及到的事件有:MouseDown、MouseMove、MouseUp。
代碼如下:
3,拖拽接收方
對(duì)于拖拽接收方,既然需要接收拖拽其上的數(shù)據(jù),那么就需要將屬性 AllowDrop 設(shè)置為 true,表示允許接收拖拽。
同時(shí),還要實(shí)現(xiàn)DragEnter、DragDrop、DragDrop等事件,以在鼠標(biāo)拖動(dòng)數(shù)據(jù)到控件上后,根據(jù)按鈕狀態(tài),設(shè)置不同的效果,并對(duì)拖動(dòng)的數(shù)據(jù),進(jìn)行進(jìn)一步處理。
代碼如下:
4,實(shí)際演示
運(yùn)行程序,效果如下:
三、自定義拖拽時(shí)鼠標(biāo)效果
在這里,我們來實(shí)現(xiàn)一個(gè)簡單的自定義拖拽效果:
拖動(dòng)圖片到另一個(gè)控件上,在拖拽時(shí),鼠標(biāo)變?yōu)閳D片;同時(shí),如果控件不允許接收?qǐng)D片,則圖片變?yōu)榘胪该鳎蝗绻试S接收?qǐng)D片,則圖片變?yōu)椴煌该鳌?br />下面我們來看一下如何去實(shí)現(xiàn)這種效果。
(一)實(shí)現(xiàn)原理
通過上面的MSDN,我們知道,在GiveFeedback,可以進(jìn)一步的判斷拖放狀態(tài)效果,進(jìn)而進(jìn)行一定的處理。
而我們上面的效果,就要在GiveFeedback中去操作。
操作方式也很簡單,就是根據(jù)不同的拖放效果,改變不同的鼠標(biāo)即可,當(dāng)然這里的鼠標(biāo)是我們根據(jù)圖片實(shí)時(shí)生成的。
(二)開始實(shí)現(xiàn)
1,界面設(shè)計(jì)
界面的設(shè)計(jì)如下,分別實(shí)現(xiàn)圖中對(duì)應(yīng)的事件和屬性。
這里需要注意下,我們?yōu)榇绑w(Form)也設(shè)置了 AllowDrop=true,這是為了使拖動(dòng)時(shí)劃過非目標(biāo)控件時(shí),也能響應(yīng)變化。
2,拖拽發(fā)起方
此處和上文的實(shí)現(xiàn)原理是一樣的,涉及到的事件有:MouseDown、MouseMove、MouseUp。
代碼如下:
3,拖拽接收方
此處和上文的實(shí)現(xiàn)原理是一樣的,要實(shí)現(xiàn)DragEnter、DragDrop、DragDrop等事件。
代碼如下:
4,GiveFeedback實(shí)現(xiàn)鼠標(biāo)樣式切換
GiveFeedback,就是用來實(shí)現(xiàn)不同的拖拽效果的地方。
因?yàn)樯婕暗綀D片的透明度處理,以及尺寸的調(diào)整,所以我們首先寫個(gè)方法去處理下圖片。
接著,在GiveFeedback中,針對(duì)不同的拖放狀態(tài),設(shè)置不同的鼠標(biāo)。
4,實(shí)際演示
運(yùn)行程序,效果如下:
四、源碼下載
本篇文章演示程序的完整源代碼下載:
http://xiazai.jb51.net/202204/yuanma/DragDropDemo_jb51.rar
五、總結(jié)
說實(shí)話,在拖拽時(shí)實(shí)現(xiàn)拖拽效果并不難,而且MSDN上自帶的例子也涉及到了鼠標(biāo)的切換,稍微轉(zhuǎn)換下思路,就可以實(shí)現(xiàn)多種多樣的拖拽效果。
不過話說回來,這種拖拽效果的實(shí)現(xiàn)邏輯和教程,反而很難在網(wǎng)上搜到,真是奇怪。
在系列后續(xù),會(huì)去實(shí)現(xiàn)一些個(gè)性化的拖拽效果,以及去仿一些經(jīng)典拖拽效果,如:Win10/Win11中開始菜單的拖拽效果,網(wǎng)頁中的拖拽效果等等。還會(huì)分享下在實(shí)現(xiàn)這些效果時(shí),所遇到的問題,以及解決經(jīng)驗(yàn)。
到此這篇關(guān)于C#自定義鼠標(biāo)拖拽Drag&Drop效果之基本原理及基本實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)C#自定義鼠標(biāo)拖拽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#調(diào)用SQL語句時(shí)乘號(hào)的用法
這篇文章主要介紹了C#調(diào)用SQL語句時(shí)乘號(hào)的用法,可避免因符號(hào)引起的程序錯(cuò)誤,是C#程序設(shè)計(jì)人員有必要掌握的,需要的朋友可以參考下2014-08-08C# 實(shí)現(xiàn)特殊字符快速轉(zhuǎn)碼
這篇文章主要介紹了C# 實(shí)現(xiàn)特殊字符快速轉(zhuǎn)碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法
這篇文章主要介紹了winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法,以實(shí)例分析了C#中WinForm操作窗體及文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘一
本文一介紹了數(shù)據(jù)結(jié)構(gòu)的基本概念 而介紹了算法的基本概念,并且重點(diǎn)討論了算法時(shí)間復(fù)雜度,并且用程序予以證明2012-11-11C#byte數(shù)組與Image的相互轉(zhuǎn)換實(shí)例代碼
這篇文章主要介紹了C#byte數(shù)組與Image的相互轉(zhuǎn)換實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值
這篇文章主要介紹了C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-06-06C#使用RabbitMq隊(duì)列(Sample,Work,Fanout,Direct等模式的簡單使用)
這篇文章主要介紹了C#使用RabbitMq隊(duì)列(Sample,Work,Fanout,Direct等模式的簡單使用),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10