如 数据对象和数据源(OLE)一文中所述,数据对象和数据源表示数据传输的两侧。 本文介绍何时创建和销毁这些对象和源以正确执行数据传输,包括:
创建数据对象
数据对象由目标应用程序(客户端或服务器)使用。 目标应用程序中的数据对象是源应用程序与目标应用程序之间的连接的一端。 目标应用程序中的数据对象用于访问数据源中的数据并与之交互。
有两种常见情况需要数据对象。 第一种情况是使用拖放在应用程序中删除数据。 第二种情况是从“编辑”菜单中选择“粘贴”或“选择性粘贴”。
在拖放的情况下,无需创建数据对象。 指向现有数据对象的指针将传递给函数 OnDrop
。 此数据对象由框架创建,作为拖放作的一部分,并且也会被它销毁。 粘贴由另一种方法完成时,情况并非总是如此。 有关详细信息,请参阅 “销毁数据对象”。
如果应用程序正在执行粘贴或粘贴特殊作,则应创建一个 COleDataObject
对象并调用其 AttachClipboard
成员函数。 这会将数据对象与剪贴板上的数据相关联。 然后,可以在粘贴函数中使用此数据对象。
销毁数据对象
如果遵循 “创建数据对象”中所述的方案,则销毁数据对象是数据传输的一个简单方面。 粘贴函数返回时,MFC 将销毁在粘贴函数中创建的数据对象。
如果遵循另一种处理粘贴作的方法,请确保粘贴作完成后销毁数据对象。 在数据对象被销毁之前,任何应用程序都不可能成功将数据复制到剪贴板。
创建数据源
数据源由数据传输的源使用,可以是客户端或数据传输的服务器端。 源应用程序中的数据源是源应用程序与目标应用程序之间的连接的一端。 目标应用程序中的数据对象用于与数据源中的数据进行交互。
当应用程序需要将数据复制到剪贴板时,将创建数据源。 典型的方案如下所示:
用户选择一些数据。
用户从“编辑”菜单中选择“复制”(或“剪切”),或开始拖放作。
应用程序根据程序的设计,从派生自
COleDataSource
的类创建COleDataSource
对象或对象。所选数据通过调用其中一个函数
COleDataSource::CacheData
或COleDataSource::DelayRenderData
组插入到数据源中。应用程序调用
SetClipboard
属于步骤 3 中创建的对象的成员函数(或DoDragDrop
成员函数(如果这是拖放作)。如果这是 剪切 作或
DoDragDrop
返回 DROPEFFECT_MOVE,则步骤 1 中选择的数据将从文档中删除。
此方案由 MFC OLE 示例 OCLIENT 和 HIERSVR 实现。 查看每个应用程序的 CView
-derived 类的源,了解除了和OnGetClipboardData
函数。GetClipboardData
这两个函数位于派COleServerItem
生类实现中COleClientItem
。 这些示例程序提供了有关如何实现这些概念的良好示例。
如果要修改拖放作的默认行为,则可能需要创建 COleDataSource
对象的其他一种情况。 有关详细信息,请参阅 OLE 拖放:自定义拖放 文章。
销毁数据源
数据源必须由当前负责它们的应用程序销毁。 在将数据源交给 OLE(例如调用 COleDataSource::D oDragDrop)时,需要调用 pDataSrc->InternalRelease
。 例如:
void CMyListView::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
UNREFERENCED_PARAMETER(pResult);
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
CMyDataSource* pDataSrc = new CMyDataSource();
if (NULL != pDataSrc)
{
pDataSrc->Initialize(pNMLV, this);
pDataSrc->DelayRenderData((CLIPFORMAT)RegisterClipboardFormat(_T("TIGroupFiles")));
pDataSrc->DoDragDrop();
pDataSrc->InternalRelease();
}
}
如果尚未将数据源交给 OLE,则负责销毁它,就像任何典型的C++对象一样。
有关详细信息,请参阅 拖放、 剪贴板以及 作数据对象和数据源。