一.常见问题
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; SetEventMask(lMask); j.设置只读 CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE ); 通过设置PROTECTED实现选中的文本只读,参见 http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/ 二.函数应用 a.设置字体(主要是通过SetSelectionCharFormat) CHARFORMAT cf; rich.GetSelectionCharFormat(cf); cf.dwMask|=CFM_BOLD; cf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD; cf.dwMask|=CFM_ITALIC; cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC; cf.dwMask|=CFM_UNDERLINE; cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE; cf.dwMask|=CFM_COLOR; cf.crTextColor = RGB(255,0,0);//设置颜色 cf.dwMask|=CFM_SIZE; cf.yHeight =200;//设置高度 cf.dwMask|=CFM_FACE; strcpy(cf.szFaceName ,_T("隶书"));//设置字体 rich.SetSelectionCharFormat(cf); b.设置字体的行间距 要用richedit2.0以上 试试 PARAFORMAT2 pf; pf.cbSize = sizeof(PARAFORMAT2); pf.dwMask = PFM_NUMBERING | PFM_OFFSET; pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING pf.dxOffset = 10; VERIFY(SetParaFormat(pf)); 常用的dwMask有 PFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET 2 使用阿拉伯数字 (1, 2, 3, ...). 3 使用小写字母 (a, b, c, ...). 4 使用大写字母 (A, B, C, ...). 5 使用小写罗马数字 (i, ii, iii, ...). 6 使用大写罗马数字 (I, II, III, ...). 7 自定义,字符见成员 wNumberingStart. PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips PFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进 PFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距 PFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距 c.设置CRichEditCtrl(2.0)背景透明 long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE); style &= WS_EX_TRANSPARENT; ::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style); 或 CreateEx,然后把WS_EX_TRANSPARENT样式加上 e.得到内容有三种 1)GetWindowText 2)使用EM_GETTEXTEX GETTEXTEX gt; gt.cb = 200; gt.flags = GT_DEFAULT; gt.codepage = CP_ACP ; gt.lpDefaultChar = NULL; gt.lpUsedDefChar = NULL; SendMessage(EM_GETTEXTEX,(WPARAM)>,(LPARAM)text); 3)StreamOut(主要用于RTF等格式输出) static DWORD CALLBACK MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { CFile* pFile = (CFile*) dwCookie; pFile->Write(pbBuff, cb); *pcb = cb; return 0; } CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite); EDITSTREAM es; es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用 es.pfnCallback = MyStreamOutCallback; pmyRichEditCtrl->StreamOut(SF_RTF, es); 读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn f.查找字符串 FINDTEXTEX ft; ft.chrg.cpMin = 0; ft.chrg.cpMax = -1; ft.lpstrText = "|"; long lPos = FindText(0, &ft); |
CRichEditCtrl
最新推荐文章于 2023-08-29 09:29:41 发布