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

被折叠的 条评论
为什么被折叠?



