C#仿QQ聊天程序v1.0(IConnectionList接口实现)
C#仿QQ聊天程序v1.0(IConnectionList接口实现)
IConnectionList接口定义 /// <summary> /// 用户在线列表接口 /// </summary> public interface IConnectionList { /// <summary> /// 批量添加用户列表。 /// </summary> /// <param name="connList"></param> void AddConnection(IList connList); /// <summary> /// 添加一个用户连接 /// </summary> /// <param name="conn"></param> void AddConnection(ChatConnection conn); /// <summary> /// 在指定位置插入用户连接 /// </summary> /// <param name="position"></param> /// <param name="conn"></param> void AddConnection(int position, ChatConnection conn); /// <summary> /// 删除一个用户连接 /// </summary> /// <param name="account"></param> void RemoveConnection(string account); /// <summary> /// 检查该用户是否在用户列表之中 /// </summary> /// <param name="account"></param> /// <returns></returns> bool IsConnectionExists(string account); /// <summary> /// 设置指定用户状态 /// </summary> /// <param name="account"></param> /// <param name="state"></param> void SetConnectionState(string account, ChatState state); /// <summary> /// 当用户接受到消息,用户图标自动闪烁(如QQ那样跳动) /// </summary> /// <param name="account"></param> void FlashConnection(string account); /// <summary> /// 停止跳动 /// </summary> /// <param name="account"></param> void StopFlash(string account); /// <summary> /// 关闭所有用户 /// </summary> void CloseAll(); void CloseAll(bool removeUser); /// <summary> /// 增加接收到的消息,加入到聊天记录文件。 /// </summary> /// <param name="sender"></param> /// <param name="message"></param> /// <returns></returns> int AddReceivedMessage(string sender, string message); /// <summary> /// 返回所有连接 /// </summary> /// <returns></returns> IList GetConnections(); /// <summary> /// 返回选中的用户 /// </summary> /// <returns></returns> ChatConnection GetSelectedConnection(); /// <summary> /// 返回指定的用户连接 /// </summary> /// <param name="account"></param> /// <returns></returns> ChatConnection GetConnection(string account); /// <summary> /// 显示用户类型(按部门或显示所有用户) /// </summary> ShowUser ShowUserType { get; set; } } IConnectionList接口实现 /// <summary> /// 用户自定义控件,实现IConnectionList接口 /// 该用户控件显示所有在线用户。 /// </summary> public partial class ucConnections : UserControl, IConnectionList { private ImageSize _ImageSize = ImageSize.Large; //显示图标样式(大图/小图) private ArrayList _flashs = new ArrayList(); //闪烁图标队列 private Hashtable _receivedMsg = new Hashtable(); //接收到的消息 private IList _connections = new ArrayList();//在线用户 private bool _enableFlash = true;//启动/停止闪烁图标 private NavBarItemLink _hotLink = null;//当前选中的Item private ShowUser _ShowUserType = ShowUser.All;//显示用户类型 public ucConnections() { InitializeComponent(); } private void ucConnections_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; if (_enableFlash) timerFlash.Start(); } //显示用户类型 public ShowUser ShowUserType { get { return _ShowUserType; } set { _ShowUserType = value; } } public void RemoveConnection(string account) { try { NavBarItem item = GetNavBarItemByAccount(account); if (item == null) return; if (_flashs.IndexOf(item) >= 0) _flashs.Remove(item); navBarControl.BeginUpdate(); navBarControl.ActiveGroup.ItemLinks.Remove(item); navBarControl.Items.Remove(item); navBarControl.EndUpdate(); ChatConnection conn = GetConnection(account); if (conn != null) _connections.Remove(conn); } catch (Exception ex) { navBarControl.EndUpdate(); Msg.ShowError("RemoveConnection" + ex.Message); } } //批量增加用户.注意BeginUpdate,EndUpdate.不能简化代码 public void AddConnection(IList connList) { try { navBarControl.BeginUpdate(); foreach (ChatConnection conn in connList) { NavBarItem item = GetNavBarItemByAccount(conn.Account); if (item != null) //更新连线 (item.Tag as ChatConnection).Update(conn); else //新增 this.AddConnection(conn); } } finally { navBarControl.EndUpdate(); } } private NavBarGroup GetGroupByFactory(string factory) { foreach (NavBarGroup g in navBarControl.Groups) if (g.Tag.ToString() == factory) return g; return null; } public void AddConnection(int position, ChatConnection conn) { this.DoAddConnection(conn, position); } public void AddConnection(ChatConnection conn) { this.DoAddConnection(conn, -1); } //增加一个连接 public void DoAddConnection(ChatConnection conn, int position) { try { navBarControl.BeginUpdate(); NavBarGroup group; if (_ShowUserType == ShowUser.ByGroup) group = this.GetGroupByFactory(conn.FactoryCode); else group = navBarControl.ActiveGroup; if (group == null) group = CreateGroup(conn.FactoryCode); NavBarItem item = navBarControl.Items.Add(); item.Caption = conn.DisplayName + "(" + conn.FactoryCode + ")"; item.Tag = conn; item.SmallImageIndex = 0; if (position < 0) group.ItemLinks.Add(item); //增加 else group.ItemLinks.Insert(position, item); //插入 _connections.Add(conn); } catch (Exception ex) { Msg.ShowError("AddConnection" + ex.Message); } finally { navBarControl.EndUpdate(); } } private NavBarGroup CreateGroup(string factoryCode) { NavBarGroup group = navBarControl.Groups.Add(); group.ItemChanged += new EventHandler(OnGroup_ItemChanged); group.Caption = "用户列表"; group.Tag = factoryCode; group.LargeImageIndex = (_ShowUserType == ShowUser.All) ? 0 : 1; ; return group; } private void OnGroup_ItemChanged(object sender, EventArgs e) { NavBarGroup group = sender as NavBarGroup; if (_ShowUserType == ShowUser.ByGroup) { string caption = "用户列表 ({0}) 部门:{1}"; group.Caption = string.Format(caption, group.ItemLinks.Count, group.Tag); } else { string caption = "用户列表 ({0}) "; group.Caption = string.Format(caption, group.ItemLinks.Count); } } public int AddReceivedMessage(string sender, string message) { ChatConnection conn = GetConnection(sender); if (conn != null) return conn.ReceivedMessage.Add(message); else return -1; } public ChatConnection GetConnection(string account) { for (int i = 0; i <= _connections.Count - 1; i++) { ChatConnection conn = _connections[i] as ChatConnection; if (conn.Account.ToUpper() == account.ToUpper()) return conn; } return null; } //当收到用户的信息,闪烁图标 public void FlashConnection(string account) { NavBarItem item = GetNavBarItemByAccount(account); if (item == null) return; if (_flashs.IndexOf(item) < 0) _flashs.Add(item); } //闪烁图标的时钟事件 void OnTimerTick(object sender, EventArgs e) { if (!_enableFlash) return; try { for (int i = 0; i <= _flashs.Count - 1; i++) { if (i > _flashs.Count - 1) continue; //避免异地删除了_flashs中元素. if (_flashs.Count == 0) continue; navBarControl.BeginUpdate(); NavBarItem item = _flashs[i] as NavBarItem; int step = GetFlashStep(); item.SmallImageIndex = step; item.LargeImageIndex = step; if (item.Appearance.ForeColor != Color.DodgerBlue) item.Appearance.ForeColor = Color.DodgerBlue; else item.Appearance.ForeColor = Color.Black; navBarControl.EndUpdate(); } } catch { navBarControl.EndUpdate(); } } //停止闪烁 public void StopFlash(string account) { NavBarItem item = GetNavBarItemByAccount(account); if (_flashs.IndexOf(item) >= 0) { item.Appearance.ForeColor = Color.Black; item.SmallImageIndex = 0; item.LargeImageIndex = 0; _flashs.Remove(item); } } public void CloseAll(bool removeUser) { if (removeUser) { CloseAll(); } else //设置状态为脱线 { try { _flashs.Clear(); navBarControl.BeginUpdate(); foreach (NavBarItem item in navBarControl.Items) { item.SmallImageIndex = 1; item.LargeImageIndex = 1; } navBarControl.EndUpdate(); } catch (Exception ex) { navBarControl.EndUpdate(); } } } public void CloseAll() { try { _flashs.Clear(); _connections.Clear(); navBarControl.BeginUpdate(); navBarControl.Items.Clear(); navBarControl.Groups.Clear(); navBarControl.EndUpdate(); } catch (Exception ex) { navBarControl.EndUpdate(); Msg.Warning("CloseAll:" + ex.Message); } } private NavBarItem GetNavBarItemByAccount(string account) { for (int i = 0; i <= navBarControl.Items.Count - 1; i++) { NavBarItem item = navBarControl.Items[i]; if (item.Tag == null) continue; ChatConnection conn = item.Tag as ChatConnection; if (conn.Account == account) return item; } return null; } public bool IsConnectionExists(string account) { return GetConnection(account) != null; } public ChatConnection GetSelectedConnection() { if (navBarControl.SelectedLink != null && navBarControl.SelectedLink.Item.Tag != null) return navBarControl.SelectedLink.Item.Tag as ChatConnection; else return null; } public IList GetConnections() { return _connections; } public void SetConnectionState(string account, ChatState state) { try { NavBarItem item = GetNavBarItemByAccount(account); if (item == null) return; navBarControl.BeginUpdate(); ChatConnection conn = item.Tag as ChatConnection; conn.ConnectionState = state; if (state == ChatState.Hide || state == ChatState.Offline) { item.SmallImageIndex = 1; item.LargeImageIndex = 1; } else if (state == ChatState.Online) { item.SmallImageIndex = 0; item.LargeImageIndex = 0; } } finally { navBarControl.EndUpdate(); } } //记录闪烁图标的当前序号 private int _CurrentFlagStep = 0; private int GetFlashStep() { int[] steps = new int[] { 0, 4, 0, 3 }; //数字代表ImageIndex序号 _CurrentFlagStep += 1; if (_CurrentFlagStep == 4) _CurrentFlagStep = 0; return steps[_CurrentFlagStep]; } //是否允许闪烁图标 [DefaultValue(true)] public bool EnableFlash { get { return _enableFlash; } set { _enableFlash = value; timerFlash.Enabled = value; } } //点击联系人触发的事件 private event OnConnectionClickHandler _OnConnectionClick; [EditorBrowsable(EditorBrowsableState.Always)] [Browsable(true)] [Description("点击按钮触发事件")] [Category("Events")] public event OnConnectionClickHandler OnConnectionClick { add { _OnConnectionClick += value; } remove { _OnConnectionClick -= value; } } //点击菜单触发的事件 private event ToolStripItemClickedEventHandler _OnMenuItemClick; [EditorBrowsable(EditorBrowsableState.Always)] [Browsable(true)] [Description("点击菜单触发事件")] [Category("Events")] public event ToolStripItemClickedEventHandler OnMenuItemClick { add { _OnMenuItemClick += value; } remove { _OnMenuItemClick -= value; } } private void navBarControl_LinkClicked(object sender, NavBarLinkEventArgs e) { if (_OnConnectionClick != null) { if (e.Link.Item.Tag != null && e.Link.Item.Tag is ChatConnection) _OnConnectionClick(e.Link.Item, e.Link.Item.Tag as ChatConnection); } } private void navBarControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { NavBarHitInfo info = navBarControl.CalcHitInfo(e.Location); _hotLink = info.Link; navBarControl.ActiveGroup.SelectedLink = info.Link; } } private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (_OnMenuItemClick != null) _OnMenuItemClick(sender, e); } } //点击用户触发的事件 public delegate void OnConnectionClickHandler(NavBarItem sender, ChatConnection conn); //CSFramework原创作品,如转载请注明出处 by C/S框架网 www.csframework.com
参考文档:
[原创]C#仿QQ聊天程序(点对点无服务端, P2P) C#实现QQ/MSN等客户端聊天软件从右下角弹出窗体(Popup Window) [原创]C#植入友商网在线服务并实现同步用户注册接口(一) C#植入友商网在线服务并实现同步用户注册接口实现 [原创]C#植入友商网在线服务并实现同步用户注册接口(三) C#.Net版本自动更新程序及3种策略实现 C#仿QQ聊天程序v1.0(客户端管理类) 详述IComparer,IComparable接口,实现自定义方法比较对象大小并排序(C#) C#.NET 监视操作系统打开程序(使用Window消息实现全局系统勾子) 平台建立WCF服务操作指引、三层源码+桥接接口实现 Winform调用WebApi接口实现增删改查CRUD实例源码 CSFramework.WebApi时钟定时作业异步处理程序(IThreadHandler接口)实现 基于Web前端用户调用CSFramework.WebApi服务端登录登出接口实现 C#实现接口的两种方式:显示实现和隐式实现接口 C#接口中多态的实现
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |