OLE 拖放

OLE 的拖放功能主要是复制并粘贴数据的快捷方式。 当您使用剪贴板复制或粘贴数据时,需要执行一些步骤。 选择数据,然后从“编辑”菜单中选择“剪切”或“复制”。 然后移动到目标应用或窗口,并将光标置于目标位置。 最后,从菜单中选择“编辑”>“粘贴”

OLE 拖放功能不同于文件管理器拖放机制。 文件管理器只能处理文件名,专用于将文件名传递给应用程序。 OLE 中的拖放更普遍。 利用此功能,您可拖放还可放置在剪贴板上的任何数据。

如果使用 OLE 拖放,则此过程可减少两个步骤。 从源窗口中选择数据(“放置源”),然后将其拖至目标(“放置目标”)。 通过释放鼠标按钮来放置数据。 此操作无需菜单,比复制/粘贴序列快。 唯一要求是放置源和放置目标必须打开,至少部分在屏幕上可见。

使用 OLE 拖放,数据可在文档内的各个位置之间、不同的文档之间或不同的应用程序之间轻松传输。 它可以在容器或服务器应用程序中实现。 任何应用程序都可以是放置源和/或放置目标。 如果应用程序同时实现放置源和放置目标支持,则可以在子窗口之间或在一个窗口中进行拖放。 此功能使应用程序更易于使用。

文章数据对象和数据源 (OLE) 介绍了如何在应用程序中实现数据传输。 还有助于查看 MFC OLE 示例 OCLIENTHIERSVR

实现放置源

若要让应用程序向拖放操作提供数据,需要实现放置源。 放置源的基本实现相对简单。 第一步是确定哪些事件开始拖动操作。 建议的用户界面指南将拖动操作的开始定义为某些选定数据内的某个点发生 WM_LBUTTONDOWN 事件的时间。 MFC OLE 示例 OCLIENTHIERSVR 遵循这些指南。

如果应用程序是容器,并且所选数据是类型为 COleClientItem 的链接对象或嵌入对象,请调用其 DoDragDrop 成员函数。 否则,请构造一个 COleDataSource 对象,使用选定内容对其进行初始化,并调用数据源对象的 DoDragDrop 成员函数。 如果应用程序是服务器,请使用 COleServerItem::DoDragDrop。 有关如何自定义标准拖放行为的信息,请参阅自定义拖放部分。

如果 DoDragDrop 返回 DROPEFFECT_MOVE,请立即从源文档中删除源数据DoDragDrop 的其他返回值对放置源没有任何影响。

有关详细信息,请参阅 OLE 数据对象和数据源:创建和销毁OLE 数据对象和数据源:操作

实现放置目标

实现放置目标比实现放置源需要做的工作要多一点,但仍相对简单。

若要实现 OLE 放置目标

  1. 如果尚不存在,请在应用程序的 InitInstance 成员函数中添加对 AfxOleInit 的调用。 初始化 OLE 库需要此调用。

  2. 将成员变量添加到要作为放置目标的应用程序中的每个视图。 此成员变量必须为 COleDropTarget 类型或从中派生的类。

  3. 从处理 WM_CREATE 消息(通常为 OnCreate)的视图类函数中,调用新成员变量的 Register 成员函数。 当视图被销毁时,将自动为你调用 Revoke

  4. 替代以下函数。 如果希望在整个应用程序中具有相同的行为,请在视图类中替代这些函数。 如果想要在隔离的情况下修改行为,或者想要在非 CView 窗口上启用放置,请在 COleDropTarget 派生的类中替代这些函数。

    替代 以允许
    OnDragEnter 窗口中发生放置操作。 当光标首次进入窗口时调用。
    OnDragLeave 在拖动操作离开指定窗口时发生特殊行为。
    OnDragOver 窗口中发生放置操作。 在窗口中拖动光标时调用。
    OnDrop 处理被放入指定窗口的数据。
    OnScrollBy 在目标窗口中需要滚动时发生特殊行为。

有关这些函数如何协同工作的示例,请参阅 MFC OLE 示例 OCLIENT 中的 MAINVIEW.CPP 文件。

有关详细信息,请参阅 OLE 数据对象和数据源:创建和销毁OLE 数据对象和数据源:操作

自定义拖放

拖放功能的默认实现对大多数应用程序都够用。 但是,某些应用程序可能需要更改此标准行为。 本部分说明更改这些默认设置所需的步骤。 可以使用此方法将不支持复合文档的应用程序转变为放置源。

如果要自定义标准 OLE 拖放行为,或者具有非 OLE 应用程序,则必须创建一个 COleDataSource 对象来包含该数据。 当用户启动拖放操作时,你的代码从此对象(而非支持拖放操作的其他类)应调用 DoDragDrop 函数。

或者,您也可以创建一个 COleDropSource 对象来控制放置和重写其函数,具体取决于要更改的行为的类型。 此放置源对象随后会传递给 COleDataSource::DoDragDrop 以更改这些函数的默认行为。 这些不同的选项在您支持应用程序中的拖放操作的方式上提供了极大的灵活性。 有关数据源的详细信息,请参阅数据对象和数据源 (OLE) 一文。

您可以重写以下函数以自定义拖放操作:

替代 以自定义
OnBeginDrag 调用 DoDragDrop 后拖动操作如何开始。
GiveFeedback 其他放置结果的可视反馈,如光标外观。
QueryContinueDrag 拖放操作的终止。 此函数使您能够在拖动操作期间检查键修改键状态。

另请参阅

OLE
OLE 数据对象和数据源
OLE 数据对象和数据源:创建和销毁
OLE 数据对象和数据源:操作
COleClientItem::DoDragDrop
COleDataSource 类
COleDataSource::DoDragDrop
COleDropSource 类
COleDropTarget 类
CView::OnDragLeave