数据对象和数据源:操作
创建数据对象或数据源后,可以对数据执行许多常见操作,如插入和删除数据、枚举数据的格式等。 本文介绍了完成最常见操作所需的技巧。 主题包括:
将数据插入数据源
如何将数据插入数据源,这取决于数据是立即提供还是按需提供,以及数据在何种介质中提供。 可能的情况如下所示。
立即提供数据(即时呈现)
对于提供数据的每一种剪贴板格式,重复调用
COleDataSource::CacheGlobalData
。 传递要使用的剪贴板格式、包含数据的内存句柄,以及描述数据的 FORMATETC 结构(可选)。- 或者 -
如果要直接使用 STGMEDIUM 结构,请调用
COleDataSource::CacheData
,而不是在上述选项中调用COleDataSource::CacheGlobalData
。
按需提供数据(延迟呈现)
这是一个高级主题。
对于提供数据的每一种剪贴板格式,重复调用
COleDataSource::DelayRenderData
。 传递要使用的剪贴板格式,以及描述数据的 FORMATETC 结构(可选)。 请求数据时,框架将调用COleDataSource::OnRenderData
,必须重写该框架。- 或者 -
如果使用
CFile
对象来提供数据,请调用COleDataSource::DelayRenderFileData
,而不是在上一个选项中调用COleDataSource::DelayRenderData
。 请求数据时,框架将调用COleDataSource::OnRenderFileData
,必须重写该框架。
确定数据对象中可用的格式
在应用程序允许用户将数据粘贴到其中之前,需要知道剪贴板上是否有可以处理的格式。 为此,应用程序应该执行以下操作:
创建
COleDataObject
对象和 FORMATETC 结构。调用数据对象的
AttachClipboard
成员函数,将数据对象与剪贴板上的数据相关联。执行下列操作之一:
如果只需要一两种格式,则调用数据对象的
IsDataAvailable
成员函数。 当剪贴板上的数据比应用程序支持的格式多时,这可以节省时间。- 或者 -
调用数据对象的
BeginEnumFormats
成员函数以开始枚举剪贴板上可用的格式。 然后调用GetNextFormat
,直到剪贴板返回应用程序支持的格式,或者没有其他格式。
如果使用的是 ON_UPDATE_COMMAND_UI,现在可以在“编辑”菜单上启用“粘贴”或者启用“粘贴特殊项”。 为此,请调用 CMenu::EnableMenuItem
或 CCmdUI::Enable
。 有关容器应用程序应使用菜单项执行哪些操作以及何时执行的详细信息,请参阅菜单和资源:容器添加。
从数据对象检索数据
确定数据格式后,剩下的工作就是从数据对象中检索数据。 为此,用户决定将数据放在何处,应用程序将调用相应的函数。 数据将在以下介质之一提供:
中 | 要调用的函数 |
---|---|
全局内存 (HGLOBAL ) |
COleDataObject::GetGlobalData |
文件 (CFile ) |
COleDataObject::GetFileData |
STGMEDIUM 结构 (IStorage ) |
COleDataObject::GetData |
通常,介质将连同其剪贴板格式一起指定。 例如,CF_EMBEDDEDSTRUCT 对象始终位于需要 STGMEDIUM 结构的 IStorage
介质中。 因此,你会使用 GetData
,因为它是这些函数中唯一可以接受 STGMEDIUM 结构的函数。
对于剪贴板格式位于IStream
或 HGLOBAL
介质的情况,框架可以提供引用数据的 CFile
指针。 然后,应用程序可以使用文件读取来获取数据,其方式与从文件导入数据的方式非常相似。 实质上,这是数据源中到 OnRenderData
和 OnRenderFileData
例程的客户端接口。
用户现在可以向文档中插入数据,就像插入相同格式的任何其他数据一样。