剪贴板:使用 Windows 剪贴板
本主题介绍如何在 MFC 应用程序中使用标准 Windows 剪贴板 API。
大多数 Windows 应用程序支持将数据剪切或复制到 Windows 剪贴板以及从剪贴板粘贴数据。 剪贴板数据格式因应用程序而异。 框架仅支持有限数量的类的少数剪贴板格式。 通常会在视图的“编辑”菜单上实现与剪贴板相关的命令(剪切、复制和粘贴)。 类库定义这些命令的命令 ID:ID_EDIT_CUT、ID_EDIT_COPY 和 ID_EDIT_PASTE。 还会定义其消息行提示。
框架中的消息和命令介绍了如何通过将菜单命令映射到处理程序函数来处理应用程序中的菜单命令。 只要应用程序没有为“编辑”菜单上的剪贴板命令定义处理程序函数,它们就会保持禁用状态。 若要为剪切和复制命令编写处理程序函数,请在应用程序中实现选择。 若要为粘贴命令编写处理程序函数,请查询剪贴板,查看它是否包含应用程序可以接受的格式的数据。 例如,若要启用剪切命令,可编写与下类似的处理程序:
void CMyListView::OnEditCopy()
{
if ( !OpenClipboard() )
{
AfxMessageBox( _T("Cannot open the Clipboard") );
return;
}
// Remove the current Clipboard contents
if( !EmptyClipboard() )
{
AfxMessageBox( _T("Cannot empty the Clipboard") );
return;
}
// Get the currently selected data
HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64);
strcpy_s((char*)hGlob, 64, "Current selection\r\n");
// For the appropriate data formats...
if ( ::SetClipboardData( CF_TEXT, hGlob ) == NULL )
{
CString msg;
msg.Format(_T("Unable to set Clipboard data, error: %d"), GetLastError());
AfxMessageBox( msg );
CloseClipboard();
GlobalFree(hGlob);
return;
}
CloseClipboard();
}
剪切、复制和粘贴命令仅在某些上下文中有意义。 仅当选定内容时,才应启用剪切和复制命令,仅当剪贴板中存在内容时才启用粘贴命令。 可以通过定义根据上下文启用或禁用这些命令的更新处理程序函数来提供此行为。 有关详细信息,请参阅如何更新用户界面对象。
Microsoft 基础类库确实为使用 CEdit
和 CEditView
类的文本编辑提供剪贴板支持。 OLE 类还简化了实现涉及 OLE 项的剪贴板操作。 有关 OLE 类的详细信息,请参阅剪贴板:使用 OLE 剪贴板机制。
还剩下实现其他“编辑”菜单命令,例如撤消 (ID_EDIT_UNDO) 和重做 (ID_EDIT_REDO)。 如果应用程序不支持这些命令,可以使用 Visual C++ 资源编辑器从资源文件中轻松删除它们。