分类: C/C++
2008-04-23 21:53:46
一个在RichEdit中添加表情图象的类
作者:中原工学院
说明
本文根据VC知识库《在线杂志》的第30期的一篇文章:《类似 MSN 信息发送框的制作》,介绍了一个可以在RichEdit中添加表情图象的类CFaceEdit。
以下是使用这个类的程序截图:
图一 CFaceEdit类的使用
使用方法
我们可以先看一下它的使用方法:
//将对话框类成员变量由CRichEditCtrl改为CFaceEdit CFaceEdit m_FaceEdit; //自定义一组表情 CString pSymbol[] = {":)", ":(", ";)", ":0", ";-)"}; //表情对应的图象ID UINT 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插入图象,或通过图象文件的路径来插入图象。
/*----------------------------------------------------------------------------- * 函数名 :SetTextWithFace * * 功能 :实现插入图象的算法函数。 * 实现原理: 假设:CString pSymbol[] = {":)", ":(", "#", "AK47", ":-)"}; 先将包括表情符号的文本( 如:"haha:)" )直接显示到CRichEditCtrl中, 然后选定其中的表情符号( 如:":)" ),再调用InsertBitmap函数 实现插入,详见注释 -----------------------------------------------------------------------------*/ void CFaceEdit::SetTextWithFace(CString str) { CString *pstr = new CString[m_nfaceCount]; for(int n = 0; nvecFace; //vecFace[0]表示第一个表情的位置和型号、vecFace[1]表示第二的位置和型号… /* ************************************************************************ * 第一步: * 在str中查找表情字符(pstr)。 * * 如str = "我们的:-)明天更美好AK47,一定:-)非常美好#。"。那么以下操作将生成四个 * stFace(定义见FaceEdit.h)结点,它们的值分别为{3, 3, 3}, {15, 3, 4}, {10, 1, 3}, {21, 0, 1}。 * 使用vector数组vecFace进行存储。 * * *************************************************************************/ for(int i=0, m = -1; i 注意事项
本类有两个版本,一个是针对RichEdit 1.0的,另一个是针对RichEdit 2.0的。它们的区别是,前者把一个汉字作为两个字节处理,而后者把一个汉字作为一个字节处理。请读者区分使用。