CRichEditCtrl粘贴纯文本

系统环境: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 ()就可以了

void CTest_editView::OnEditPaste()
{
     // TODO: 在此添加命令处理程序代码
    ResetClipData();
}

说明:重载粘贴函数后,按Ctrl+V 或者按”粘贴“按钮或者右键点击菜单“粘贴”都可以实现调用OnEditPaste()函数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值