本节主要学习利用三个与 DragDrop 有关的函数来完成从浏览窗口取得拖放过来的文件及详细路径。这三个函数是: DragAcceptFiles、DragQueryFile、DragFinish。
它们的函数原形如下:
VOID DragAcceptFiles( HWND hWnd, // 接受拖拽文件窗口的句柄 BOOL fAccept // 接受条件 true = 打开,false = 关闭 );
UINT DragQueryFile( HDROP hDrop, // 指向 DragDrop 结构的指针 UINT iFile, // 拖拽文件的索引 LPTSTR lpszFile, // 文件名字串缓冲 UINT cch // 文件名长度 );
VOID DragFinish( HDROP hDrop // 释放 DragDrop 的内存块 ); 从浏览窗口获取一个 DragDrop 文件的流程为:首先用 DragAcceptFiles 函数激活接受窗口的 DragFropAcceptance 属性,然后重载 Windows 的 WM_DROPFILES 消息,在 WM_DROPFILES 消息处理机制里利用 DragAcceptFiles函数分析拖拽文件的详细情况。最后释放掉 DragDrop 结构的内存块,在 WM_DROPFILES 消息的 WParam 参数就指向这个 DragDrop 的内存地址。当 DragDrop 的文件数不止一个时,只消简单的循环 DragQueryFile 就行。
范例:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) ListBox1: TListBox; procedure FormCreate(Sender: TObject); protected procedure WMDROPFILES (var Msg: TMessage); message WM_DROPFILES; //重载 Windows 的 WM_DROPFILES 消息 private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation uses shellapi;
{$R *.DFM}
procedure TForm1.WMDROPFILES (var Msg: TMessage); var i,nfiles, size : integer; Dateiname : PChar;
begin inherited; nfiles := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255); // nfiles 保存 DragDrop 的文件数 for i := 0 to (nfiles - 1) do begin size := DragQueryFile(Msg.WParam, i , nil, 0) + 1; // 先知道文件名长度 Dateiname:= StrAlloc(size); DragQueryFile(Msg.WParam,i , Dateiname, size); listbox1.items.add(StrPas(Dateiname)); StrDispose(Dateiname); end; DragFinish(Msg.WParam); end;
procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles( Handle, true ); end;
end.
|