当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 一个在RichEdit中添加表情图象的类

VC++
用VC++创建自定义向导程序
自定义 CRichEditCtrl 控件
Office 2000 风格的停泊、智能型菜单
黑客攻击手段之偷梁换柱
完善 CPopupText 类
让工具条显示256色图像
定制编辑框的上下文菜单
列表控件排序功能的实现
一个优秀的网格控件CGridCtrl
如何用代码动态添加控件
如何在编辑框中使用IAutoComplete接口
应用程序中添加“Coolbars”的简单方法
介绍一个有Toolbar功能的可重用类 CPopupText
在工具栏按钮上添加文本标签
类似Dreamweaver的颜色选择器
如何设置ListView控件的完全行(Full Row)选项
如何enable/disable菜单项
关于CEdit控件的透明 --作者:monsoon
动态菜单项、状态条提示、工具条提示问题
CAnimateCtrl::Open的使用问题

VC++ 中的 一个在RichEdit中添加表情图象的类


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 151 ::
收藏到网摘: n/a

一个在RichEdit中添加表情图象的类

作者:中原工学院 刘翔

下载源代码

说明
  本文根据VC知识库《在线杂志》的第30期的一篇文章:《类似 MSN 信息发送框的制作》,介绍了一个可以在RichEdit中添加表情图象的类CFaceEdit。 以下是使用这个类的程序截图:


图一 CFaceEdit类的使用

使用方法
  我们可以先看一下它的使用方法:

//将对话框类成员变量由CRichEditCtrl改为CFaceEditCFaceEdit m_FaceEdit;//自定义一组表情CString pSymbol[] = {":)", ":(", ";)", ":0", ";-)"};//表情对应的图象IDUINT nIDBmp[] = { IDB_BITMAP1, IDB_BITMAP2, IDB_BITMAP3, IDB_BITMAP4, IDB_BITMAP5};m_FaceEdit.Init(5, pSymbol, nIDBmp);......m_FaceEdit.SetText("Visual Studio 包括许多示例:),用以说明开发人员为.NET 平台;)创建的应用程序:-) 。");
也可以以位图文件的形式导入位图:
CString sBmpFile[] = {"res\\kid.bmp", "res\\sad.bmp", "res\\showoff.bmp", "res\\quip.bmp", "res\\maze.bmp"};m_FaceEdit.Init(5, pSymbol, sBmpFile);...m_FaceEdit.SetText("Visual Studio 包括许多示例:),用以说明开发人员为.NET 平台;)创建的应用程序:-) 。");
  插入图象的主要原理,是由《类似 MSN 信息发送框的制作》一文中提供的InsertBitmap()函数实现的。该函数可以通过指定图象的ID插入图象,或通过图象文件的路径来插入图象。

  那么如何将文本中的字符表情,如::)、;-) 等翻译成图象呢?例如,对于字符串:
"Visual Studio 包括许多示例:),用以说明开发人员为.NET 平台;)创建的应用程序:-)。"

翻译之后,变成:
"Visual Studio 包括许多示例,用以说明开发人员为.NET 平台创建的应用程序。"

如何实现呢?
  在使用InsertBitmap()函数插入图象时,我发现只要先将RichEdit中的某一段文本内容选中,然后再调用InsertBitmap()函数,便可实现将选定内容替换成图象。如:
"Visual Studio 包括许多示例:),用以说明开发人员为.NET 平台;)创建的应用程序:-)。"

再调用InsertBitmap()函数:
"Visual Studio 包括许多示例,用以说明开发人员为.NET 平台;)创建的应用程序:-)。"

  后面的符号只要使用相同的方法处理即可。明白了这一点,想要实现转换图象的功能也就不难了。我们可以使用CRichEditCtrl::SetSel()来实现,不过在此之前,要对各表情字符的一些信息,如位置、表情类型、长度等进行保存,以下是翻译文本的函数的代码:
/*-----------------------------------------------------------------------------* 函数名 :SetTextWithFace** 功能 :实现插入图象的算法函数。* 实现原理: 假设:CString pSymbol[] = {":)", ":(", "#", "AK47", ":-)"}; 先将包括表情符号的文本( 如:"haha:)" )直接显示到CRichEditCtrl中, 然后选定其中的表情符号( 如:":)" ),再调用InsertBitmap函数 实现插入,详见注释-----------------------------------------------------------------------------*/void CFaceEdit::SetTextWithFace(CString str){ CString *pstr = new CString[m_nfaceCount]; for(int n = 0; n<m_nfaceCount; n++) { pstr[n] = m_pSymbol[n]; } SetWindowText(str); int nFaceCount = 0; //str中共有多少个表情。 stFace faceNode; //faceNode中存储的是在哪个位置插入,插入哪一个表情。 vector <stFace> vecFace; //vecFac