现在支持鼠标拖放的Windows应用程序随处可见,鼠标拖放功能也极大地方便了用户的操作,那么在我们的程序中添加上这么一个使用的功能是不是很难呢,其实很简单。下面我们就来看看如何实现鼠标拖放。
一个拖放的过程实际上是要经过如下步骤的:
1、拖(dragging)是通过调用源控件的DoDragDrop方法来初始化的,DoDragDrop有两个参数 data,指定将要传送的数据 allowedEffects,指定允许进行的操作(复制或移动)这样自动创建了一个新的Dataobject对象
2、接下来就依次激发了GiveFeedBack事件。在大多数情况下,我们并不需要关心GiveFeedBack事件。然而你如果想自定义拖放过程中的鼠标指针的话,你可以在这些地方加上你的代码。
3、任何有AllowDrop属性而且被设置成True的控件都是隐含的Drop对象。AllowDrop属性可以在设计时的属性窗口中进行设置,也可以在Form_load事件自动加载。
4、当鼠标移到某个控件时,就同时激发了这个控件的DragEnter事件。GetDataPresent方法是用来确认拖过来的数据是否适合目标控件,Effect属性是用来显示适当的鼠标指针。
5、如果用户在有效的目标控件上释放鼠标,就同时激发了DragDrop事件。DragDrop事件句柄中的代码从DataObject对象中释放数据并把它显示在目标控件中。
下面我们就一个从系统中拖放获得文件路径的例子来演示下如何完成拖放的设计。
1、首先把窗体的TopMost属性设置为True,然后在窗体中放置一个ListBox控件,并且把它的AllowDrop属性设置为True。
2、为ListBox1的DragEnter事件中添加代价代码以确认数据是所需要的:
Private Sub ListBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragEnter
'检查是否是Windows文件的放置格式。
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effect = DragDropEffects.All
'这里Effect属性被设置成DragDropEffects.All,并不会影响到源数据
End If
End Sub
3、释放鼠标,激发了DragDrop事件,然后从DataObject对象中获取我们需要的数据
Private Sub ListBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim MyFiles() As String
Dim i As Integer
MyFiles = e.Data.GetData(DataFormats.FileDrop)
'从私有剪贴板中获取文件的路径
For i = 0 To MyFiles.Length - 1
ListBox1.Items.Add(MyFiles(i))
Next
End If
End Sub
4、代码写完了,现在按F5运行,从硬盘上随便拖放一个或者多个选定的文件,效果如下:
本文作者: