我有一个模仿Windows资源管理器的应用程序,它在其他shell控件中使用TcxShellListView
。
一个非常好的功能是在真正的Windows资源管理器和我的应用程序之间能够Copy & Paste
和Cut & Paste
个文件。
Drag & Drop
已经开箱即用,但似乎DevExpress尚未实现剪贴板方面。
任何想法?
答案 0 :(得分:3)
如果您想自己实现复制/粘贴,则该机制几乎与拖放相同。您拥有的拖放代码将创建IDataObject
。要复制,而不是致电DoDragDrop
来发起拖动,只需致电OleSetClipboard
即可通过IDataObject
。对于粘贴,请致电OleGetClipboard
以从剪贴板中获取IDataObject
。然后,您只需使用与放置操作完全相同的代码来解码IDataObject
。这就是它的全部内容。
还有另一种方法可以做到,在我看来可能是一种更好的方法。这就是使用IContextMenu
来完成工作。其中的例子可以在TurboPower tpShellShock项目中找到。查看ShellMenuExecute
单元中的StShlCtl
。只要DevExpress组件使用shell接口,即IShellFolder
,您就可以使用相同的方法。这种基于shell的方法的优点是你可以使用shell来完成工作。如果需要显示复制对话框,则shell将执行此操作。这将为您提供最集成的用户体验。
此代码如下所示:
procedure ShellMenuExecute(
const Sender : TObject; const Folder : IShellFolder;
var Pidl : PItemIDList; const Count : Integer;
const AHandle : THandle; ClipboardAction : TStMenuAction);
var
CM : IContextMenu;
CI : TCmInvokeCommandInfo;
begin
if Folder <> nil then begin
if (Folder.GetUIObjectOf(AHandle, Count, Pidl,
IID_IContextMenu, nil, Pointer(CM)) = NOERROR)
then begin
ZeroMemory(@CI, SizeOf(CI));
CI.cbSize := SizeOf(TCmInvokeCommandInfo);
CI.hwnd := AHandle;
case ClipboardAction of
caCut : CI.lpVerb := 'cut';
caCopy : CI.lpVerb := 'copy';
caPaste : CI.lpVerb := 'paste';
caProperties : CI.lpVerb := 'properties';
end;
CM.InvokeCommand(CI);
CM := nil;
end;
end;
end;
我认为您应该可以使用此代码。我会指出handle参数声明不正确。它应该是HWND
。它被用作调用InvokeCommand
期间显示的任何对话框的拥有窗口。