一.常见问题
a.可以编译,不能执行的 AfxInitRichEdit();
b.升级默认的Riched版本(默认的有一些bug),如可在InitInstance中添加LoadLibrary("RICHED20.DLL") 最后注意 FreeLibrary
如果是CRichEditView基类的可用 BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs) { //装入rich edit version 2.0 if (LoadLibraryA("RICHED20.DLL") == NULL) { AfxMessageBox(_T("Fail to load /"riched20.dll/"."),MB_OK | MB_ICONERROR); PostMessage(WM_QUIT,0,0); return FALSE; }
m_strClass = RICHEDIT_CLASSA;//for 2.0 class
return CRichEditView::PreCreateWindow(cs); }
c.最后追加行 richeditctrl.SetSel(-1, -1); richeditctrl.ReplaceSel( (LPCTSTR)str );
d.字数限制 CRichEditCtrl::LimitText(long nChars)
e.换行切换
CRichEditView的OnInitialUpdate()函数中加入下面两句: m_nWordWrap = WrapNone; WrapChanged(); WrapChanged实际上也是调用 ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow 还有不常用的 m_nWordWrap == WrapToTargetDevice ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth()); 如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return
f.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴 pmyRichEditCtrl->PasteSpecial(CF_TEXT);
g.随着输入随着自动滚动条滚动到最后一行 int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine(); if (nFirstVisible > 0) { pmyRichEditCtrl->LineScroll(-nFirstVisible, 0); } 或 m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
h.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级) SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0); TM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数 SendMessage(EM_SETUNDOLIMIT,100,0);
i.响应OnChange EM_SETEVENTMASK 设置 ENM_CHANGE long lMask = GetEventMask(); lMask |= ENM_CHANGE; lMask &= ~ENM_PROTECTED; SetE