我正在尝试创建一个接受从 Windows 资源管理器中删除的文件的 TShellListView 的后代。我想在我的组件定义中处理拖放,而不必在任何使用该组件的应用程序中实现它(我找到了接受从 Windows 资源管理器中删除的文件的示例,但都是在应用程序/TForm 级别)。
我在构造函数中调用 DragAcceptFiles(),并且为 WM_DROPFILES 定义了一个消息处理程序。但是,当我在示例项目中使用此组件并从 Windows 资源管理器中拖动文件时:
我看到“不接受”图标(带斜线的圆圈),而不是表明我可以删除文件的指示。
如果我确实尝试删除文件,我不会听到 Beep()。
我认为我没有正确地提醒 Windows 我的控件想要接受拖动的文件这一事实。谁能建议我缺少什么?
这是我的组件代码,去掉了无趣的部分:
unit LJLShellListView;
interface
type
TLJLShellListView = class(TShellListView)
private
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
published
constructor Create(AOwner: TComponent);
end;
implementation
uses ShellAPI;
constructor TLJLShellListView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
DragAcceptFiles(self.Handle, True);
end;
procedure TLJLShellListView.WMDropFiles(var Msg: TWMDropFiles);
begin
Beep(); // I never hear this.
end;
end.