|
本节主要学习利用三个与 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, Dat ame, 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.
没有相关教程
|