HOW TO:从资源管理器中拖放文件到控件

当然,这里所谓的文件是指完整的文件名称,至于文件的内容,须按实际情况进一步的操作。

我这里的控件为一个ListBox。代码如下:

Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.ListBox1.AllowDrop = True
    End Sub

    Private Sub ListBox1_DragEnter(ByVal sender As System.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 System.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
End Class

重写这个HOW TO,主要的是看到有人用API实现,代码如下:

VB.NET:
Public Class Form1
    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
End Class

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        const int WM_DropFILES = 563;

        [DllImport("shell32.dll")]
        private static extern long DragAcceptFiles(IntPtr hwnd, bool accept);
        [DllImport("shell32.dll")]
        private static extern int DragQueryFile(IntPtr hDrop, int file, StringBuilder fileName, int size);
        [DllImport("shell32.dll")]
        private static extern void DragFinish(IntPtr hDrop);

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_DropFILES)
            {
                int iNumOfFiles = DragQueryFile(m.WParam, -1, null, 0);
                int iPnt;
                for (iPnt = 0; iPnt < iNumOfFiles; iPnt++)
                {
                    StringBuilder sb = new StringBuilder(256);
                    int iRet = DragQueryFile(m.WParam, iPnt, sb, sb.Capacity);
                    listBox1.Items.Add(sb.ToString());
                }
                DragFinish(m.WParam);
            }
            else
            {
                base.WndProc(ref m);
            }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DragAcceptFiles(listBox1.Handle, true);
        }
    }
}


上一篇: [C#]当函数重载碰上params
下一篇: 面向对象和Windows编程
文章来自: 水如烟
引用通告: 查看所有引用 | 我要引用此文章
Tags:
最新日志:
评论: 0 | 引用: 0 | 查看次数: 3971
发表评论
登录后再发表评论!