Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9728448
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: 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插入图象,或通过图象文件的路径来插入图象。

  那么如何将文本中的字符表情,如::)、;-) 等翻译成图象呢?例如,对于字符串:
"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 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的。它们的区别是,前者把一个汉字作为两个字节处理,而后者把一个汉字作为一个字节处理。请读者区分使用。

阅读(430) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~