下载本资源原文网址:http://www.daima.org/net/net4000.html 自从微信出来后,语音消息和语音留言变得非常流行,按下一个键说话,比打字要方便多了。GG在V3.6版本增加了对语音消息和语音留言(或称为离线语音消息)的支持。这两个功能的实现已经很完整,只是比较遗憾的一点是:GG所使用的文本框控件,还没有办法像微信的聊天窗口的文本框那样嵌入表示语音消息的控件,所以,我不得不把接收到的语音消息使用一个下拉列表罗列出来,实在很无奈。 一.GG V4.5 新增功能展现 1.聊天记录:支持本地保存和服务器端保存两种方式。 2.好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 3.托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。 4.登录状态:在线、离开、忙碌、勿打扰、隐身。当修改自己的状态时,好友能同步看到自己的最新状态。 5.动态表情:聊天框支持插入GIF图片、动态表情,并播放动画。 6.输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。 7.自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 8.打开聊天窗口时,自动显示上次交谈的最后一句话。(可以通过系统设置来关闭该功能)
二.实现思路 虽然提供了源代码,但是,我还是想将主要的思路列一下,这样,大家理解起源码来,会节省更多的时间。 1. 聊天记录的本地存储采用的是Sqlite数据库,服务端存储目前是在内存中虚拟的数据库。 2. 从服务器读取聊天记录,使用的是Remoting技术。IRemotingService 接口的GetChatRecordPage方法以及GetGroupChatRecordPage方法。 3. 好友分组的背后原理:User类的Friends字段,其值是类似这样的 -- 我的好友:10000,10001,1234;家人:1200,1201;同学:1300,1301 (1)通过分号区隔不同的分组 (2)通过冒号区隔分组名称与好友列表。 (3)通过逗号区隔不同的好友ID。 (4)另外,User类还有个DefaultFriendCatalog字段,这个用来存储默认分组的名称(初始值为”我的好友“),默认分组的名称可以被改变,但是不能被删除。(这一点也是完全模仿QQ的) 4. 托盘闪动的实现主要集中于TwinkleNotifyIcon组件,无论是个人聊天消息还是组聊天消息,首先被push进TwinkleNotifyIcon,使其闪烁,当点击TwinkleNotifyIcon,再把消息提取出来显示。 5. 输入提醒的背后原理: (1)当检测到聊天输入框的内容发生变化时(TextChanged事件),就发送一个InputingNotify类型的消息给对方,并控制两个该消息的最小间隔为5秒。 (2)对方一旦收到InputingNotify通知,就立即显示”正在输入“的Label。 (3)如果对方连续10秒都再没收到InputingNotify通知,则将将正在输入的状态改为false。(ChatForm的CheckInptingVisiable方法) (4)当对方接收到聊天消息,立即将正在输入的状态改为false,然后,再等待下一个InputingNotify通知。 6.自动记录功能,是使用本地文件来记录窗体的位置信息的,详见SystemSettings类的ChatFormSize、MainFormSize、MainFormLocation、Font等属性。 7.打开聊天窗体时,显示上次聊天的最后一句话:该功能是利用了User类的Tag字段来存储最后一句话信息。而且好友信息(User类的实例)是会被持久化在本地文件中的。 更新日志: 在最新的GG 4.5中,增加了对聊天消息进行加密的功能,但这一功能并不是强制的,可以通过开关来进行控制。 |