WinForm:IM聊天用的Richtextbox

我们经常使用一些文本控件,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也给也了其详细的介绍

 

通过以上这些,也完成了以上窗体控件的操作,此时如MSNQQSKYPE那样效果的聊天控件再研究下下应该就都可以做了。

 

这里只是做一个比较完整的控件的介绍,资料大部分是网上学习,COPY得来的,也只是简单的封装以上的类,如有需要,就留下EMAIL吧,不过,其实只要看了那两个DEMO,应该就都能做了。这里尊重作者,就不乱贴了。。。。

 

上网找资料时,看到的都是问得多,答得少,就把常见的主要的问题都解决一下,嘿嘿,加油,继续我的VortexIM

 

这里并不涉及SOCKET,个人觉得,IM通信编程难点还是在服务器上,我们采用的是以c++编写的完成端口模型,而客户端则是在用户体验上

 

 

posted @ 2008-09-06 20:20  yellowyu  阅读(4816)  评论(5编辑  收藏  举报