Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1666085
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2012-01-27 02:12:39

CRichEditCtrl粘贴纯文本
分类: 2.1 VC++/MFC 195人阅读 评论(0) 收藏 举报

系统环境: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()函数

 

阅读(699) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~