CRichEditCtrl 超文字編輯

2021-04-26 18:37:25 字數 4357 閱讀 5558

一.常見問題

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的窗體資源以及該窗體對應的處理類 建立乙個錄入查詢文...