在RichEdit控件中加入“复制”“粘贴”等功能

由于RichEdit控件默认不支持剪切、复制和粘贴功能,可以通过派生一个新的控件类`RichEditCtrlEx`来实现这些功能。通过在资源菜单中创建右键弹出菜单,并在对应的View类中添加相应处理函数,可以为用户增加这些常见的编辑操作。

 

 

RichEdit本身好像不带“剪切”“复制”等功能,所以自己可以派生一个RichEdit的子类,加入这些功能,例如取名“RichEditCtrlEx”。

下面是这个类的一些关键成员函数:

// 叠加格式
void CRichEditCtrlEx::SetFormatRange(int nStart, int nEnd, BOOL bBold, COLORREF clr,COLORREF backclr)
{
    
if (nStart >= nEnd)
        
return;

    SetSel(nStart, nEnd);    
    DWORD dwEffects 
= bBold?CFE_BOLD:0;

    CHARFORMAT cfm;
    cfm.cbSize 
= sizeof(cfm);
        GetSelectionCharFormat(cfm);
    
    
if ((cfm.dwMask & CFM_COLOR)  && cfm.crTextColor == clr &&         
        (cfm.dwMask 
& CFM_BOLD) && (cfm.dwEffects & CFE_BOLD) == dwEffects)
        
return;

    cfm.dwEffects 
= dwEffects;
    cfm.crTextColor 
= clr;
    cfm.dwMask 
= CFM_BOLD | CFM_COLOR;

    SetSelectionCharFormat(cfm);

    
// 加入选择
    HIRange hirange;
    hirange.rng.cpMin 
= nStart;
    hirange.rng.cpMax 
= nEnd;

    GetSelectionCharFormat(cfm);
    hirange.cmf 
= cfm;
    m_HiRange.Add(hirange);        
}



// 清除格式
void CRichEditCtrlEx::ClearAllFormatRange()
{
    
for(int i = 0; i<m_HiRange.GetSize(); i++)
    
{
        HIRange hirange 
= m_HiRange[i];

        CHARFORMAT def;
        GetDefaultCharFormat(def);
        def.dwMask 
= CFM_COLOR|CFM_BOLD;

        SetSel(hirange.rng.cpMin,hirange.rng.cpMax);
        SetSelectionCharFormat(def);
    }


    m_HiRange.RemoveAll();
}



void CRichEditCtrlEx::BeginFormat()
{
    
// 首先获取当前选择区域
    GetSel(m_OldSel);
    LockWindowUpdate();
      HideSelection(TRUE, FALSE);
}



void CRichEditCtrlEx::EndFormat()
{
    
// 还原选择区域
    SetSel(m_OldSel);
    HideSelection(FALSE, FALSE);
      UnlockWindowUpdate();
}



void CRichEditCtrlEx::OnContextMenu(CWnd* pWnd, CPoint point) 
{    
    
//设置为焦点   
    SetFocus();   
    
    
//创建一个弹出式菜单   
    CMenu   tPopmenu;   
    tPopmenu.CreatePopupMenu();   
    
    
//添加菜单项目   
    tPopmenu.AppendMenu(0,   ID_RICH_COPY,   _T("复制   (&C)"));   
    tPopmenu.AppendMenu(
0,   ID_RICH_PASTE,   _T("粘帖   (&P)"));   
    tPopmenu.AppendMenu(
0,   ID_RICH_CUT,   _T("剪切   (&X)")); 
    
    
//初始化菜单项   
    long lTextLen = GetTextLength();       
    UINT nSelText 
= ( (lTextLen > 0&& (GetSelectionType() != SEL_EMPTY) ) ? MF_ENABLED : MF_GRAYED;   
    tPopmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND
|nSelText);   

    
//显示菜单   
    CPoint   pt;   
    GetCursorPos(
&pt);   
    tPopmenu.TrackPopupMenu(TPM_RIGHTBUTTON,   pt.x,   pt.y,   
this);   
    tPopmenu.DestroyMenu();       
}


void CRichEditCtrlEx::OnCopyMenu()
{
    Copy(); 
// 拷贝    
}



void CRichEditCtrlEx::OnCopyPaste()
{
    Paste();
// 粘贴
}



void CRichEditCtrlEx::OnCopyCut()
{
    Cut();
// 剪切
}

 

然后在资源“Menu”中新建一个单击鼠标右键弹出的小菜单,在.rc中查看时即为(懒得贴图了-_-):

IDR_MENU2 MENU DISCARDABLE 
BEGIN
    POPUP 
"菜单"
    BEGIN
        MENUITEM 
"复制",                        ID_RICH_COPY
        MENUITEM 
"粘贴",                        ID_RICH_PASTE
        MENUITEM 
"剪切",                        ID_RICH_CUT
    END
END

最后在所用的View类中加入这个函数即可:

BOOL CXXXView::PreTranslateMessage(MSG* pMsg) 
{
    
// 响应键盘快捷键
    if  (pMsg->message==WM_KEYDOWN)  
    
{  
        
switch(pMsg->wParam)  
        
{  
        
case  0x41:  //selete  all  
        case  0x46:  //ctrl+f
        case  0x56:  //paste
        case  0x58:  //cut
        case  0x43:  //copy
        case  0x5A:  //undo
        case  0x59:  //redo
            if  ((GetKeyState(VK_CONTROL) & 0x80))  
            
{  
                m_ctrlxxx.SendMessage(pMsg
->message,  pMsg->wParam,  pMsg->lParam);  
                
return  TRUE;  
            }
  
            
break;  
        }
  
    }

    
    
return  CFormView::PreTranslateMessage(pMsg);  
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值