经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Windows » 查看文章
C#实现聊天消息渲染、图文混排(支持Windows、Linux)
来源:cnblogs  作者:zhuweisky  时间:2023/2/8 8:58:28  对本文有异议

  在实现聊天软件时,渲染文字表情图文混排是一项非常繁琐的工作,再加上还要支持GIF动图、引用消息、撤回消息、名片等不同样式的消息渲染时,就更加麻烦了。

       好在我们可以使用 ESFramework 提供的 IChatRender 组件,使用它我们就能轻松实现类似于微信聊天消息的渲染效果。IChatRender 支持 Windows、Linux(包括国产OS)。在Windows平台上提供了基于 WinForm 和基于 WPF 的实现,在Linux上则是基于.NET Core 实现的。

  废话不多说,先上张渲染Demo的效果图(该Demo源码可于文末下载):   

       

  效果还不错吧!下面我们就简单介绍下如何使用 IChatRender 实现上图所展示的渲染效果,大家下载源码对照着看,会更容易理解。

一.  支持的聊天消息类型

      IChatRender 支持渲染的聊天消息类型包括: 

(1)文本表情混排。

(2)图片,GIF 动图。

(3)文件传输进度及控制。

(4)个人名片、群名片。

(5)引用消息。

(6)语音消息。

(7)语音通话。

(8)视频通话。 

(9)撤回消息、删除消息。       

二. IChatRender 接口定义

    IChatRender 接口的定义具体如下所示:

  1.    /// <summary>
  2. /// 渲染名片
  3. /// </summary>
  4. /// <param name="msgID">聊天记录ID</param>
  5. /// <param name="userID">发送者</param>
  6. /// <param name="cardUserID">名片上的个人ID</param>
  7. /// <param name="index">插入聊天记录的位置,默认是放到最后面</param>
  8. void AddChatItemCard(string msgID ,string userID, string cardUserID ,int? index = null);
  9. /// <summary>
  10. /// 渲染文件
  11. /// </summary>
  12. /// <param name="fileName">文件名称</param>
  13. /// <param name="fileSize">文件大小</param>
  14. /// <param name="state">文件状态</param>
  15. void AddChatItemFile(string msgID, string userID, string fileName, ulong fileSize, FileTransState state, int? index = null);
  16. /// <summary>
  17. /// 渲染图片
  18. /// </summary>
  19. /// <param name="image">图像</param>
  20. /// <param name="imgSize">图像大小</param>
  21. /// <param name="observerable">默认传null</param>
  22. void AddChatItemImage(string msgID, string userID, object image, Size imgSize ,IProgressObserverable observerable = null, int? index = null);
  23. /// <summary>
  24. /// 渲染文本表情
  25. /// </summary>
  26. /// <param name="text">内容,在渲染文本的内容中用 [000]来代表第一个表情,[001]即是二个表情,以此类推</param>
  27. /// <param name="referenced">引用内容可以是文本、图片、文件或名片</param>
  28. /// <param name="textColor">文字颜色</param>
  29. void AddChatItemText(string msgID, string userID, string text, ReferencedChatMessage referenced = null, Color? textColor = null, int? index = null);
  30. /// <summary>
  31. /// 渲染悄悄话,默认显示内容—>> 悄悄话
  32. /// </summary>
  33. void AddChatItemSnap(string msgID, string userID, int? index = null);
  34. /// <summary>
  35. /// 渲染语音消息
  36. /// </summary>
  37. /// <param name="audioMessageSecs">语音时长</param>
  38. /// <param name="audioMessage">语音短信</param>
  39. void AddChatItemAudio(string msgID, string userID, int audioMessageSecs, object audioMessage, int? index = null);
  40. /// <summary>
  41. /// 渲染多媒体通话类型
  42. /// </summary>
  43. /// <param name="duration">通话时长</param>
  44. /// <param name="isAudioCommunicate">通话类型(语音/视频)</param>
  45. void AddChatItemMedia(string msgID, string userID, string duration, bool isAudioCommunicate, int? index = null);
  46. /// <summary>
  47. /// 渲染系统消息
  48. /// </summary>
  49. /// <param name="msg">系统消息内容</param>
  50. void AddChatItemSystemMessage(string msg, int? index = null);
  51. /// <summary>
  52. /// 渲染消息的发送时间
  53. /// </summary>
  54. /// <param name="dt">发送时间</param>
  55. void AddChatItemTime(DateTime dt, int? index = null);
  56. /// <summary>
  57. /// 自己撤回消息
  58. /// </summary>
  59. void RecallChatMessage(string msgID);
  60. /// <summary>
  61. /// 其他用户撤回消息
  62. /// </summary>
  63. /// <param name="operatorName">操作者</param>
  64. void RecallChatMessage(string msgID ,string operatorName);
  65. /// <summary>
  66. /// 删除对应的记录
  67. /// </summary>
  68. void RemoveChatMessage(string msgID);

三.  创建 IChatRender 实例

       可以通过调用ESFramework.Extensions.ChatRendering.ChatRenderFactory 的静态方法 CreateChatRender 创建一个 IChatRender 实例。

  1. /// <param name="provider">提供必要的信息给聊天渲染器</param>
  2. /// <param name="ctrl">要在其表面渲染的UI控件</param>
  3. /// <param name="myID">自己的ID</param>
  4. /// <param name="destID">对方ID、或群ID</param>
  5. /// <param name="isGroup">群聊/单聊</param>
  6. /// <returns></returns>
  7. public static IChatRender CreateChatRender(IRenderDataProvider provider, IChatControl ctrl, string myID, string destID, bool isGroup);

      第一个参数 IRenderDataProvider 用于在 IChatRender  渲染时,能从该接口获取必要的信息(如用户的头像、名称、表情图片等)。 

      第二个参数 则是要在其表面进行渲染的UI控件。 

四. Demo 源码下载

      ChatRenderDemo 源码链接: Windows 端 + Linux 端 源码

      源码解决方案中包括三个项目:

(1)ChatRenderDemo.WPF:   该Demo的Windows端(基于WPF)。

(2)ChatRenderDemo.WinForm: 该Demo的Windows端(基于WinForm)。 

(3)ChatRenderDemo.Linux:     该Demo的Linux客户端(基于.NetCore),支持在统信UOS、银河麒麟等国产OS上运行。  

 注:Linux 端内置的是x86/x64非托管so库,若需要其它架构的so,可以评论区留下email,到时我会发给大家。  

 

原文链接:https://www.cnblogs.com/zhuweisky/p/17095413.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号