程序中实现选定操作;
要编写一个实现粘贴命令的函数,就需要请求剪贴板来检测它是否包含你的应用
程序能
够支持的数据。下面的代码实现了复制命令,其它实现可仿照进行,在此不再赘言。
----
程序示例:
void CMyView::OnEditCopy()
{
if ( !OpenClipboard() )
{
AfxMessageBox( "无法打开剪贴板" );
return;
}
// 删除目前剪贴板的内容
if( !EmptyClipboard() )
{
AfxMessageBox( "无法清除剪贴板" );
return;
}
// 获取选定的数据
// 检查是否为剪贴板支持的格式
if ( ::SetClipboardData( CF_??, hData ) == NULL )
// CF_??指定了剪贴板中数据的格式,
//表1列出了标准的剪贴板格式
{
AfxMessageBox( "无法将数据复制到剪贴板当中" );
CloseClipboard();
return;
}
//
CloseClipboard();
}
---- 四、使用OLE剪贴板机制
---- 首先举个例子给你一些关于OLE剪贴板的感性认识,同时说明你需要为OLE剪贴板
做哪些事情:Microsoft Excel为工作表
注册了一个自定义的格式,这个格式能够比其
它标准格式(如位图或纯文本等)提供更多的信息。当此数据被粘贴到一个支持工作表
的程序(比如Lotus 1-2-3)时,所有的原工作表中的公式和数值将被保留,并且还可
能会根据需要被更新。Excel同样将数据以OLE格式存放在剪贴板中,这样它就可以作为
一个OLE对象被嵌入。任何OLE文档包容器(Container)(比如Microsoft Word)能够
将该数据作为嵌入对象粘贴进文档(比如通过“选择性粘贴”,可以在Word中粘贴进
Excel工作表对象)。这个嵌入对象能够通过激活Microsoft Excel来进行修改(在Word
中可以通过双击对象实现)。该工作表甚至可以被粘贴到一个绘图程序(比如的画
笔)。当然,这时你无论如何都没有办法将其中的数据像在工作表中一样修改,因为它
已经是
图片了。
---- 从上例总结一下,我们应当作的事情大致有:注册自定义的格式、传输格式到剪
贴板上以及实现复制、剪切和粘贴。
---- 注册自定义格式
---- OLE剪贴板中的数据存在于多种格式。当一个用户选择从剪贴板粘贴数据时,应用
程序应当能够选择使用何种格式粘贴数据。应用程序应当提供大部分格式的信息,除非
用户指定使用某一种特定格式粘贴(比如只粘贴文字或只粘贴
图片等)。
---- Windows定义了很多能够通过剪贴板传输的标准格式(见表1),OLE也定义了很多
特殊的格式。应用程序可以通过获取更加详细的信息来注册他们自己的剪贴板格式。这
可以通过使用Win32 API函数RegisterClipboardFormat来实现:
---- RegisterClipboardFormat ( lpszFormat );
---- 说明 lpzxFormat是指向一个字符串的指针,用以命名自定义的格式。该函数返回
无符号整数,该数即为格式的ID号
---- 在注册了自定义的格式之后,便可以使用RegisterClipboardFormat函数的返回值
来标识并使用该格式。
---- 将格式传输到剪贴板上
---- 要增加更多的格式到剪贴板上,你必须从COleClientItem或COleServerItem继承
一个类,并且在该类中重载OnGetClipboardData函数。在这个函数中,你应当做按照下
列步骤完成。
---- 将更多的格式放置在剪贴板上
---- 1. 建立一个COleDataSource对象。
---- 2. 传递该数据源到一个函数,用该函数通过访问
COleDataSource::CacheGlobalData函数来将你的数据格式添加到支持的格式列表。
---- 3. 通过访问COleDataSource::CacheGlobalData,为每一个你向支持的格式添加
标准格式。
----
程序示例:
COleDataSource* CMyItem::OnGetClipboardData(
BOOL bIncludeLink,LPPOINT pptOffset, LPSIZE pSize)
{
ASSERT_VALID(this);
if (m_pServerNode == NULL)
return NULL;
COleDataSource* pDataSource =
new COleDataSource;
TRY
{
GetNativeCli