65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.17/5 (5投票s)

2000 年 11 月 10 日

viewsIcon

120320

downloadIcon

1998

简单的逐步文章,解释如何使用 OLE 实现拖放目标。

本文是 拖放界面 示例的一部分。

  1. 序列化 ASCII 数据
  2. 无模式子对话框
  3. 无模式兄弟对话框
  4. 拖放源
  5. MFC 目标
  6. TBTextTarget 类

以 OLE 的方式进行... 从中派生的一个接口类

如果您是 MFC 纯粹主义者,并且只想在您的项目中拥有 CObject 派生类,那么请考虑纯 MFC 拖放目标

您可以在step3generic 中找到示例项目,或者您可以仅下载TBTextTarget 类。

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

我向您承诺“更好的方法”,并且我现在实现了这个承诺 - 至少实现了一半,因为它适用于拖放目标,缺少 IDropSourceIDataObject 部分,但 MFC 对从 CListCtrl 开始拖动的支持非常好(也许其他人可以将其作为练习,并将这些包装器放在本文的注释中。:)

OLE 文档说:“如果您希望您的(窗口)类支持拖放,请实现 IDropTarget 接口。” 好 - 那是什么? 用通俗易懂的语言来说,我会说:您的支持拖放的类需要几个执行正确操作的函数。 这些函数捆绑在一起构成“接口”,并且由于某些接口“位于”其他接口的“顶部”,您就拥有了 - 一种类层次结构!

由于我们正在讨论文本拖动,因此使用本系列其他文章中描述的私有数据格式。 将拖动源实现为公共接口(CF_TEXT,请参阅“数据正在传播...”)用于拖放部分,并执行以下操作(并与纯 MFC 东西进行比较!)

  1. 像往常一样创建基于 CWnd 的类(CYourClass,例如您的对话框)。
  2. 在您的项目中包含文件 TBTextTarget.hTBTextTarget.cpp
  3. 转到 CYourClass 的类定义并从 TBTextTarget 派生它:例如,该行...
    class CDropDialog : public CDialog 
    ...将变为
    class CDropDialog : public CDialog, TBTextTarget 
  4. 不要忘记 #include "TBTextTarget.h"
  5. 在创建此窗口的时候(例如:OnInitDialog 很好),告诉 Windows 您已启用拖放
    BOOL CDropDialog::OnInitDialog()
        {
            CDialog::OnInitDialog();
            ::RegisterDragDrop(GetSafeHwnd(), this);
            // the other stuff follows ....
        }
  6. 将此函数添加到 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');
       }
    }   

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.