using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Aptech.UI; //添加引用 using System.Data.SqlClient; using System.Media; //需要添加多媒体命名空间! namespace MYQQ { public partial class MainForm : Form { //*******************************************************成员变量定义开始********* string myNickName = ""; int fromUserId; // 消息的发起者 int friendFaceId; // 发消息的好友的头像Id //********************************************************成员变量定义的结束!!!!!!!!! public MainForm() { InitializeComponent(); } /// <summary> /// 加载好友到主界面;链接数据库的代码,交给大家! /// 写一个连接查询语句,连接两个表哦!!!! /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MainForm_Load(object sender, EventArgs e) { Point p = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width, this.Top); this.PointToScreen(p); //制定工作区的坐标,转换成屏幕坐标; this.Location = p; // this.Location = new Point(Screen.GetWorkingArea(this).X - this.Width, this.Location.Y) ; //1.加载好友头像列表; sbFriends.AddGroup("我的好友"); //3个分组; sbFriends.AddGroup("我的陌生人"); showFriend(); //2.加载自己头像列表方法; showMyInfo(); InfoForm shan = new InfoForm(); shan.myName = myNickName; shan.Show(); UserHelper.myNickName = myNickName; FormDock fd = new FormDock(this); } #region 1.加载好友头像列表放到自定义的方法内; public void showFriend() { //+++++++++++++断点绝招;大招:try块; sbFriends.Groups[0].Items.Clear(); //清除好友分组一内所有项 try { DBHelper.conn.Open(); string sql = string.Format("SELECT f.FriendId,u.NickName,u.FaceId FROM Users u,Friends f WHERE f.HostId={0} AND u.Id=f.FriendId", UserHelper.loginId); SqlCommand comm = new SqlCommand(sql, DBHelper.conn); SqlDataReader dataReader = comm.ExecuteReader(); while (dataReader.Read()) { //SbItem:是分组的每一项;,需要添加Aptech.UI;命名空间; SbItem item = new SbItem((string)dataReader["NickName"], (int)dataReader["faceId"]);//昵称,头像编号 item.Tag = (int)dataReader["FriendId"]; //QQ号码;Tag:不显示,是一个隐藏标记,我们发消息的时候,可以直接引用; sbFriends.Groups[0].Items.Add(item); //添加到分组; } dataReader.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { DBHelper.conn.Close(); } //************,不在需要了,添加好友*********** //SbItem item = new SbItem("火龙果籽",3);//昵称,头像编号 //item.Tag = 10007; //QQ号码 //sbFriends.Groups[2].Items.Add(item); //添加到分组; //需要用到SqlDataReader类添加数据进行完善! } #endregion #region 2.加载自己头像列表的方法; public void showMyInfo() { //如何加载自己的头像和昵称 /链接数据库 //借助于UserHelper,这里面有一个loginId,当前登录成功的QQ号码; int faceId=0; DBHelper.conn.Open(); string sql=string.Format("select faceId,nickname from users where id={0}",UserHelper.loginId); SqlCommand comm = new SqlCommand(sql, DBHelper.conn); SqlDataReader sdr = comm.ExecuteReader(); //执行,返回获取的数据 while (sdr.Read()) { if (!sdr.IsDBNull(0)) { //头像编号不为空 faceId = sdr.GetInt32(0); myNickName = sdr.GetString(1); //给自己的昵称赋值; } } //下一步干嘛? sdr.Close(); DBHelper.conn.Close(); //********************头像和昵称只是给了两个变量 picFace.Image = ilFaces.Images[faceId]; lblLoginId.Text = myNickName + "(" + UserHelper.loginId.ToString() + ")"; //标签的文本=等于字符串变量; } #endregion #region 3.托盘图标控制 private void qToolStripMenuItem_Click(object sender, EventArgs e) { notifyIcon1.Icon = new Icon("ico\\shipin.ico"); } private void 离线ToolStripMenuItem_Click(object sender, EventArgs e) { notifyIcon1.Icon = new Icon("ico\\yun.ico"); } private void 隐身ToolStripMenuItem_Click(object sender, EventArgs e) { notifyIcon1.Icon = new Icon("ico\\mang.ico"); } SearchFriendForm sff; //单例模式!!!! private void tsbtnSearchFriend_Click(object sender, EventArgs e) { if (sff == null || sff.IsDisposed) { sff = new SearchFriendForm(); //sff.ShowDialog(); //最简单的方式 sff.Show(); } } private void 上线ToolStripMenuItem_Click(object sender, EventArgs e) { notifyIcon1.Icon = new Icon("ico\\q.ico"); //设置托盘图标的位置; } private void 我ToolStripMenuItem_Click(object sender, EventArgs e) { notifyIcon1.Icon = new Icon("ico\\yidong.ico"); } #endregion //sbFrident.SeletedItem.Parent.Items.Remove(sbFrident.SeletedItem);//删除 private void sbFriends_ItemDoubleClick(SbItemEventArgs e) //当前事件对象,谁上面进行双击,小强,10002 { // 消息timer停止运行 if (tmrChatRequest.Enabled == true) { tmrChatRequest.Stop(); e.Item.ImageIndex = this.friendFaceId; } //实现的新功能! foreach (Form f1 in OwnedForms)//Application.OpenForms { if (f1 is ChatForm) //如果是聊天窗体 { if ((f1 as ChatForm).friendId == Convert.ToInt32(e.Item.Tag)) { f1.Show(); return; } } } ChatForm f2 = new ChatForm(); f2.friendId = Convert.ToInt32(e.Item.Tag); // 号码,事件,项的Tag,好友的ID 10002 f2.nickName = e.Item.Text; // 昵称 f2.faceId = e.Item.ImageIndex; // 头像 f2.myName = myNickName; //需要在主窗体类再定义一个昵称变量;改行可以省略 f2.Show(this); } #region 4.编辑个人信息窗体,已经写过了 private void tsbtnPersonalInfo_Click(object sender, EventArgs e) { PersonalInfoForm personalInfoForm = new PersonalInfoForm(); personalInfoForm.mainForm = this; // 将当前窗体本身传给个人信息窗体 personalInfoForm.ShowDialog(); //模态对话框; } #endregion //刷新好友 private void tsbtnUpdateFriendList_Click(object sender, EventArgs e) { showFriend(); } #region 5.定义扫描消息 private void tmrMessage_Tick(object sender, EventArgs e) { showFriend(); // 刷新好友列表 int messageTypeId = 1; // 消息类型 int messageState = 1; // 消息状态 // 找出未读消息对应的好友Id string sql = string.Format("SELECT Top 1 FromUserId, MessageTypeId, MessageState FROM Messages WHERE ToUserId={0} AND MessageState=0", UserHelper.loginId); SqlCommand command; // 消息有两种类型:聊天消息、添加好友消息 try { command = new SqlCommand(sql, DBHelper.conn); DBHelper.conn.Open(); SqlDataReader dataReader = command.ExecuteReader(); // 循环读出一个未读消息 if (dataReader.Read()) { fromUserId = (int)dataReader["FromUserId"]; //获得发消息的ID messageTypeId = (int)dataReader["MessageTypeId"]; //得到消息的类型 messageState = (int)dataReader["MessageState"]; //发的消息状态; } dataReader.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { DBHelper.conn.Close(); } // 判断消息类型,如果是添加好友消息,就启动喇叭timer,让小喇叭闪烁 if (messageTypeId == 2 && messageState == 0) //2:这是加为好友消息 { SoundPlayer player = new SoundPlayer("system.wav"); //表示和当前QQ.exe是同一个级别 player.Play(); //播放声音 tmrAddFriend.Start(); //消息类型为2,并且消息未读,则启动添加好友消息! } // 如果是聊天消息,就启动聊天timer,让好友头像闪烁 else if (messageTypeId == 1 && messageState == 0) { // 获得发消息的人的头像Id sql = "SELECT FaceId FROM Users WHERE Id=" + fromUserId; try { command = new SqlCommand(sql, DBHelper.conn); DBHelper.conn.Open(); this.friendFaceId = Convert.ToInt32(command.ExecuteScalar()); // 设置发消息的好友的头像索引; } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { DBHelper.conn.Close(); } //如果发消息的人没有在列表中就添加到陌生人列表中 if (!HasShowUser(fromUserId)) { UpdateStranger(fromUserId); } SoundPlayer player = new SoundPlayer("msg.wav"); //聊天消息声音启动! player.Play(); tmrChatRequest.Start(); // 启动闪烁头像定时器 } } #endregion #region 更新到陌生人 private void UpdateStranger(int fromUserId) { //和添加到好友分组时一样的,唯一不同的是,将Group[0]-->Group[1] string sql = "SELECT NickName, FaceId FROM Users WHERE Id=" +UserHelper.loginId; bool error = false; // 用来标识是否出现错误 try { SqlCommand command = new SqlCommand(sql, DBHelper.conn); DBHelper.conn.Open(); SqlDataReader dataReader = command.ExecuteReader(); // 查询 if (dataReader.Read()) { SbItem item = new SbItem((string)dataReader["NickName"], (int)dataReader["FaceId"]); item.Tag = this.fromUserId; // 将Id记录在Tag属性中 sbFriends.Groups[1].Items.Add(item); // 向陌生人组中添加项 } sbFriends.VisibleGroup = sbFriends.Groups[1]; // 设定陌生人组为可见组 } catch (Exception ex) { error = true; Console.WriteLine(ex.Message); } finally { DBHelper.conn.Close(); } if (error) // 出错了 { MessageBox.Show("服务器出现意外错误!", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error); } } #endregion #region 判断发消息的人是否在列表中 private bool HasShowUser(int fromUserId) { //fromUserId:发消息过来的好友 号码,传参过来,如果相同,表示找到!就在好友闪烁;否则,陌生人 bool find = false; // 表示是否在当前显示出的用户列表中找到了该用户 // 循环 SideBar 中的2个组,寻找发消息的人是否在列表中 for (int i = 0; i < 2; i++) { for (int j = 0; j < sbFriends.Groups[i].Items.Count; j++) { if (Convert.ToInt32(sbFriends.Groups[i].Items[j].Tag) == fromUserId) { find = true; } } } return find; } #endregion int messageImageIndex = 0; //0.工具栏中的消息图标的索引:xiaoxiIndex //1.控制喇叭闪烁,控制喇叭闪烁是最简单的代码段! private void tmrAddFriend_Tick(object sender, EventArgs e) { // 反复修改它的图像;xiaoxiIndex: messageImageIndex = (messageImageIndex == 0) ? 1 : 0; tsbtnMessageReading.Image = ilMessage.Images[messageImageIndex]; //Images[0]/Images[1]; //另外的方式 //if (tsbtnMessageReading.Image.ToString() == "") // tsbtnMessageReading.Image = Image.FromFile("MessageReading.gif"); //else // tsbtnMessageReading.Image = Image.FromFile(""); } //2.单击小喇叭显示请求好友消息窗体 private void tsbtnMessageReading_Click(object sender, EventArgs e) {//tsbtnMessageReading:就是小喇叭按钮 tmrAddFriend.Stop(); //添加好友.消息timer停止运行 // 图片恢复正常 messageImageIndex = 0; //tsbtnMessageReading.Image = Image.FromFile("MessageReading.gif"); tsbtnMessageReading.Image = ilMessage.Images[messageImageIndex]; // 显示系统消息窗体;请求加为好友的窗体;!!!! RequestForm requestForm = new RequestForm(); requestForm.ShowDialog(); } #region 让相应的好友头像闪烁 private void tmrChatRequest_Tick(object sender, EventArgs e) { // 循环好友列表两个组中的每个item,找到发消息的好友,让他的头像闪烁 for (int i = 0; i < 2; i++) //0或1 { for (int j = 0; j < sbFriends.Groups[i].Items.Count; j++) //j:0,....,好友个数 { if (Convert.ToInt32(sbFriends.Groups[i].Items[j].Tag) == this.fromUserId) //如果[0][j]==你的好友号码; { if (sbFriends.Groups[i].Items[j].ImageIndex < 100) //实现头像变化,什么时候引起呢? { sbFriends.Groups[i].Items[j].ImageIndex = 100;// 索引为100的图片是一个空白图片 } else { sbFriends.Groups[i].Items[j].ImageIndex = this.friendFaceId; } sbFriends.Invalidate(); // 重新绘制,只要告诉学生需要这句话才能正常闪烁头像就行 } } } } #endregion private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { Application.Exit(); //退出整个程序,不会导致,你的程序存在于资源管理器 } public FrmUserInformation frm; //小信息窗体; #region 鼠标离开事件 private void picFace_MouseLeave(object sender, EventArgs e) { if (frm != null) { frm.Hide(); } } #endregion #region 鼠标悬停事件 private void picFace_MouseHover(object sender, EventArgs e) { //窗体的TopLeft值 int UserTop = this.Location.Y+55; int UserLeft = this.Location.X; //窗体不为空传值 if (frm == null || frm.IsDisposed) { frm = new FrmUserInformation(); frm.point = new Point(UserLeft - frm.Width, UserTop); frm.Show(); } else { frm.point = new Point(UserLeft - frm.Width, UserTop); frm.Show(); } } #endregion private void sbFriends_Load(object sender, EventArgs e) { } private void picFace_Click(object sender, EventArgs e) { } public frmWeather fw; //天气 private void pictureBox1_MouseHover(object sender, EventArgs e) { //窗体的TopLeft值 int UserTop = this.Top; int UserLeft = this.Right ; //窗体不为空传值 if (fw == null || fw.IsDisposed) { fw = new frmWeather(); fw.point = new Point(UserLeft,UserTop); fw.Show(); } else { fw.point = new Point(UserLeft, UserTop); fw.Show(); } } private void pictureBox1_MouseLeave(object sender, EventArgs e) { if(fw!=null) fw.Hide(); } private void contextMenuStrip2_Click(object sender, EventArgs e) { } private void 小图标ToolStripMenuItem_Click(object sender, EventArgs e) { sbFriends.View = SbView.SmallIcon; } private void 大图标ToolStripMenuItem_Click(object sender, EventArgs e) { sbFriends.View = SbView.LargeIcon; } private void 列表ToolStripMenuItem_Click(object sender, EventArgs e) { sbFriends.View = SbView.List; } private void sbFriends_MouseClick(object sender, MouseEventArgs e) { Point p = sbFriends.PointToClient(MousePosition); if (e.Button == MouseButtons.Right) { if (sbFriends.SeletedItem != null && sbFriends.SeletedItem.HitTest(p.X, p.Y) == true) { contextMenuStrip1.Show(MousePosition); } } } private void 修改组名ToolStripMenuItem_Click(object sender, EventArgs e) { sbFriends.SeletedItem.Parent.Text = "AAA"; } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { } private void 刷新好友ToolStripMenuItem_Click(object sender, EventArgs e) { } private void pictureBox1_Click(object sender, EventArgs e) { } } }
![](https://img2024.cnblogs.com/blog/35695/202407/35695-20240713070336838-1837943664.jpg)