OLE 拖放

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

OLE 拖放功能与文件管理器拖放机制不同。 文件管理器只能处理文件名,专门用于将文件名传递给应用程序。 在 OLE 中拖放更常规。 它允许拖放也可以放置在剪贴板上的任何数据。

使用 OLE 拖放时,请从过程中删除两个步骤。 从源窗口(“放置源”)中选择数据,然后将其拖动到目标(“放置目标”)。 通过释放鼠标按钮将其删除。 该作无需菜单,并且比复制/粘贴序列更快。 只有一个要求:删除源和放置目标必须处于打开状态,并且至少在屏幕上部分可见。

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

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

实现放置源

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

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

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

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

实现放置目标

实现放置目标比放置源需要稍多一些工作,但它仍然相对简单。

实现 OLE 放置目标

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

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

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

  4. 重写以下函数。 如果在整个应用程序中需要相同的行为,请在视图类中重写这些函数。 如果要在独立情况下修改行为,或者想要在非CView 窗口上启用删除,请在 -derived 类中 COleDropTarget重写这些函数。

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

请参阅 MAINVIEW。作为 MFC OLE 示例 OCLIENT 的一部分的 CPP 文件,例如这些函数如何协同工作。

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

自定义拖放

拖放功能的默认实现足以满足大多数应用程序的需求。 但是,某些应用程序可能需要更改此标准行为。 本部分介绍更改这些默认值所需的步骤。 可以使用此方法将不支持复合文档的应用程序放入放置源。

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

(可选)可以创建一个 COleDropSource 对象来控制放置并重写其某些函数,具体取决于要更改的行为类型。 然后传递 COleDataSource::DoDragDrop 此拖放源对象以更改这些函数的默认行为。 这些不同的选项可以灵活地支持应用程序中的拖放作。 有关数据源的详细信息,请参阅 数据对象和数据源(OLE)一文。

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

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

另请参阅

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