我有一个模仿 Windows 资源管理器的应用程序,它使用TcxShellListView
其他 shell 控件。
一个非常好的功能是能够在真正的 Windows 资源管理器和我的应用程序之间创建文件Copy & Paste
。Cut & Paste
Drag & Drop
已经开箱即用,但似乎 DevExpress 还没有实现剪贴板端。
有任何想法吗?
我有一个模仿 Windows 资源管理器的应用程序,它使用TcxShellListView
其他 shell 控件。
一个非常好的功能是能够在真正的 Windows 资源管理器和我的应用程序之间创建文件Copy & Paste
。Cut & Paste
Drag & Drop
已经开箱即用,但似乎 DevExpress 还没有实现剪贴板端。
有任何想法吗?
如果您想自己实现复制/粘贴,该机制几乎与拖放相同。您拥有的拖放代码将创建一个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;
我认为您应该能够按原样使用此代码。我会指出句柄参数声明不正确。应该是HWND
。它用作在调用InvokeCommand
.