gpt4 book ai didi

delphi - 处理 TShellListView 后代中的文件放置

转载 作者:行者123 更新时间:2023-12-03 14:51:48 25 4
gpt4 key购买 nike

我正在尝试创建 TShellListView 的后代,它接受从 Windows 资源管理器中删除的文件。我想在组件定义中处理拖/放操作,而不必在任何使用该组件的应用程序中实现它(我找到了接受从 Windows 资源管理器中拖放的文件的示例,但都是在应用程序/TForm 级别)。

我在构造函数中调用 DragAcceptFiles(),并且为 WM_DROPFILES 定义了消息处理程序。但是,当我在示例项目中使用此组件并从 Windows 资源管理器中拖动文件时:

  1. 我看到“不接受”图标(带斜线的圆圈),而不是指示我可以删除文件。

  2. 如果我尝试删除文件,我不会听到 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.

最佳答案

问题代码中的 DragAcceptFiles 调用需要 ShellListView 的窗口句柄。当代码访问 wincontrol 的句柄时,VCL 检查窗口是否已创建,如果没有,VCL 调用 CreateHandle 并继续创建窗口并返回其句柄。到此阶段,问题中的代码已成功注册 ShellListView 的窗口以进行文件拖放。但有一个问题,该控件还没有设置父级。当它要成为父级时, native 控件将被销毁,然后在其新父级中重新创建,当然会获取不同的句柄,从而使注册状态无效。

控件也可能因各种其他原因而被重新创建。因此,最好将我们的代码放在重写的 CreateWnd 和 DestroyWnd 方法中,每当句柄发生变化或窗口即将被销毁时,我们的代码就会运行。

关于delphi - 处理 TShellListView 后代中的文件放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14404782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com