【C#+SQL Server】实现模仿QQ的交友软件 五:聊天窗体设计讲解(附源码和资源)
需要源码和资源请 点赞关注收藏后评论区留言私信~~~
其他几个部分文章链接如下
【C#+SQL Server】实现模仿QQ的交友软件 一:系统简介、功能展示与数据库设计(附源码和资源)
【C#+SQL Server】实现模仿QQ的交友软件 二:登录窗体设计讲解(附源码和资源)
【C#+SQL Server】实现模仿QQ的交友软件 三:申请账号窗体设计讲解(附源码和资源)
【C#+SQL Server】实现模仿QQ的交友软件 四:主窗体设计讲解(附源码和资源)
一、聊天窗口概述
聊天窗体主要用于实现当前登录账号与指定好友的通信功能,其中窗体顶部显示当前好友的头像,昵称和账号,在下方分别用两个文本框显示聊天记录和输入要发送的信息,下方通过两个按钮控制消息的发送和窗体的关闭 效果如下图所示
二、聊天窗体实现流程
聊天窗体实现流程如下图所示
三、设计聊天窗体
聊天窗体的设计主要分为两个步骤,分别是设计窗体,填充窗体
1:设计窗体
按照下面属性值列表进行设置
2:填充窗体
填充聊天窗体主要分为两步,分别是添加控件和添加组件
1:添加控件
添加如下图所示的控件
其中窗体用到的控件及其对应的属性设置如下
2:添加组件
其窗体主要用到两个组件,分别是Timer组件和ImageList组件,其中Timer组件的Name属性设置为tmShowMessage Enabled属性设置为True Interval属性设置为2000,该组件主要用来控制所有未读消息的展示
四、窗体加载时显示好友头像以及昵称信息
触发Load事件 处理方法中主要将窗体标题设置为与XXX聊天中,并显示好友的头像 昵称和账号
private void Frm_Chat_Load(object sender, EventArgs e)
{this.Text = "与\"" + nickName + "\"聊天中"; //设置窗体标题pboxHead.Image = imglistHead.Images[headID]; //设置好友头像lblFriend.Text = string.Format("{0}({1})", nickName, friendID); //设置好友名称rtxtMessage.ScrollToCaret(); //滚动条总在最下方
}
五、显示所有未读消息
定义一个SetMessage方法,用来将显示出的消息设置为已读
private void SetMessage(string messageID)
{string[] messageIDs = messageID.Split('_'); //分割出每个消息IDstring sql = "update tb_Message set MessageState=1 where ID="; //定义更新SQL语句foreach (string id in messageIDs) //遍历所有消息ID{if (id != ""){sql += id; //设置更新条件int result = dataOper.ExecSQLResult(sql); //执行数据表更新操作}}
}
定义一个ShowMessage方法,用来读取所有的未读消息
private void ShowMessage()
{string messageID = ""; //消息ID组成的字符串string message; //消息内容string messageTime; //消息发送时间//读取消息的SQL语句string sql = "select ID,Message,MessageTime from tb_Message where FromUserID=" + friendID
+ " and ToUserID=" + PublicClass.loginID + " and MessageTypeID=1 and MessageState=0";SqlDataReader datareader = dataOper.GetDataReader(sql);//循环将消息添加到窗体上while (datareader.Read()){messageID += datareader["ID"] + "_"; //消息IDmessage = datareader["Message"].ToString(); //消息//消息的发送时间messageTime = Convert.ToDateTime(datareader["MessageTime"]).ToString();//设置消息显示格式rtxtMessage.Text += "\n" + nickName + " " + messageTime + "\n " + message + "";}DataOperator.connection.Close(); //关闭数据库连接if (messageID.Length > 1) //判断是否存在消息{messageID.Remove(messageID.Length - 1); //去掉最后的连接符SetMessage(messageID); //将显示的消息设置为已读}
}
接下来触发显示所有未读消息的计时器 调用showmessage方法实现获取所有的未读消息并显示
private void tmShowMessage_Tick(object sender, EventArgs e)
{ShowMessage(); //读取所有的未读消息,显示在窗体中
}
六、消息发送功能的实现
触发发送按钮btnSend的Click事件 在该事件处理方法中实现消息的发送功能
private void btnSend_Click(object sender, EventArgs e)
{if (rtxtChat.Text.Trim() == "") //不能发送空消息{MessageBox.Show("不能发送空消息!", "提示", MessageBoxButtons.OK,
MessageBoxIcon.Information);return;}else //发送消息{//此处的MessageTypeId为1,表示聊天消息;MessageState为0,表示消息未读string sql = string.Format("INSERT INTO tb_Message (FromUserID, ToUserID, Message, MessageTypeID,
MessageState) VALUES ({0},{1},'{2}',{3},{4})",PublicClass.loginID, friendID, rtxtChat.Text,
1, 0);int result = dataOper.ExecSQLResult(sql); //调用方法实现消息插入操作rtxtMessage.Text += "\n" + Frm_Main.nickName + " " + DateTime.Now + "\n " +
rtxtChat.Text + "";if (result != 1) //如果返回结果不是1,表示没有发送成功{MessageBox.Show("消息发送失败,请重新发送!", "提示", MessageBoxButtons.OK,
MessageBoxIcon.Information);}rtxtChat.Text = ""; //清空消息rtxtChat.Focus(); //定位鼠标输入焦点}
}
除了通过单击发送按钮发送消息,还可以通过键盘上的回车键实现消息的发送,该功能是在消息框文本rtxtChat的KeyDown事件处理方法中实现的
private void rtxtChat_KeyDown(object sender, KeyEventArgs e)
{if (e.Control && e.KeyValue == 13) //当同时按下Ctrl和Enter时,发送消息{e.Handled = true;btnSend_Click(this, null); //发送消息}
}
七、查看消息记录
触发消息记录图片按钮pboxInfo的Cilck事件,该事件处理方法中通过查询视图获取当前登录账号与当前好友的所有聊天记录
private void pboxInfo_Click(object sender, EventArgs e)
{rtxtMessage.Clear(); //清空聊天信息显示窗口string messageID = ""; //消息ID组成的字符串string message; //消息内容string messageTime; //消息发送时间string sql = "select ID,NickName,Message,MessageTime from v_Message where (FromUserID="
+ friendID + " and ToUserID=" + PublicClass.loginID + ") or (FromUserID=" + PublicClass.loginID
+ " and ToUserID=" + friendID + ") order by MessageTime asc ";//读取消息的SQL语句SqlDataReader datareader = dataOper.GetDataReader(sql);while (datareader.Read()) //循环将消息添加到窗体上{messageID += datareader["ID"] + "_"; //消息IDmessage = datareader["Message"].ToString(); //消息//消息的发送时间messageTime = Convert.ToDateTime(datareader["MessageTime"]).ToString();rtxtMessage.Text += "\n" + datareader["NickName"] + " " + messageTime + "\n " + message
+ ""; //设置消息显示格式}DataOperator.connection.Close(); //关闭数据库连接
}
创作不易 觉得有帮助请点赞关注收藏~~~
【C#+SQL Server】实现模仿QQ的交友软件 五:聊天窗体设计讲解(附源码和资源)相关推荐
- 【C#+Socker+SQL Server】实现可多人联机和对话的五子棋游戏 五:五子棋大厅窗体设计(附源码和资源)
需要源码请点赞关注收藏后评论区留言私信~~~ 一.五子棋大厅窗体概述 五子棋大厅窗体主要是在游戏者进入指定区域的指定 房间后,在用户信息列表框中显示当前进入房间的所有用户信息,当单击指定位置时,在座位 ...
- 【C#+SQL Server】实现模仿QQ的交友软件 一:系统简介、功能展示与数据库设计(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 其余几个部分文章链接如下 [C#+SQL Server]实现模仿QQ的交友软件 二:登录窗体设计讲解(附源码和资源) [C#+SQL Server] ...
- 【C#+SQL Server+打印组件】实现电商快递单打印系统 五:自定义组件和快递单模板设计(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.自定义组件(扩展TextBox) 由于快递单种类较多,所以在设计系统时考虑开发一个通用模板,由用户根据自己使用的快递单样式自行定义快递单的文本输 ...
- 【C#+SQL Server+打印组件】实现电商快递单打印系统 五:快递单打印模块设计(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.快递单打印模块概述 由于一个用户可能使用多种类型的快递单,所以在快递单打印窗体中提供了自由选择快递单种类的功能,在确定使用某一种快递单后,程序将 ...
- 【C#+SQL Server+打印组件】实现电商快递单打印系统 六:快递单查询模块设计(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.快递单查询模块概述 打印后的快递单记录被保存到数据库中,快递单查询窗体提供了查询打印记录,修改打印记录,删除打印记录以及重新打印单据的功能 实现 ...
- 【C#+SQL Server】实现ERP管理系统 三:物料清单模块设计(附源码和资源)
需要源码请点赞关注收藏后评论区留言私信~~~ 一.物料清单模块概述 物料清单英文缩写为BOM,用于描述产品的物理结构组成,子件按照一定的数量和装配工艺流程来构成母件,运行窗体如下图所示 二.设计物料清 ...
- 【C#+SQL Server+打印组件】实现电商快递单打印系统 四:快递单设置模块设计(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.快递单设置模块概述 快递单设置模块主要用于自定义快递单模样式,用户可以通过快递单设置窗体添加任意样式快递单的模板,并可以根据实际需要随时修改模板 ...
- 【C#+SQL Server】实现ERP管理系统 四:销售收款单模块设计(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.销售收款单模块概述 销售收款单是对已售商品确认收款的凭证,单据经过审核后,被正式确认,系统自动增加账户金额,审核后若要修改后者删除收款单,需要进 ...
- 【C#+SQL Server】实现模仿QQ的交友软件 四:主窗体设计讲解(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 其他几个部分文章链接如下 [C#+SQL Server]实现模仿QQ的交友软件 一:系统简介.功能展示与数据库设计(附源码和资源) [C#+SQL ...
最新文章
- 最强奥运会(互联网公司版)
- webdiyer aspnet pager最近又用这个。还是记录下。
- 促进儿童语言发展的方法
- mybatisdb.sql
- linux securefx 传输文件失败,解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题...
- android studio 弹出式对话框设置时间_如何设置当单击某个对象时运行指定的应用程序?...
- 六级词汇打卡第天四天(四)
- 计算机二级python考试大纲2020_【2020年9月全国计算机二级Python考试大纲】- 环球网校...
- java 日历选择天,如何使用Java日历从date中减去X天?
- 74LS165芯片单颗与级联的万能代码|2021-10-6
- Java异常处理之异常类继承层次
- JAVA计算机毕业设计原创网络文学管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
- 数组添加/扩容和数组缩减
- 手机只能上QQ不能看网页
- 用window调用kjb和ktr
- idea当中批量替换变量名字
- 【2018-CCPC青岛网赛】 HDU - 6441 Find Integer
- 【VBA研究】用Ping命令测试IP地址是否通达
- poj 3009 Curling 2.0
- 电子元件在电路的作用