pboardData(pDataSource);
GetClipboardData(pDataSource, bIncludeLink,
pptOffset, pSize);
}
CATCH_ALL(e)
{
delete pDataSource;
THROW_LAST();
}
END_CATCH_ALL
ASSERT_VALID(pDataSource);
return pDataSource;
}
---- 复制、剪切和粘贴数据
---- 将数据复制或剪切到剪贴板上
---- 1. 确定将要被复制的数据是一个本地数据还是一个嵌入对象或链接。
---- 如果数据是一个嵌入对象或链接,创建一个指向被选定数据的COleClientItem指
针。
---- 如果数据是本地化的并且应用程序是一个服务器,那么从COleServerItem继承一
个新的类,并创建该对象。否则,为数据建立一个COleDataSource对象。
---- 2. 访问选定对象的CopyToClipboard成员函数。
---- 3. 如果用户选择剪切命令而不是复制,那么从你的应用程序中删除那些数据。
----
程序示例:
void CMainView::OnEditCut()
{
ASSERT(m_pSelection != NULL);
TRY
{
m_pSelection- >CopyToClipboard(TRUE);
OnEditClear();
}
CATCH_ALL(e)
{
AfxMessageBox(IDP_CLIPBOARD_CUT_FAILED);
}
END_CATCH_ALL
}
void CMainView::OnEditCopy()
{
ASSERT(m_pSelection != NULL);
TRY
{
m_pSelection- >CopyToClipboard(TRUE);
}
CATCH_ALL(e)
{
AfxMessageBox(IDP_CLIPBOARD_COPY_FAILED);
}
END_CATCH_ALL
}
---- 从剪贴板粘贴数据
---- 粘贴数据比复制更加复杂,因为你需要选择粘贴的格式。
---- 1. 在你的视中,实现OnEditPaste来处理用户从编辑菜单选择粘贴命令的操作。
---- 2. 在OnEditPaste函数中,建立一个COleDataObject对象并且访问它的
AttachClipboard成员函数来将这个对象绑定到剪贴板。
---- 3. 访问COleDataObject::IsDataAvailable函数来检查是否可以使用特殊的格
式。当然,你也可以通过循环使用COleDataObject::BeginEnumFormats来寻找其它格式
直到你找到了最适合的格式。
---- 4. 粘贴数据。
----
程序示例:
CRectItem* CMainView::DoPasteItem(BOOL bLink,
COleDataObject* pDataObject,CPoint* pPoint,
CLIPFORMAT cfFormat)
{
BeginWaitCursor();
CRectItem* pItem = GetDocument()- >CreateItem();
ASSERT_VALID(pItem);
BOOL bAllowAdjust = (pPoint == NULL) ? TRUE : FALSE;
COleDataObject clipboardData;
if (pDataObject == NULL)
{
clipboardData.AttachClipboard();
pDataObject = &clipboardData;
}
TRY
{
if (cfFormat == CMainDoc::m_cfPrivate)
{
DoPasteNative(pDataObject, pPoint, pItem);
}
else if (!bLink && cfFormat == 0 &&
pDataObject- >IsDataAvailable(CMainDoc::m_cfPrivate))
{
DoPasteNative(pDataObject, pPoint, pItem);
}
else if (bAllowAdjust)
{
CPoint ptDef(10, -10);
DoPasteStandard(bLink, pDataObject,
&ptDef, pItem, cfFormat);
}
else
{
DoPasteStandard(bLink, pDataObject,
pPoint, pItem, cfFormat);
}
if (bAllowAdjust)
{
GetDocument()- >AdjustItemPosition(pItem);
}
}
CATCH_ALL(e)
{
TRACE0("failed to embed/link an OLE object\n");
pItem- >Delete();
pItem = NULL;
}
END_CATCH_ALL
SetSelection(pItem, TRUE);
GetDocument()- >SetModifiedFlag();
GetDocument()- >UpdateAllViews(NULL, 0, pItem);
EndWaitCursor();
return pItem;
}
void CMainView::OnEditPaste()
{
COleDataObject clipboardData;
clipboardData.AttachClipboard();
DoPasteItem(&clipboardData);
UpdateAllViews();
}
---- 说明 将粘贴操作(如OnEditPaste函数)与实现粘贴的函数(如DoPasteItem)分
开的最大优点在于,当数据被拖放到你的应用程序中时,可以使