一.常見問題
a.可以編譯,不能執行的
afxinitrichedit(); //此句不要忘了加
b.公升級預設的riched版本(預設的有一些bug),如
可在initinstance中新增
loadlibrary("riched20.dll")
最後注意 freelibrary
如果是cricheditview基類的可用
bool c******view::precreatewindow(createstruct& cs)
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)
或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實現選中的文字唯讀,參見
二.函式應用
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 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 超文字編輯
一.常見問題 a.可以編譯,不能執行的 afxinitrichedit 此句不要忘了加 b.公升級預設的riched版本 預設的有一些bug 如 可在initinstance中新增 loadlibrary riched20.dll 最後注意 freelibrary 如果是cricheditview基...
關於CRicheditctrl分頁列印問題
研究了好久,終於解決了,可以支援cricheditctrl列印。void printrich zeromemory di,sizeof di di.cbsize sizeof docinfo di.lpszdocname t test di.lpszoutput t c users desktop ...
CRichEditCtrl中實現查詢功能
在我的乙個程式中,需要提供類似於記事本的查詢功能。如圖 我寫此文的目的是想向初學mfc的朋友們介紹 如何通過cricheditctrl來實現文字查詢 如何在窗體間傳送訊息 實現文字查詢功能,大致分為以下幾步 建立乙個包含有cricheditctrl的窗體資源以及該窗體對應的處理類 建立乙個錄入查詢文...