创建数据对象或数据源后,可以对数据执行许多常见作,例如插入和删除数据、枚举数据的格式等。 本文介绍完成最常见作所需的技术。 主题包括:
将数据插入数据源
将数据插入到数据源的方式取决于数据是立即提供还是按需提供,以及数据提供介质。 可能性如下。
立即提供数据 (立即呈现)
针对提供数据的每个剪贴板格式重复调用
COleDataSource::CacheGlobalData
。 传递要使用的剪贴板格式、包含数据的内存句柄,以及 描述数据的 FORMATETC 结构(可选)。-或-
如果要直接使用 STGMEDIUM 结构,请调用上述选项,而不是
COleDataSource::CacheGlobalData
在上述选项中调用COleDataSource::CacheData
。
按需提供数据(延迟呈现)
这是一个高级主题。
针对提供数据的每个剪贴板格式重复调用
COleDataSource::DelayRenderData
。 传递要使用的剪贴板格式,并选择性地传递描述数据的 FORMATETC 结构。 请求数据时,框架将调用COleDataSource::OnRenderData
该框架,必须重写该框架。-或-
如果使用
CFile
对象来提供数据,请调用,而不是COleDataSource::DelayRenderData
在上一个选项中调用COleDataSource::DelayRenderFileData
。 请求数据时,框架将调用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
。
用户现在可以将数据插入文档中,就像采用相同格式的任何其他数据一样。