分类: 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; n vecFace; //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的。它们的区别是,前者把一个汉字作为两个字节处理,而后者把一个汉字作为一个字节处理。请读者区分使用。