HOW TO :从资源管理器中拖放文件到控件
当然,这里所谓的文件是指完整的文件名称,至于文件的内容,须按实际情况进一步的操作。
我这里的控件为一个 ListBox 。代码如下:
Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Load
Me .ListBox1.AllowDrop = True
End Sub
Private Sub ListBox1_DragEnter( ByVal sender As Object , ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragEnter
Dim o As Object = e.Data.GetData(DataFormats.FileDrop)
If Not o Is Nothing Then
e.Effect = DragDropEffects.Copy
End If
End Sub
Private Sub ListBox1_DragDrop( ByVal sender As Object , ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop
Dim FileNames As String () = CType (e.Data.GetData(DataFormats.FileDrop), String ())
Me .ListBox1.Items.AddRange(FileNames)
End Sub
重写这个 HOW TO ,主要的是看到有人用 API 实现,代码如下:
Private Const WM_DROPFILES As Integer = 563
Private Declare Function DragAcceptFiles Lib "shell32.dll" ( ByVal hwnd As IntPtr, ByVal accept As Boolean ) As Long
Private Declare Function DragQueryFile Lib "shell32.dll" ( ByVal hDrop As IntPtr, ByVal file As Integer , ByVal fileName As System.Text.StringBuilder, ByVal size As Int32) As Int32
Private Declare Sub DragFinish Lib "Shell32.dll" ( ByVal hDrop As IntPtr)
Protected Overrides Sub WndProc( ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_DROPFILES Then
Dim iNumOfFiles As Int32 = DragQueryFile(m.WParam, &HFFFFFFFF, Nothing , 0)
Dim iPnt As Int32
For iPnt = 0 To iNumOfFiles - 1
Dim sb As New System.Text.StringBuilder(256)
Dim iRet As Int32 = DragQueryFile(m.WParam, iPnt, sb, sb.Capacity)
ListBox1.Items.Add(sb.ToString)
Next
DragFinish(m.WParam)
Else
MyBase .WndProc(m)
End If
End Sub
Private Sub Form1_Load( ByVal sender As Object , ByVal e As System.EventArgs) Handles MyBase .Load
DragAcceptFiles(ListBox1.Handle, True )
End Sub