`
isiqi
  • 浏览: 16356510 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

RichEdit 小结...

阅读更多
一般性问题
1. 代码编译通过了,运行后RichEdit控件不显示,在InitInstance中添加
BOOL CWinApp::InitInstance ()
{
AfxInitRichEdit();- RichEdit 1.0
AfxInitRichEdit2(); - RichEdit 2.0
}
2. 升级默认的RichEdit版本,默认的版本有BUG,在InitInstance中添加
BOOL CWinApp::InitInstance ()
{
LoadLibrary("RICHED20.DLL");
FreeLibrary();
}
如果是CRichEditView基类的话,可用如下消息机制:
BOOL CRichEditView::PreCreateWindow(CREATESTRUCT& cs)
{
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;
return CRichEditView::PreCreateWindow(cs);
}
3. RichEdit控件的输入框中最后追加一行
CRichEditCtrl.SetSel(-1, -1);
CRichEditCtrl.ReplaceSel((LPCTSTR)str);
4. 限制RichEdit控件的字数
CRichEditCtrl.LimitText(long nChars)
5. 设置RichEdit控件的换行切换
如果是CRichEditView基类的话,可用如下消息机制:
BOOL CRichEditView::OnInitialUpdate()
{
m_nWordWrap = WrapNone;
WrapChanged();
}
如果是在Dialog,可使用SetTargetDevice,并在RichEdit的属性里面加上want return
CRichEditCtrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
WrapChanged实际上也是调用
CRichEditCtrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
CRichEditCtrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
CRichEditCtrl.SetTargetDevice(NULL, 2);// m_nWordWrap == WrapToTargetDevice
6. 设置RichEdit控件不带格式的数据粘贴
CRichEditCtrl.PasteSpecial(CF_TEXT);
7. 设置RichEdit控件的滚动条自动随输入滚动到最后一行
int nFirstVisible = CRichEditCtrl.GetFirstVisibleLine();
if (nFirstVisible > 0)
{
CRichEditCtrl.LineScroll(-nFirstVisible, 0);
}
CRichEditCtrl.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);

8.
设置RichEdit控件的撤销输入次数(只能用在RICHED20以上)
SendMessage(EM_SETTEXTMODE, TM_MULTILEVELUNDO, 0);
SendMessage(EM_SETUNDOLIMIT, 100, 0);
TM_MULTILEVELUNDO 支持多取消(默认值)可通过EM_SETUNDOLIMIT设置最大次数
9.设置RichEdit控件的OnChange事件
EM_SETEVENTMASK 设置 ENM_CHANGE
long lMask = GetEventMask();
lMask |= ENM_CHANGE;
lMask &= ~ENM_PROTECTED;
SetEventMask(lMask);
10.设置RichEdit控件的只读属性
CRichEditCtrl::SetReadOnly(BOOL bReadOnly = TRUE );
通过设置PROTECTED实现选中的文本只读,参见如下文章:
函数应用
1. 设置RichEdit控件的显示字体
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
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("隶书")); //设置字体
CRichEditCtrl.SetSelectionCharFormat(cf);
2.设置RichEdit控件的显示字体的行间距(只能用在RICHED20以上)
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 才起作用
1 项目符号,默认用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 才起作用,行间距
3.设置RichEdit控件的透明背景(只能用在RICHED20以上)
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
style &= WS_EX_TRANSPARENT;
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);
CreateEx(),然后把WS_EX_TRANSPARENT样式加上
4.获取或者写入RichEdit控件的内容
Ø GetWindowText
Ø 使用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);
Ø 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
5.查找RichEdit控件中的字符串
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);
6. Html格式保存RichEdit控件中的内容
临时做法可先转为RTF格式,再通过RTF-to-HTML Converter,参考如下文章:
8. 重载OnProtected函数以得到RichEdit对应的消息,如粘贴等
void CRichEditorView::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;
}
聊天常用
1. 设置RichEdit控件的链接功能(只能用在RICHED20以上)
Ø LoadLibrary(_T("Riched20.dll"));
Ø 创建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);
Ø 设置选中的文字为链接显示
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);
Ø 支持链接的点击响应
m_cRichEdit.SetEventMask(ENM_LINK);
Ø 响应链接的点击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); //这是链接文字
}
}
Ø 自动识别链接
UINT nMask = SendDlgItemMessage(IDC_RICHEDIT_MESSAGE, EM_GETEVENTMASK, 0, 0);
SendDlgItemMessage(IDC_RICHEDIT_MESSAGE, EM_SETEVENTMASK, 0, nMask | NM_LINK);
SendDlgItemMessage(IDC_RICHEDIT_MESSAGE, EM_AUTOURLDETECT, TRUE, 0);
BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR* pNmHdr = (NMHDR *)lParam;
if(pNmHdr->idFrom == IDC_RICHEDIT_MESSAGE && pNmHdr->code == EN_LINK)
{
ENLINK *pLink = (ENLINK *)lParam;
if (pLink->msg == WM_LBUTTONDOWN)
{
SendDlgItemMessage(IDC_RICHEDIT_MESSAGE, EM_EXSETSEL, 0, (LPARAM)&(pLink->chrg));
ShellExecute(GetSafeHwnd(), "open", m_wndREMessage.GetSelText(), 0, 0, SW_SHOWNORMAL);
}
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
2.RichEdit插入位图
Ø 参考如下文章:
Ø 自定义在RichEdit中插入对象的图标
3.RichEdit显示GIF动画
Ø 常用的是通过QQimageole.dll(也有用Gif89.dll)
Ø richedit控件中插入动态GIF(Native C++)
4.IRichEditOleCallback的使用
5.类似MSN信息发送框的制作()
内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串
6.自定义RichEdit控件
内容包含:鼠标右键消息,消息映射,字体变换


分享到:
评论

相关推荐

    VB.RichEdit.wrapper.class.instance..rar_richedit_richedit vb_vb

    在VB(Visual Basic)编程环境中,`RichEdit`控件是一个强大的文本编辑工具,它提供了比标准`TextBox`更多的功能,如支持RTF(Rich Text Format)格式、文本格式化、颜色设定、字体选择等。在给定的压缩包文件中,...

    RichEdit_color.rar_C Builder_edit_richedit

    在C++ Builder中,`RichEdit`控件是一种强大的文本编辑器组件,它允许用户进行格式化文本输入和显示,包括字体、颜色、样式等。本文将深入探讨如何利用`RichEdit`控件来实现文本颜色的变换,这对于创建富文本编辑器...

    RichEdit-master.zip

    "RichEdit-master.zip" 是一个开源项目,专门针对Android平台设计,提供了对富文本显示的支持。这个压缩包包含了一个名为 "RichEdit-master" 的文件夹,很可能包含了源代码、资源文件和相关的文档,以便开发者能够...

    界面相当牛叉的DELPHI richedit 记事本程序.rar

    DELPHI使用richedit仿写的记事本程序,界面相当牛叉的DELPHI richedit 记事本程序,编写的初衷:近来无意发现很多Delphi记事本的代码并不完整,所以在这整理完善下。  这款记事本的界面写的很漂亮,菜单是圆角风格...

    vs2012下RichEdit初始化例子

    在Visual Studio 2012(VS2012)环境下,开发人员经常需要使用RichEdit控件来实现文本编辑和格式化功能。本示例将深入探讨如何在MFC(Microsoft Foundation Classes)应用程序中初始化并使用RichEdit控件。 首先,...

    RichEdit控件删除行和自动滚屏

    在Windows编程中,RichEdit控件是一个非常常用的文本编辑组件,它提供了比标准Edit控件更丰富的文本格式化功能。本篇文章将详细讲解如何在 RichEdit 控件中实现删除行的操作,并结合自动滚屏功能,使得用户在进行...

    delphi 控件richedit 操作,类似记事本查找,替换,字体设计等

    在Delphi编程环境中,RichEdit控件是一种常用的文本编辑组件,它可以提供类似于Windows记事本的文本编辑功能,包括查找、替换以及字体设计等。在本文中,我们将深入探讨如何利用Delphi的RichEdit控件实现这些高级...

    richedit.rar

    而"richedit.rar"这个压缩包文件,显然与Duilib中的RichEdit控件有关,这是一个增强型的文本编辑器控件,适用于创建聊天窗口或者其他需要展示丰富内容的应用场景。 RichEdit控件相比于标准的Edit控件,支持更多的...

    RichEdit2RTF_将RichEdit的内容存入RTF文件_

    在IT行业中,富文本编辑器(RichEdit)是一种常见的用于创建和编辑富格式文本的控件,它支持多种样式和格式,如字体、颜色、段落样式等。RTF(Rich Text Format)则是微软开发的一种文件格式,用来跨平台保存和交换...

    RichEdit选中行高亮显示及加入超链接-代码

    在IT行业中,富文本编辑器(RichEdit)是一种常见的组件,用于在应用程序中提供复杂的文本编辑功能,如格式化文本、插入图片、设置字体样式等。在Delphi编程环境中,我们可以利用其强大的功能来实现一些高级特性,...

    richedit richedit

    富文本编辑器(Rich Edit)是Windows操作系统中的一个核心组件,用于支持格式化的文本输入和显示,常用于各种应用程序如文字处理软件、邮件客户端等。它提供了比标准文本编辑器更多的功能,例如字体样式控制、颜色...

    RichEdit 回车换行的2种方法

    ### RichEdit 控件回车换行的两种方法 在Windows编程中,经常需要用到文本编辑功能。其中,`RichEdit`控件因其丰富的编辑能力和自定义选项而被广泛应用于各种应用程序中。本文将详细介绍如何使`RichEdit`控件在用户...

    richedit30

    richedit30.exe 我是用在 ubuntu下安装office07的时候用的

    Replacing "RICHEDIT" control with "RichEdit20A"

    The first thing to do it change the window class name of the rich edit controls from "RICHEDIT" to "RichEdit20A" in the *.rc file. Next, we create a class derived from CRichEditCtrl called ...

    实现带行号的 richedit 控件

    "实现带行号的 richedit 控件"这一主题就是针对提升代码编辑器用户体验的一个具体实践。Microsoft的RichEdit控件是一个功能强大的文本编辑组件,常用于创建富文本格式的应用,但它本身并不直接支持显示行号。然而,...

    vc richedit 设置字体颜色

    在Windows编程中,RichEdit控件是一个非常强大的文本编辑组件,它比标准的EDIT控件提供了更多的功能,比如设置字体颜色、大小等。这个“vc richedit 设置字体颜色”的主题,主要涉及如何在Visual C++环境下利用Rich...

    RichEdit插入并显示PNG、JPG、BMP等图片及图文混排完整示例代码

    RichEdit控件显示BMP图片 代码示例: //在RichEdit中图文混排显示资源中位图 void CRichEditTestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 ..... } //在RichEdit中显示PNG、JPG、BMP等...

    richedit中表情的嵌入应用imageole.dll

    在IT行业中,富文本编辑器(RichEdit)是一种常见的用于创建和编辑富格式文本的应用程序组件,它允许用户处理各种复杂的文本格式、字体、颜色以及插入图像和其他对象。本文将详细探讨如何在RichEdit控件中嵌入表情,...

    RichEdit中插入图片,文字以及美化设置

    富文本编辑器(RichEdit)是Windows操作系统中用于创建和编辑富文本的一种控件,它支持多种格式的文本和图像,允许用户进行复杂的文本格式化和排版。本篇文章将详细探讨如何在RichEdit中插入图片、添加文字,并对...

    使用Rich Edit控件显示文本文件

    在Windows编程中,Rich Edit控件是一个非常重要的组件,它提供了比普通Edit控件更丰富的文本格式化功能,如字体、大小、颜色等的改变。本文将深入探讨如何使用Rich Edit控件来显示文本文件。 首先,理解Rich Edit...

Global site tag (gtag.js) - Google Analytics