CRichEditCtrl的使用

来源:互联网 发布:扫雷c语言代码 编辑:程序博客网 时间:2024/04/29 21:56

 

一.常见问题

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)&gt,(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);

如果要继续查找,修改cpmin,如

int ncount = 0;

do

{

long lpos = getricheditctrl().findtext(0, &ft);

if( -1 == lpos) break;

ft.chrg.cpmin = lpos + strlen(ft.lpstrtext);

++ncount;

}while(true);

g.以html格式保存

目前做法可先转为rtf格式,再通过rtf-to-html converter

http://www.codeguru.com/cpp/controls/richedit/conversions/article.php/c5377/

h.重载onprotected函数得到对应的消息,如粘贴等

void cmyicheditorview::onprotected(nmhdr* pnmhdr, lresult* presult)

{

enprotected* pep = (enprotected*)pnmhdr;

switch (pep->msg) {

case wm_keydown://按键,判断pep->wparam

case wm_paste://粘贴

case wm_cut://剪切

case em_setcharformat:

default:

break;

};

*presult = false;

}

三.聊天常用

a.link 链接功能

1. loadlibrary(_t("riched20.dll"));

2. 创建richedit2.0控件

createex(0, _t("richedit20a"), null, ws_child|ws_visible|ws_vscroll|ws_tabstop

|es_readonly|es_wantreturn|es_multiline,

rect.left, rect.top, cx, cy,

pparentwnd->m_hwnd, (hmenu)nid, null);

3. 设定选中的文字为链接显示

charformat2 cf2;

zeromemory(&cf2, sizeof(charformat2));//

cf2.cbsize = sizeof(charformat2);

cf2.dwmask = cfm_link;

cf2.dweffects |= cfe_link;

m_crichedit.sendmessage(em_setcharformat, scf_selection, (lparam)&cf2);

4.支持链接的点击响应

m_crichedit.seteventmask(enm_link);

5.响应链接的点击en_link

begin_message_map(cmyrichedit, cricheditctrl)

on_notify_reflect(en_link,onurl)

end_message_map()

......

void cmyrichedit::onurlclick(nmhdr *pnmhdr, lresult *presult)

{

tchar linkchar[512];

enlink *plink = (enlink *)pnmhdr;

if (plink->msg == wm_lbuttonup)

{

setsel(penlink->chrg);//这是链接的文字范围

long res = getseltext((char *)linkchar);//这是链接文字

//后面是你的处理过程

......

}

}

b.插入位图

http://www.codeguru.com/cpp/controls/richedit/article.php/c2417/

http://www.codeguru.com/cpp/controls/richedit/article.php/c5383/

自定义在richedit中插入对象的图标

http://www.blogcn.com/user3/jiangsheng/blog/1319738.html

方法基本同knowledge base文章q220844 howto: insert a bitmap into an rtf document using the richedit control

只是在最后插入之前调用一下iolecache::setdata,用一个hglobal作为参数,hglobal里面的数据是一个metafilepict结构,包含自己提供的图片

使用cricheditview::insertfileasobject就可以插入图像。vc++带有一个例子wordpad。

另外可以参考“insert any hbitmap (bitmap) in your richedit control”(http://www.codeguru.com/richedit/richeditrc.html)。

c.显示gif动画

常用的是通过qq的imageole.dll(也有用gif89.dll的)

http://www.xiaozhou.net/cooldog/blogview.asp?logid=82

http://www.codeproject.com/richedit/animatedemoticon.asp

在richedit控件中插入动态gif (native c++版)

http://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx

d.iricheditolecallback的使用

http://61.186.252.131/expert/topic/905/905844.xml?temp=.8379022

类似 msn 信息发送框的制作(上)

http://www.vckbase.com/document/viewdoc/?id=1087

内容包含:实现右键菜单,图片插入,读取/写入rtf格式字符串

自定义 cricheditctrl 控件

http://www.vckbase.com/document/viewdoc/?id=328

内容包含:鼠标右键消息,消息映射,字体变换

ps.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为arial字体,而1.0却没有这个文题,仍然是用楷体显示字母

原创粉丝点击