用于拖放文本的通用 IDropTarget COM 类






4.17/5 (5投票s)
2000 年 11 月 10 日

120320

1998
简单的逐步文章,解释如何使用 OLE 实现拖放目标。
本文是 拖放界面 示例的一部分。
- 序列化 ASCII 数据
- 无模式子对话框
- 无模式兄弟对话框
- 拖放源
- MFC 目标
- TBTextTarget 类
以 OLE 的方式进行... 从中派生的一个接口类
如果您是 MFC 纯粹主义者,并且只想在您的项目中拥有 CObject
派生类,那么请考虑纯 MFC 拖放目标。
您可以在step3generic 中找到示例项目,或者您可以仅下载TBTextTarget 类。
用于拖放文本的通用 IDropTarget COM 类
我向您承诺“更好的方法”,并且我现在实现了这个承诺 - 至少实现了一半,因为它适用于拖放目标,缺少 IDropSource
和 IDataObject
部分,但 MFC 对从 CListCtrl
开始拖动的支持非常好(也许其他人可以将其作为练习,并将这些包装器放在本文的注释中。:)
OLE 文档说:“如果您希望您的(窗口)类支持拖放,请实现 IDropTarget
接口。” 好 - 那是什么? 用通俗易懂的语言来说,我会说:您的支持拖放的类需要几个执行正确操作的函数。 这些函数捆绑在一起构成“接口”,并且由于某些接口“位于”其他接口的“顶部”,您就拥有了 - 一种类层次结构!
由于我们正在讨论文本拖动,因此使用本系列其他文章中描述的私有数据格式。 将拖动源实现为公共接口(CF_TEXT,请参阅“数据正在传播...”)用于拖放部分,并执行以下操作(并与纯 MFC 东西进行比较!)
- 像往常一样创建基于
CWnd
的类(CYourClass
,例如您的对话框)。 - 在您的项目中包含文件 TBTextTarget.h 和 TBTextTarget.cpp。
- 转到
CYourClass
的类定义并从TBTextTarget
派生它:例如,该行...class CDropDialog : public CDialog
...将变为class CDropDialog : public CDialog, TBTextTarget
- 不要忘记
#include "TBTextTarget.h"
- 在创建此窗口的时候(例如:
OnInitDialog
很好),告诉 Windows 您已启用拖放BOOL CDropDialog::OnInitDialog() { CDialog::OnInitDialog(); ::RegisterDragDrop(GetSafeHwnd(), this); // the other stuff follows .... }
- 将此函数添加到
CYourClass
(它在TBTextTarget
中是纯虚函数,因为它取决于您对您的数据做什么)void ProcessData(CString Data)
当文本被拖入您的窗口时,将调用此函数。 对它做任何您喜欢(或需要)的事情。 例如
CDropDialog::ProcessData(CString Data) { CString t1(Data), t2; int idx = t1.Find('\n'); while (idx !=-1) { t2 = t1.Left(idx); t1 = t1.Mid(idx+1); InsertRow(t2); idx = t1.Find('\n'); } }
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。