如何使用DragType dtOLE将节点从TVirtualStringTree拖放到VCL控件中?

曲折

设置为(not TVirtualStringTree是否可以将节点从拖放到VCL控件中DragTypedtOLEdtVCL

我遇到这样的情况,我需要能够将节点从一个VT拖到另一个VT(dtOLE可以正常工作),但是同时,在拖动的同时,我需要一个能够将节点放入一个TListBox(或其他VCL)的选项。控制)。

我尝试DragAcceptFiles()为该TListBox句柄设置API ,但没有任何效果。

如何做呢?

雷米·勒博(Remy Lebeau)

上没有DragAcceptFiles属性TListBox如果您要DragAcceptFiles()TListBox.Handle窗口调用Win32 API函数,则仅在以下情况下有效:

  1. 您可以手动将TListBox.WindowProc属性子类化以处理WM_DROPFILES窗口消息。

  2. TVirtualStringTree提供CF_HDROPOLE拖动过程中格式。

但是2不是正确的。CF_HDROP仅用于拖动文件系统路径,而不能TVirtualStringTree拖动。所以DragAcceptFiles()用完了。

TVirtualStringTree(和其他TBaseVirtualTree后代)在OLE拖动期间使用自定义数据格式(VirtualTrees.pas单元的接口部分声明了这些格式ID,因此您无需在自己的代码中手动注册它们):

  • CF_VIRTUALTREE包含被拖动的选定树节点IStreamHGLOBAL持有序列化形式。序列化由一系列描述每个节点的数据块组成。您将必须参考VirtualTree.pas单元的实现来解密这种格式(我在这里不打算这样做)。

  • CF_VTREFERENCE包含一个HGLOBAL保存TVTReference记录(该记录也在该VirtualTrees.pas单元的接口部分中声明),该记录包含一个指向要TBaseVirtualTree拖动的实际对象的指针以及该树所属的进程的ID。

因此,为了使您能够将树节点拖放到上TListBox,您必须执行以下操作:

  1. 编写一个实现该IDropTarget接口的类(或使用一个预先存在的实现,例如来自Anders Melander的Drag&Drop套件的实现)。

  2. 使用在TListBox.Handle窗口中注册该类RegisterDragDrop()

  3. 在您的IDropTarget实现中,您可以查询提供IDataObjectCF_VIRTUALTREECF_VTREFERENCE格式。如果成功,您的Drop()方法将有权访问被拖动的树节点数据,并可以TListBox根据需要将其复制到中

假设您的TListBox存在与TVirtualStringTree被删除的过程相同,我建议您专注于just CF_VTREFERENCE,因为它是一种非常小而简单的格式(请参阅该TBaseVirtualTree.GetTreeFromDataObject()方法的实现),而解析CF_VIRTUALTREE数据将是过大的(请参见的实现)。该TBaseVirtualTree.ProcessOLEData()方法)时,你可以通过源枚举TVirtualStringTree,而不是直接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将文件拖放到JTable中?

如何在Tvirtualstringtree中设置节点高度

如何使用ag-grid将文件拖放到一行?

如何使用python将无行拖放到csv文件中?

如何获取将拖放节点拖放到的节点的ID

如何将GLTF元素分组并拖放到3js中

如何在PyQt5中将文件拖放到QTableWidget中

如何将项目从QListWidget拖放到QPlainTextEdit?

Dropzone问题-Dropzone内部存在无法使用的斑点。将文件拖放到那里会在浏览器中打开它们

使用ngx-sortablejs将列拖放到表中的另一行

如何将特定的QPixmap拖放到QGraphicsView中?

如何将元素拖放到动态生成的DIV中,拖动功能正常工作

如何将mp3文件拖放到没有文件路径的列表框中?

如何在C#中从datagridview拖放到richtextbox?

如何将项目拖放到ListView并检测将其拖放到的项目

使用纯JavaScript将十字符号拖放到网格中的框中?

将XML上载并拖放到ruby中。使用进口商或诸如Nokugiri之类的其他公司

如何使用“文件”应用程序(Nautilus)将文件拖放到文件夹中?

我可以使用Nautilus将文件拖放到加密的文件夹中吗?

如何将文件从桌面拖放到窗体

如何从WPF Treeview拖放到Winform控件上?

仅当元素和div在javascript中具有相同的ID时,才如何将元素拖放到div中?

如何将 SVG 文件拖放到 Fabricjs 画布上?

如何将标签拖放到目标 c 中的框上

使用 Angular6 将图像拖放到 div 中并显示预览

如何将xml文件拖放到Qtableview中,同时解析xml

使用 JQuery 将 <span> 拖放到段落

动态地将命令按钮拖放到 Visio 页面中并使用 VBA 设置文本

如何在 PyQt 中从 QListWidget 拖放到 QLabel