【C#+SQL Server】实现模仿QQ的交友软件 四:主窗体设计讲解(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~
其他几个部分文章链接如下
【C#+SQL Server】实现模仿QQ的交友软件 一:系统简介、功能展示与数据库设计(附源码和资源)
【C#+SQL Server】实现模仿QQ的交友软件 二:登录窗体设计讲解(附源码和资源)
【C#+SQL Server】实现模仿QQ的交友软件 三:申请账号窗体设计讲解(附源码和资源)
【C#+SQL Server】实现模仿QQ的交友软件 五:聊天窗体设计讲解(附源码和资源)
一、主窗体概述
Q友聊天软件的主窗体主要显示当前登录用户的个人信息与好友列表和快捷工具栏,用户可以通过双击某个好友,与其进行聊天,Q友聊天软件主窗体中显示好友列表的形式有两种,分别为大头像形式和小头像形式,效果如下
二、主窗体实现流程
主窗体实现流程如下
三、设计主窗体
由于主窗体中需要用到头像列表,因此在设计主窗体之前,首先需要将头像资源复制到项目文件夹中,分为两个步骤,分别是设计窗体和填充窗体
1:设计窗体
下面是主窗体的属性值列表
2:填充窗体
填充窗体主要分为四个步骤,分别是:添加组件 添加控件 设计快捷菜单 设计工具栏
首先添加ImageList组件
按照以上步骤再台南佳两个ImageList组件 分别将Name属性修改为imglistSmallHead和imglistMessage 组件属性设置如下
添加并设置Timer组件 组件属性设置如下
2:添加控件
向窗体中添加控件如下
其中用到的组件以及对应属性设置如下
3:设计快捷菜单
快捷菜单用ContextMenuStrip控件标识
4:设计工具栏
工具栏有哦那个ToolStrip控件表示
四、定义公共变量和方法
在Frm_Main窗体代码页的命名控件区域添加以下代码,以便调用数据库操作相关的类以及播放音频相关的类
using System.Data;
using System.Data.SqlClient;
using System.Media;
在公共变量或方法的编写区添加以下代码
int fromUserID; //消息发送者
int friendHeadID; //发消息好友的头像ID
int messageImageIndex = 0; //工具栏中的消息图标的索引
public static string nickName = ""; //自己的昵称
public static string strFlag = "[离线]";
DataOperator dataOper = new DataOperator(); //创建数据操作类的对象
五、窗体加载事件的实现
窗体加载时,需要显示从数据库中获取的用户和好友相关信息,因此添加如下代码
public SqlDataReader GetDataReader(string sql){SqlCommand command = new SqlCommand(sql, connection);//指定要执行的SQL语句if (connection.State == ConnectionState.Open)//如果当前数据连接处于打开状态connection.Close(); //关闭数据库连接connection.Open();//打开数据库连接SqlDataReader datareader = command.ExecuteReader();//生成SqlDataReaderreturn datareader;//返回SqlDataReader}
添加一个ShowInfo方法,用来显示个人的头像 昵称 账号和个性签名等信息
public void ShowInfo()
{int headID = 0; //头像索引//获取当前用户的昵称、头像string sql = "select NickName, HeadID,Sign from tb_User where ID=" + PublicClass.loginID
+ "";SqlDataReader dataReader = dataOper.GetDataReader(sql); //执行查询操作if (dataReader.Read()) //读取查询结果{if (!(dataReader["NickName"] is DBNull)) //判断NickName不为空{nickName = dataReader["NickName"].ToString(); //记录自己的昵称}headID = Convert.ToInt32(dataReader["HeadID"]); //记录自己的头像IDtxtSign.Text = dataReader["Sign"].ToString(); //显示个性签名}dataReader.Close(); //关闭读取器DataOperator.connection.Close(); //关闭数据库连接this.Text = PublicClass.loginID.ToString(); //设置窗体标题为当前用户账号pboxHead.Image = imglistHead.Images[headID]; //显示用户头像lblName.Text = nickName + "(" + PublicClass.loginID + ")"; //显示昵称及账号
}
定义一个ShowFriendList方法,用来显示当前登录用户的好友列表信息
private void ShowFriendList()
{lvFriend.Items.Clear(); //清空原来的列表//定义查找好友的SQL语句string sql = "select FriendID,NickName,HeadID,Flag from tb_User,tb_Friend where
tb_Friend.HostID=" + PublicClass.loginID + " and tb_User.ID=tb_Friend.FriendID";SqlDataReader dataReader = dataOper.GetDataReader(sql); //执行查询int i = lvFriend.Items.Count; //记录添加到ListView中的项索引while (dataReader.Read()) //循环添加好友列表{if(dataReader["Flag"].ToString()=="0")strFlag = "[离线]";elsestrFlag = "[在线]";string strTemp = dataReader["NickName"].ToString(); //记录好友昵称//对好友昵称进行处理string strFriendName=strTemp;if (strTemp.Length < 9)strFriendName = strTemp.PadLeft(9, ' ');elsestrFriendName = (strTemp.Substring(0, 2) + "...").PadLeft(9, ' ');//向ListView中添加项,Name:好友ID,值:昵称,要显示的头像lvFriend.Items.Add(dataReader["FriendID"].ToString(), strFriendName + strFlag,
(int)dataReader["HeadID"]);lvFriend.Items[i].Group = lvFriend.Groups[0]; //设置项的分组为我的好友i++; //临时变量加1}dataReader.Close(); //关闭读取器DataOperator.connection.Close(); //关闭数据库连接
}
切换到Frm_Main窗体的设计页,触发窗体的Load事件 在该事件处理方法中主要显示个人信息以及好友列表
private void Frm_Main_Load(object sender, EventArgs e)
{tsbtnMessageReading.Image = imglistMessage.Images[0]; //工具栏的消息图标ShowInfo(); //显示个人信息ShowFriendList(); //显示好友列表
}
六、工具栏按钮功能的实现
主窗体的工具栏位于窗体的底部,主要包括个人信息 查找 更新好友列表 系统消息和退出共五个快捷按钮
下面是触发个人信息按钮tsbtnInfo的Click事件
private void tsbtnInfo_Click(object sender, EventArgs e)
{Frm_EditInfo frmInfo = new Frm_EditInfo(); //创建个人信息窗体对象frmInfo.Show(); //显示个人信息窗体
}
下面是触发查找按钮tsbtnSearchFriend的Click事件
private void tsbtnSearchFriend_Click(object sender, EventArgs e)
{Frm_AddFriend frmAddFriend = new Frm_AddFriend(); //创建查找好友窗体对象frmAddFriend.Show(); //显示查找好友窗体
}
触发更新好友列表按钮tsbtnUpdateFriendList的Click事件
private void tsbtnUpdateFriendList_Click(object sender, EventArgs e)
{ShowFriendList(); //显示好友列表
}
触发系统消息按钮tsbtnMessageReading的Click事件
private void tsbtnMessageReading_Click(object sender, EventArgs e)
{tmAddFriend.Stop(); //停止消息提醒定时器messageImageIndex = 0; //头像恢复正常//显示正常的系统消息提醒图标tsbtnMessageReading.Image = imglistMessage.Images[messageImageIndex];Frm_Remind frmRemind = new Frm_Remind(); //创建系统消息窗体对象frmRemind.Show(); //显示系统消息窗体
}
最后触发退出按钮tsbtnExit的Click事件
private void tsbtnExit_Click(object sender, EventArgs e)
{DialogResult result = MessageBox.Show("确实要退出吗?", "确认", MessageBoxButtons.YesNo,
MessageBoxIcon.Question); //弹出确定对话框if (result == DialogResult.Yes) //如果单击是按钮{Application.ExitThread(); //退出当前程序}
}
七、双击打开聊天窗体
双击主窗体中的某个好友时,可以打开聊天窗体,要实现该功能,需要向项目中添加一个聊天窗体 定义公共变量
public int friendID=0; //当前聊天的好友号码
public string nickName; //当前聊天的好友昵称
public int headID; //当前聊天的好友头像ID
DataOperator dataOper = new DataOperator(); //创建数据操作类的对象
下面是触发好友列表控件lvFriend的MouseDoubleClick事件 在该事件处理方法中实现打开聊天窗体,并为聊天窗体的公共变量赋值的功能
Frm_Chat frmChat;//聊天窗体对象//双击打开聊天窗体private void lvFriend_MouseDoubleClick(object sender, MouseEventArgs e){if (lvFriend.SelectedItems.Count > 0)//判断是否有选中项{if (frmChat == null)//判断聊天窗体对象是否为空{frmChat = new Frm_Chat();//创建聊天窗体对象//记录聊天的账号frmChat.friendID = Convert.ToInt32(lvFriend.SelectedItems[0].Name);frmChat.nickName = dataOper.GetDataSet("select NickName from tb_User where ID=" + frmChat.friendID).Tables[0].Rows[0][0].ToString();//记录昵称frmChat.headID = Convert.ToInt32(dataOper.GetDataSet("select HeadID from tb_User where ID=" + frmChat.friendID).Tables[0].Rows[0][0])+1;//记录头像IDfrmChat.ShowDialog();//以对话框显示聊天窗体对象frmChat = null;//将聊天窗体对象设置为空}if (tmChat.Enabled == true)//如果聊天定时器处于可用状态{tmChat.Stop();//停止聊天定时器lvFriend.SelectedItems[0].ImageIndex = friendHeadID;//将选中项的头像显示为正常状态}}}
八、实时消息提醒以及好友头像闪烁
定义公共变量或方法代码如下 用来判断某个用户是否在列表中
private bool HasShowUser(int ID)
{//是否在当前显示出的用户列表中找到了该用户bool find = false;//循环lvFriend中的2个组,寻找发消息的人是否在列表中for (int i = 0; i < 2; i++){for (int j = 0; j < lvFriend.Groups[i].Items.Count; j++){if (Convert.ToInt32(lvFriend.Groups[i].Items[j].Name) == ID){find = true;}}}return find;
}
定义一个UpdateStranger方法 用来显示陌生人列表
private void UpdateStranger(int ID)
{lvFriend.Items.Clear(); //清空原来的列表//获取指定用户的昵称及头像IDstring sql = "select NickName, HeadID from tb_User where ID=" + ID;SqlDataReader dataReader = dataOper.GetDataReader(sql); //执行查询int i = lvFriend.Items.Count; //记录添加到ListView中的项索引while (dataReader.Read()) //循环添加陌生人列表{string strTemp = dataReader["NickName"].ToString(); //记录好友昵称//对好友昵称进行处理string strName = strTemp;if (strTemp.Length < 9)strName = strTemp.PadLeft(9, ' ');elsestrName = (strTemp.Substring(0, 2) + "...").PadLeft(9, ' ');//向ListView中添加项,Name:用户ID,值:昵称,要显示的头像lvFriend.Items.Add(fromUserID.ToString(), strName, (int)dataReader["HeadID"]);lvFriend.Items[i].Group = lvFriend.Groups[1]; //设置项的分组为陌生人i++; //临时变量加1}dataReader.Close(); //关闭读取器DataOperator.connection.Close(); //关闭数据库连接
}
触发实时获取未读消息的定时器tmMessage的Tick事件,在该事件处理方法中,主要实现实时获取未读消息的功能 另外在有未读消息时,进行相应的声音提示
private void tmMessage_Tick(object sender, EventArgs e)
{if (lvFriend.SelectedItems.Count > 0) //判断好友列表中有选中项{if (lvFriend.SelectedItems[0].Group == lvFriend.Groups[0])//如果选中项属于第1组{tsMenuDel.Visible = true; //显示删除菜单tsMenuAdd.Visible = false; //隐藏添加好友菜单}//如果选中项属于第2组else if (lvFriend.SelectedItems[0].Group == lvFriend.Groups[1]) {tsMenuDel.Visible = false; //隐藏删除菜单tsMenuAdd.Visible = true; //显示添加好友菜单}}int messageTypeID = 1; //消息类型int messageState = 1; //消息状态string sql = "select top 1 FromUserID, MessageTypeID, MessageState from tb_Message where
ToUserID=" + PublicClass.loginID + " and MessageState=0"; //查找未读消息对应的好友IDSqlDataReader dataReader = dataOper.GetDataReader(sql); //执行查询if (dataReader.Read()) //读取未读消息{fromUserID = (int)dataReader["FromUserID"]; //记录消息发送者messageTypeID = (int)dataReader["MessageTypeID"]; //记录消息类型messageState = (int)dataReader["MessageState"]; //记录消息状态}dataReader.Close(); //关闭读取器DataOperator.connection.Close(); //关闭数据库连接//消息有两种类型:聊天消息、添加好友消息//判断消息类型,如果是添加好友消息,启动消息提醒定时器if (messageTypeID == 2 && messageState == 0){SoundPlayer player = new SoundPlayer("system.wav"); //系统消息提示player.Play(); //播放指定声音文件tmAddFriend.Start(); //启动消息提醒定时器}//如果是聊天消息,启动聊天定时器,使好友头像闪烁else if (messageTypeID == 1 && messageState == 0){sql = "select HeadID from tb_User where ID=" + fromUserID;//获取消息发送者的IDfriendHeadID = dataOper.ExecSQL(sql); //设置发消息好友的头像ID//如果发消息的人不在好友列表中,将其添加到陌生人列表中if (!HasShowUser(fromUserID)){UpdateStranger(fromUserID); //显示陌生人列表}SoundPlayer player = new SoundPlayer("msg.wav"); //聊天消息提示player.Play(); //播放指定声音文件tmChat.Start(); //启动聊天定时器}
}
触发消息提醒定时器tmAddFriend的Tick事件
private void tmAddFriend_Tick(object sender, EventArgs e)
{messageImageIndex = messageImageIndex == 0 ? 1:0; //实时获取系统消息图像索引//工具栏中显示消息读取状态图像tsbtnMessageReading.Image = imglistMessage.Images[messageImageIndex];}
触发聊天定时器tmChat的Tick事件
private void tmChat_Tick(object sender, EventArgs e)
{//循环好友列表两个组中的每项,找到消息发送者,使其头像闪烁for (int i = 0; i < 2; i++){for (int j = 0; j < lvFriend.Groups[i].Items.Count; j++){//判断是否为消息发送者if (Convert.ToInt32(lvFriend.Groups[i].Items[j].Name) == fromUserID) {if (frmChat != null && frmChat.friendID != 0){//直接显示头像,避免闪烁效果lvFriend.SelectedItems[0].ImageIndex = friendHeadID;}else{if (lvFriend.Groups[i].Items[j].ImageIndex < 100){//索引为100的图片是一个空白图片,为了实现闪烁效果lvFriend.Groups[i].Items[j].ImageIndex = 100;}else{//要显示的消息发送者头像索引lvFriend.Groups[i].Items[j].ImageIndex = friendHeadID;}}}}}
}
创作不易 觉得有帮助请点赞关注收藏~~~
【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 ...
最新文章
- ERROR: Failed to find Platform SDK with path: platforms;android-27
- 单片机c语言强制数据类型,写单片机程序数据类型相关
- 计算机专业要学几门课呀,计算机专业学生一定要学好这几门课!
- c++------------提取文件中的信息
- Win7 64位下PowerDesigner连接64位Oracle11g数据库
- C语言20790内所有因子的和,长春市水污染控制指标的因子和聚类分析.pdf
- 根据图片获得配色方案_配色系列(1)—从图片中获得配色灵感
- 5分钟带你理解一致性Hash算法
- 通过腾讯地图服务获取行政区划信息
- linux装回windows系统,将全盘安装的linux换回windows
- vue中watch数组或者对象
- FFMPEG结构体分析:AVFrame
- 开课吧Java课堂:如何运用equals( )和 equalsIgnoreCase( )
- AcWing 91. 最短Hamilton路径(状态压缩DP+哈密顿回路)
- mysql中 s命令_MySQL的基本操作命令
- [译] JavaScript 中的私有变量
- bootstraptable 一条数据跨行_据说它是唐山市拥有奶茶店最多的一条街,你一定也逛过!...
- java图片二值化_实现图像的二值化(java+opencv)
- 关于8.0出现Only fullscreen opaque activities can request orientation
- 腾讯抄袭之史 当之无愧的剽窃之王【最近剽窃 qq空间时间轴 VS 钥匙网】
热门文章
- 小米9pro textView不设置颜色不显示_小米万象息屏2.0内测开启,新增小组件功能和新息屏...
- 《算法设计与分析(第4版)》课后习题第二章第2小题
- Windows10录屏存放位置设置
- Python OpenCV2 cv2.putText用法
- Emotivecolor GHAlex Daylight for Mac(LUT电影级色彩预设)
- pythonpil安装教程_python PIL库安装
- 几种常用深度学习框架简介
- 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)
- mate8怎么关闭html查看器,华为Mate8获取Root教程 实测可用
- 微信公众号h5使用jsapi支付