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)>,(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却没有这个文题,仍然是用楷体显示字母
- CRichEditCtrl的使用
- CRichEditCtrl的使用
- CRichEditCtrl的使用(很全面)
- 使用CRichEditCtrl的stream功能读写文件
- CRichEditCtrl控件的使用方式 追加显示
- CRichEditCtrl 使用技巧
- CRichEditCtrl使用大全
- CRichEditCtrl简单使用
- WTL 中使用 CRichEditCtrl
- CRichEditCtrl使用大全
- CRichEditCtrl 使用技巧
- CRichEditCtrl使用大全
- WTL 中使用CRichEditCtrl
- CRichEditCtrl使用大全
- CRichEditCtrl使用大全
- CRichEditCtrl使用大全
- CRichEditCtrl使用大全
- CRichEditCtrl使用大全
- pku 1050 菜鸟就是笨简单dp搞半天!
- mssql 分页程序
- suffix tree,python 版
- 捕获Unhandled Exception-友好退出你的程序
- struts框架bean,html,logic标签
- CRichEditCtrl的使用
- xmu 1117 菜鸟也比赛 觉的自己的方法不错!自恋一下!
- 面试技巧:16个经典面试问题回答思路(转)
- 《Beginning Python From Novice to Professional》学习笔记八:Abstraction
- 100%原创的N进制转换成M进制的C++程序
- 怎么样学习java?
- Excel释放进程
- 《互联网安全保护管理办法》
- WEB架构思想——瓶颈分析(一)