分类: C/C++
2012-01-27 02:12:39
系统环境:Windows 7
软件环境:Visual Studio 2008 SP1
本次目的:实现CRichEditCtrl粘贴纯文本,把带有格式的内容去除,只剩下纯文本
有时候我们在复制粘贴的时候,仅仅需要纯文本内容的时候,我们可以在Word里面选择“无格式化文本”粘贴。但是,在VC文档里面实现的话就需要对剪贴板进行处理。本例是单文档,基于CRichEditView的实现,对于其他的可以相应修改下。
首先,在实现文件里面添加
DWORD CALLBACK CBStreamIn ( DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb )
{
CString *pstr = ( CString * ) dwCookie;
if ( pstr->GetLength() < cb )
{
*pcb = pstr->GetLength();
memcpy ( pbBuff, ( LPCSTR ) *pstr, *pcb );
pstr->Empty();
}
else
{
*pcb = cb;
memcpy ( pbBuff, ( LPCSTR ) *pstr, *pcb );
*pstr = pstr->Right ( pstr->GetLength() - cb );
}
return 0;
}
在视图类文件,声明
BOOL ResetClipData();
在实现文件里面,定义函数功能
BOOL CTest_editView::ResetClipData()
{
HGLOBAL hGlobal; // Global memory handle
LPSTR lpszData; // Pointer to clipboard data
unsigned long nBufSize = 0; // Size of clipboard data]
char * lpszBuffer = NULL;
BOOL bOpen = OpenClipboard();
if ( !bOpen )
{
return FALSE;
}
// Request a pointer to the text on the clipboard.
hGlobal = ::GetClipboardData ( CF_TEXT );
if ( hGlobal == NULL )
{
return FALSE;
}
lpszData = ( LPSTR ) GlobalLock ( hGlobal );
nBufSize = GlobalSize ( hGlobal );
if ( nBufSize >= ( UINT ) nBufSize )
{
nBufSize = nBufSize - 1;
}
if ( nBufSize <= 0 )
{
GlobalUnlock ( hGlobal );
CloseClipboard();
return FALSE;
}
lpszBuffer = new char [nBufSize + 1];
if ( NULL == lpszBuffer )
{
GlobalUnlock ( hGlobal );
CloseClipboard();
return FALSE;
}
UINT i;
for ( i= 0; i < nBufSize; ++i )
{
* ( lpszBuffer + i ) = * ( lpszData + i );
}
* ( lpszBuffer + i ) = 0;
GlobalUnlock ( hGlobal );
CloseClipboard();
EDITSTREAM es;
CString sWriteText ( lpszBuffer );
es.dwCookie = ( DWORD ) &sWriteText;
es.pfnCallback = CBStreamIn;
es.dwError = 0;
// Perform the streaming
CRichEditCtrl* rec = &(this ->GetRichEditCtrl());
rec->StreamIn ( SF_TEXT | SFF_SELECTION,es );
delete [] lpszBuffer;
return TRUE;
}
然后,重装粘贴函数,在“资源视图 ”打开“Menu"选项,如图所示,添加事件处理程序,选择在View视图 类添加消息
然后,在重载的粘贴函数里面调用ResetClipData ()就可以了
说明:重载粘贴函数后,按Ctrl+V 或者按”粘贴“按钮或者右键点击菜单“粘贴”都可以实现调用OnEditPaste()函数