我们经常使用一些文本控件,RichTextbox即是其中最最为经常使用的一种,而我们谁注意过,我们在用IM聊天时,无论是MSN,QQ,SKYPE他们的文本显示,都显得那么灵活,舒服,而这并不只是RichTextbox几个属性即能做到的
以下即是今天刚完成的Richtextbox的效果
或许你一直在用,而你不曾注意过,可当你做的时候,才发现,这并不是一两个属性即完成的。。。。
难点在那呢!
1:字体背景颜色,并且自定义大小
2:插入链接,不以http://www开头的哦
3:插入图片
4:取消链接
5:与左边框的间距,让别人清楚那些是聊天内容,那些是呢称
而这里面最主要的一点即是,涉及到RTF的内容,正如袁永福先生在其博客里所说到:“它是一种很古老的技术,却一直到现在还在广泛的使用,而且估计还能用上很长一段时期。其实我们在学习不断出现的新技术的时候,也可以注意那些古老的但经过时间考验的技术。”
摘自:http://www.cnblogs.com/xdesigner/archive/2007/10/22/932737.html
这里不想过多的提及RTF,在袁先生的博文里有很详细的描述,而两百多页的官方文档确实让人不敢启及,有谁需要的,可留下EMAIL,或者到微软MSDN下载,
在这里给出一个DEMO,其实以上80%的代码都来自于此例子,嘿嘿
http://www.codeproject.com/KB/edit/csexrichtextbox.aspx
作者很热心地开源了一个支持以上难点,1,3的问题所在,里面介绍了插入文本与插入图片,也指出了需要改进的地方
而插入链接,则是在另一份文章里面有介绍http://www.codeproject.com/KB/edit/RichTextBoxLinks.aspx
作者里原先是不支持插入中文链接,只需将其RTF的表头改下就可以了
this.SelectedRtf = @"{"rtf1"ansi"ansicpg936"deff0"deflang1033"deflangfe2052 " + text + @""v #" + hyperlink + @""v0}";
其设置链接最主要的一点还是
private void SetSelectionStyle(UInt32 mask, UInt32 effect)
{
CHARFORMAT2_STRUCT cf = new CHARFORMAT2_STRUCT();
cf.cbSize = (UInt32)Marshal.SizeOf(cf);
cf.dwMask = mask;
cf.dwEffects = effect;
IntPtr wpar = new IntPtr(SCF_SELECTION);
IntPtr lpar = Marshal.AllocCoTaskMem( Marshal.SizeOf( cf ) );
Marshal.StructureToPtr(cf, lpar, false);
IntPtr res = SendMessage(Handle, EM_SETCHARFORMAT, wpar, lpar);
Marshal.FreeCoTaskMem(lpar);
}
主要还是SETCHARFORMAT这个消息设置,老的MFC coder可能会比较熟,这也说明,其实不管C#,C++底层其实并不相差太多,都是WINDOWS,嘿嘿
而取消链接,其实这里面最主要的一点是定位,则是CSDN另一朋友(好久以前不经意提醒过偶,现忘了他的地址了,改天发现再贴上来)
则是通过
rtbox_MessageHistory.SelectionStart = rtbox_MessageHistory.GetCharIndexFromPosition(rtbox_MessageHistory.PointToClient(Control.MousePosition));
rtbox_MessageHistory.Select(rtbox_MessageHistory.SelectionStart - 2, 4);
if (e.LinkText.Contains(strCancel))
{
rtbox_MessageHistory.SetSelectionLink(false);
rtbox_MessageHistory.AppendText("您已经取消了和远程好友的语音请求。"r"n");
}
这种方式来取消掉
而与左边框的间距,是比较简单的一点
//设置与左边距的间距
this.Select(position, _rtf.Length - 1);
this.SelectionIndent = intIndent;
通过SelectionIndent这个属性设置,而MSDN也给也了其详细的介绍
通过以上这些,也完成了以上窗体控件的操作,此时如MSN,QQ,SKYPE那样效果的聊天控件再研究下下应该就都可以做了。
这里只是做一个比较完整的控件的介绍,资料大部分是网上学习,COPY得来的,也只是简单的封装以上的类,如有需要,就留下EMAIL吧,不过,其实只要看了那两个DEMO,应该就都能做了。这里尊重作者,就不乱贴了。。。。
上网找资料时,看到的都是问得多,答得少,就把常见的主要的问题都解决一下,嘿嘿,加油,继续我的VortexIM
这里并不涉及SOCKET,个人觉得,IM通信编程难点还是在服务器上,我们采用的是以c++编写的完成端口模型,而客户端则是在用户体验上