WM_DROPFILES消息怎么用?一个界面上怎么让多个组件同时支持windows外部文件拖拽。DragAcceptFiles。 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061114152826236.html
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ShellAPI;
type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
private
OLDWndProc:TWndMethod;
procedure DragFileProc(var Msg:TMessage);message WM_DROPFILES;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.DragFileProc(var Msg: TMessage);
var
FileName:array [0..MAX_PATH-1] of Char;
sFileName:String;
Count:integer;
begin
if Msg.Msg=WM_DropFiles then
begin
Count:=DragQueryFile(Msg.WParam,$FFFFFFFF,@FileName[0], MAX_PATH);//得到拖放文件的个数
if Count > 0 then
begin
FillChar(FileName, SizeOf(FileName), #0);
DragQueryFile(Msg.WParam, 0, @FileName[0], MAX_PATH);//查询文件名称
sFileName:= string(FileName);
end;
DragFinish(Msg.WParam); //释放所使用的资源
end else
OLDWndProc(Msg);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(panel1.Handle, Enabled);
OLDWndProc:= panel1.WindowProc; // 保存原来的 WindowProc
panel1.WindowProc:= DragFileProc; // 设置新的 WindowProce
end;
end.
我想请问下,如果我在一个界面上同时有多个WinControl组件需要支持windows外部文件拖拽,要怎么做?
通过(var Msg:TMessage);message WM_DROPFILES; 能判断出是哪个组件返回的吗?
能不能给TPanel增加接收 WM_DROPFILES 的方法呢。
前提是不需要重新编译TPanel控件。编写一个继承类的话就不能放在界面上了。除非编成可视控件。
Uses
StdCtrls,ShellApi;
type
TDragMemo = class(TMemo)
procedure DragFileProc(var Msg:TMessage);message WM_DROPFILES;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Memo:TDragMemo;
begin
Memo:= TDragMemo.Create(nil);
memo.Parent:=self;
end;
procedure TDragMemo.DragFileProc(var Msg:TMessage);
begin
//your code
end;
end.
以上只是定义一个类,你可以将它做成一个控件,直接继承WINDOWS控件然后修改DragFileProc就可以了。
woshihaoge(支离破碎) 说的方法我知道啊。
但这样的话,如果要直接放在界面上,就要做成控件了。
我想让 edit,panel, listview....等一些控件都支持explorer的拖拽,这样写感觉有点....
还有其他方法吗?
没有办法啊,只能这样子类化,要么做成控件,以前我也研究过类似的问题,貌似书上介绍的就这办法了。
还有人能回答下么