QQ项目之九 主窗体

举报
tea_year 发表于 2021/12/30 00:23:26 2021/12/30
【摘要】 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows...

  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using Aptech.UI; //添加引用
  10. using System.Data.SqlClient;
  11. using System.Media; //需要添加多媒体命名空间!
  12. namespace MYQQ
  13. {
  14. public partial class MainForm : Form
  15. {
  16. //*******************************************************成员变量定义开始*********
  17. string myNickName = "";
  18. int fromUserId;  // 消息的发起者
  19. int friendFaceId; // 发消息的好友的头像Id
  20. //********************************************************成员变量定义的结束!!!!!!!!!
  21. public MainForm()
  22. {
  23. InitializeComponent();
  24. }
  25. /// <summary>
  26. /// 加载好友到主界面;链接数据库的代码,交给大家!
  27. /// 写一个连接查询语句,连接两个表哦!!!!
  28. /// </summary>
  29. /// <param name="sender"></param>
  30. /// <param name="e"></param>
  31. private void MainForm_Load(object sender, EventArgs e)
  32. {
  33. Point p = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width, this.Top);
  34. this.PointToScreen(p); //制定工作区的坐标,转换成屏幕坐标;
  35. this.Location = p;
  36. // this.Location = new Point(Screen.GetWorkingArea(this).X - this.Width, this.Location.Y) ;
  37. //1.加载好友头像列表;
  38. sbFriends.AddGroup("我的好友"); //3个分组;
  39. sbFriends.AddGroup("我的陌生人");
  40. showFriend();
  41. //2.加载自己头像列表方法;
  42. showMyInfo();
  43. InfoForm shan = new InfoForm();
  44. shan.myName = myNickName;
  45. shan.Show();
  46. UserHelper.myNickName = myNickName;
  47. FormDock fd = new FormDock(this);
  48. }
  49. #region 1.加载好友头像列表放到自定义的方法内;
  50. public void showFriend() {
  51. //+++++++++++++断点绝招;大招:try块;
  52. sbFriends.Groups[0].Items.Clear(); //清除好友分组一内所有项
  53. try
  54. {
  55. DBHelper.conn.Open();
  56. 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",
  57. UserHelper.loginId);
  58. SqlCommand comm = new SqlCommand(sql, DBHelper.conn);
  59. SqlDataReader dataReader = comm.ExecuteReader();
  60. while (dataReader.Read())
  61. { //SbItem:是分组的每一项;,需要添加Aptech.UI;命名空间;
  62. SbItem item = new SbItem((string)dataReader["NickName"], (int)dataReader["faceId"]);//昵称,头像编号
  63. item.Tag = (int)dataReader["FriendId"]; //QQ号码;Tag:不显示,是一个隐藏标记,我们发消息的时候,可以直接引用;
  64. sbFriends.Groups[0].Items.Add(item); //添加到分组;
  65. }
  66. dataReader.Close();
  67. }
  68. catch (Exception ex)
  69. {
  70. MessageBox.Show(ex.Message);
  71. }
  72. finally
  73. {
  74. DBHelper.conn.Close();
  75. }
  76. //************,不在需要了,添加好友***********
  77. //SbItem item = new SbItem("火龙果籽",3);//昵称,头像编号
  78. //item.Tag = 10007; //QQ号码
  79. //sbFriends.Groups[2].Items.Add(item); //添加到分组;
  80. //需要用到SqlDataReader类添加数据进行完善!
  81. }
  82. #endregion
  83. #region 2.加载自己头像列表的方法;
  84. public void showMyInfo() {
  85. //如何加载自己的头像和昵称 /链接数据库
  86. //借助于UserHelper,这里面有一个loginId,当前登录成功的QQ号码;
  87. int faceId=0;
  88. DBHelper.conn.Open();
  89. string sql=string.Format("select faceId,nickname from users where id={0}",UserHelper.loginId);
  90. SqlCommand comm = new SqlCommand(sql, DBHelper.conn);
  91. SqlDataReader sdr = comm.ExecuteReader(); //执行,返回获取的数据
  92. while (sdr.Read()) {
  93. if (!sdr.IsDBNull(0)) { //头像编号不为空
  94. faceId = sdr.GetInt32(0);
  95. myNickName = sdr.GetString(1); //给自己的昵称赋值;
  96. }
  97. }
  98. //下一步干嘛?
  99. sdr.Close();
  100. DBHelper.conn.Close();
  101. //********************头像和昵称只是给了两个变量
  102. picFace.Image = ilFaces.Images[faceId];
  103. lblLoginId.Text = myNickName + "(" + UserHelper.loginId.ToString() + ")"; //标签的文本=等于字符串变量;
  104. }
  105. #endregion
  106. #region 3.托盘图标控制
  107. private void qToolStripMenuItem_Click(object sender, EventArgs e)
  108. {
  109. notifyIcon1.Icon = new Icon("ico\\shipin.ico");
  110. }
  111. private void 离线ToolStripMenuItem_Click(object sender, EventArgs e)
  112. {
  113. notifyIcon1.Icon = new Icon("ico\\yun.ico");
  114. }
  115. private void 隐身ToolStripMenuItem_Click(object sender, EventArgs e)
  116. {
  117. notifyIcon1.Icon = new Icon("ico\\mang.ico");
  118. }
  119. SearchFriendForm sff; //单例模式!!!!
  120. private void tsbtnSearchFriend_Click(object sender, EventArgs e)
  121. {
  122. if (sff == null || sff.IsDisposed)
  123. {
  124. sff = new SearchFriendForm();
  125. //sff.ShowDialog(); //最简单的方式
  126. sff.Show();
  127. }
  128. }
  129. private void 上线ToolStripMenuItem_Click(object sender, EventArgs e)
  130. {
  131. notifyIcon1.Icon = new Icon("ico\\q.ico"); //设置托盘图标的位置;
  132. }
  133. private void 我ToolStripMenuItem_Click(object sender, EventArgs e)
  134. {
  135. notifyIcon1.Icon = new Icon("ico\\yidong.ico");
  136. }
  137. #endregion
  138. //sbFrident.SeletedItem.Parent.Items.Remove(sbFrident.SeletedItem);//删除
  139. private void sbFriends_ItemDoubleClick(SbItemEventArgs e) //当前事件对象,谁上面进行双击,小强,10002
  140. {
  141. // 消息timer停止运行
  142. if (tmrChatRequest.Enabled == true)
  143. {
  144. tmrChatRequest.Stop();
  145. e.Item.ImageIndex = this.friendFaceId;
  146. }
  147. //实现的新功能!
  148. foreach (Form f1 in OwnedForms)//Application.OpenForms
  149. {
  150. if (f1 is ChatForm) //如果是聊天窗体
  151. {
  152. if ((f1 as ChatForm).friendId == Convert.ToInt32(e.Item.Tag))
  153. {
  154. f1.Show();
  155. return;
  156. }
  157. }
  158. }
  159. ChatForm f2 = new ChatForm();
  160. f2.friendId = Convert.ToInt32(e.Item.Tag); // 号码,事件,项的Tag,好友的ID 10002
  161. f2.nickName = e.Item.Text; // 昵称
  162. f2.faceId = e.Item.ImageIndex; // 头像
  163. f2.myName = myNickName; //需要在主窗体类再定义一个昵称变量;改行可以省略
  164. f2.Show(this);
  165. }
  166. #region 4.编辑个人信息窗体,已经写过了
  167. private void tsbtnPersonalInfo_Click(object sender, EventArgs e)
  168. {
  169. PersonalInfoForm personalInfoForm = new PersonalInfoForm();
  170. personalInfoForm.mainForm = this; // 将当前窗体本身传给个人信息窗体
  171. personalInfoForm.ShowDialog(); //模态对话框;
  172. }
  173. #endregion
  174. //刷新好友
  175. private void tsbtnUpdateFriendList_Click(object sender, EventArgs e)
  176. {
  177. showFriend();
  178. }
  179. #region 5.定义扫描消息
  180. private void tmrMessage_Tick(object sender, EventArgs e)
  181. {
  182. showFriend(); // 刷新好友列表
  183. int messageTypeId = 1; // 消息类型
  184. int messageState = 1; // 消息状态
  185. // 找出未读消息对应的好友Id
  186. string sql = string.Format("SELECT Top 1 FromUserId, MessageTypeId, MessageState FROM Messages WHERE ToUserId={0} AND MessageState=0",
  187. UserHelper.loginId);
  188. SqlCommand command;
  189. // 消息有两种类型:聊天消息、添加好友消息
  190. try
  191. {
  192. command = new SqlCommand(sql, DBHelper.conn);
  193. DBHelper.conn.Open();
  194. SqlDataReader dataReader = command.ExecuteReader();
  195. // 循环读出一个未读消息
  196. if (dataReader.Read())
  197. {
  198. fromUserId = (int)dataReader["FromUserId"]; //获得发消息的ID
  199. messageTypeId = (int)dataReader["MessageTypeId"]; //得到消息的类型
  200. messageState = (int)dataReader["MessageState"]; //发的消息状态;
  201. }
  202. dataReader.Close();
  203. }
  204. catch (Exception ex)
  205. {
  206. Console.WriteLine(ex.Message);
  207. }
  208. finally
  209. {
  210. DBHelper.conn.Close();
  211. }
  212. // 判断消息类型,如果是添加好友消息,就启动喇叭timer,让小喇叭闪烁
  213. if (messageTypeId == 2 && messageState == 0) //2:这是加为好友消息
  214. {
  215. SoundPlayer player = new SoundPlayer("system.wav"); //表示和当前QQ.exe是同一个级别
  216. player.Play(); //播放声音
  217. tmrAddFriend.Start(); //消息类型为2,并且消息未读,则启动添加好友消息!
  218. }
  219. // 如果是聊天消息,就启动聊天timer,让好友头像闪烁
  220. else if (messageTypeId == 1 && messageState == 0)
  221. {
  222. // 获得发消息的人的头像Id
  223. sql = "SELECT FaceId FROM Users WHERE Id=" + fromUserId;
  224. try
  225. {
  226. command = new SqlCommand(sql, DBHelper.conn);
  227. DBHelper.conn.Open();
  228. this.friendFaceId = Convert.ToInt32(command.ExecuteScalar()); // 设置发消息的好友的头像索引;
  229. }
  230. catch (Exception ex)
  231. {
  232. Console.WriteLine(ex.Message);
  233. }
  234. finally
  235. {
  236. DBHelper.conn.Close();
  237. }
  238. //如果发消息的人没有在列表中就添加到陌生人列表中
  239. if (!HasShowUser(fromUserId))
  240. {
  241. UpdateStranger(fromUserId);
  242. }
  243. SoundPlayer player = new SoundPlayer("msg.wav"); //聊天消息声音启动!
  244. player.Play();
  245. tmrChatRequest.Start(); // 启动闪烁头像定时器
  246. }
  247. }
  248. #endregion
  249. #region 更新到陌生人
  250. private void UpdateStranger(int fromUserId)
  251. { //和添加到好友分组时一样的,唯一不同的是,将Group[0]-->Group[1]
  252. string sql = "SELECT NickName, FaceId FROM Users WHERE Id=" +UserHelper.loginId;
  253. bool error = false; // 用来标识是否出现错误
  254. try
  255. {
  256. SqlCommand command = new SqlCommand(sql, DBHelper.conn);
  257. DBHelper.conn.Open();
  258. SqlDataReader dataReader = command.ExecuteReader(); // 查询
  259. if (dataReader.Read())
  260. {
  261. SbItem item = new SbItem((string)dataReader["NickName"], (int)dataReader["FaceId"]);
  262. item.Tag = this.fromUserId; // 将Id记录在Tag属性中
  263. sbFriends.Groups[1].Items.Add(item); // 向陌生人组中添加项
  264. }
  265. sbFriends.VisibleGroup = sbFriends.Groups[1]; // 设定陌生人组为可见组
  266. }
  267. catch (Exception ex)
  268. {
  269. error = true;
  270. Console.WriteLine(ex.Message);
  271. }
  272. finally
  273. {
  274. DBHelper.conn.Close();
  275. }
  276. if (error) // 出错了
  277. {
  278. MessageBox.Show("服务器出现意外错误!", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error);
  279. }
  280. }
  281. #endregion
  282. #region 判断发消息的人是否在列表中
  283. private bool HasShowUser(int fromUserId)
  284. { //fromUserId:发消息过来的好友 号码,传参过来,如果相同,表示找到!就在好友闪烁;否则,陌生人
  285. bool find = false; // 表示是否在当前显示出的用户列表中找到了该用户
  286. // 循环 SideBar 中的2个组,寻找发消息的人是否在列表中
  287. for (int i = 0; i < 2; i++)
  288. {
  289. for (int j = 0; j < sbFriends.Groups[i].Items.Count; j++)
  290. {
  291. if (Convert.ToInt32(sbFriends.Groups[i].Items[j].Tag) == fromUserId)
  292. {
  293. find = true;
  294. }
  295. }
  296. }
  297. return find;
  298. }
  299. #endregion
  300. int messageImageIndex = 0; //0.工具栏中的消息图标的索引:xiaoxiIndex
  301. //1.控制喇叭闪烁,控制喇叭闪烁是最简单的代码段!
  302. private void tmrAddFriend_Tick(object sender, EventArgs e)
  303. {
  304. // 反复修改它的图像;xiaoxiIndex:
  305. messageImageIndex = (messageImageIndex == 0) ? 1 : 0;
  306. tsbtnMessageReading.Image = ilMessage.Images[messageImageIndex]; //Images[0]/Images[1];
  307. //另外的方式
  308. //if (tsbtnMessageReading.Image.ToString() == "")
  309. // tsbtnMessageReading.Image = Image.FromFile("MessageReading.gif");
  310. //else
  311. // tsbtnMessageReading.Image = Image.FromFile("");
  312. }
  313. //2.单击小喇叭显示请求好友消息窗体
  314. private void tsbtnMessageReading_Click(object sender, EventArgs e)
  315. {//tsbtnMessageReading:就是小喇叭按钮
  316. tmrAddFriend.Stop(); //添加好友.消息timer停止运行
  317. // 图片恢复正常
  318. messageImageIndex = 0; //tsbtnMessageReading.Image = Image.FromFile("MessageReading.gif");
  319. tsbtnMessageReading.Image = ilMessage.Images[messageImageIndex];
  320. // 显示系统消息窗体;请求加为好友的窗体;!!!!
  321. RequestForm requestForm = new RequestForm();
  322. requestForm.ShowDialog();
  323. }
  324. #region 让相应的好友头像闪烁
  325. private void tmrChatRequest_Tick(object sender, EventArgs e)
  326. {
  327. // 循环好友列表两个组中的每个item,找到发消息的好友,让他的头像闪烁
  328. for (int i = 0; i < 2; i++) //0或1
  329. {
  330. for (int j = 0; j < sbFriends.Groups[i].Items.Count; j++) //j:0,....,好友个数
  331. {
  332. if (Convert.ToInt32(sbFriends.Groups[i].Items[j].Tag) == this.fromUserId) //如果[0][j]==你的好友号码;
  333. {
  334. if (sbFriends.Groups[i].Items[j].ImageIndex < 100) //实现头像变化,什么时候引起呢?
  335. {
  336. sbFriends.Groups[i].Items[j].ImageIndex = 100;// 索引为100的图片是一个空白图片
  337. }
  338. else
  339. {
  340. sbFriends.Groups[i].Items[j].ImageIndex = this.friendFaceId;
  341. }
  342. sbFriends.Invalidate(); // 重新绘制,只要告诉学生需要这句话才能正常闪烁头像就行
  343. }
  344. }
  345. }
  346. }
  347. #endregion
  348. private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
  349. {
  350. Application.Exit(); //退出整个程序,不会导致,你的程序存在于资源管理器
  351. }
  352. public FrmUserInformation frm; //小信息窗体;
  353. #region 鼠标离开事件
  354. private void picFace_MouseLeave(object sender, EventArgs e)
  355. {
  356. if (frm != null)
  357. {
  358. frm.Hide();
  359. }
  360. }
  361. #endregion
  362. #region 鼠标悬停事件
  363. private void picFace_MouseHover(object sender, EventArgs e)
  364. {
  365. //窗体的TopLeft值
  366. int UserTop = this.Location.Y+55;
  367. int UserLeft = this.Location.X;
  368. //窗体不为空传值
  369. if (frm == null || frm.IsDisposed)
  370. {
  371. frm = new FrmUserInformation();
  372. frm.point = new Point(UserLeft - frm.Width, UserTop);
  373. frm.Show();
  374. }
  375. else {
  376. frm.point = new Point(UserLeft - frm.Width, UserTop);
  377. frm.Show();
  378. }
  379. }
  380. #endregion
  381. private void sbFriends_Load(object sender, EventArgs e)
  382. {
  383. }
  384. private void picFace_Click(object sender, EventArgs e)
  385. {
  386. }
  387. public frmWeather fw;
  388. //天气
  389. private void pictureBox1_MouseHover(object sender, EventArgs e)
  390. {
  391. //窗体的TopLeft值
  392. int UserTop = this.Top;
  393. int UserLeft = this.Right ;
  394. //窗体不为空传值
  395. if (fw == null || fw.IsDisposed)
  396. {
  397. fw = new frmWeather();
  398. fw.point = new Point(UserLeft,UserTop);
  399. fw.Show();
  400. }
  401. else
  402. {
  403. fw.point = new Point(UserLeft, UserTop);
  404. fw.Show();
  405. }
  406. }
  407. private void pictureBox1_MouseLeave(object sender, EventArgs e)
  408. {
  409. if(fw!=null)
  410. fw.Hide();
  411. }
  412. private void contextMenuStrip2_Click(object sender, EventArgs e)
  413. {
  414. }
  415. private void 小图标ToolStripMenuItem_Click(object sender, EventArgs e)
  416. {
  417. sbFriends.View = SbView.SmallIcon;
  418. }
  419. private void 大图标ToolStripMenuItem_Click(object sender, EventArgs e)
  420. {
  421. sbFriends.View = SbView.LargeIcon;
  422. }
  423. private void 列表ToolStripMenuItem_Click(object sender, EventArgs e)
  424. {
  425. sbFriends.View = SbView.List;
  426. }
  427. private void sbFriends_MouseClick(object sender, MouseEventArgs e)
  428. {
  429. Point p = sbFriends.PointToClient(MousePosition);
  430. if (e.Button == MouseButtons.Right)
  431. {
  432. if (sbFriends.SeletedItem != null && sbFriends.SeletedItem.HitTest(p.X, p.Y) == true)
  433. {
  434. contextMenuStrip1.Show(MousePosition);
  435. }
  436. }
  437. }
  438. private void 修改组名ToolStripMenuItem_Click(object sender, EventArgs e)
  439. {
  440. sbFriends.SeletedItem.Parent.Text = "AAA";
  441. }
  442. private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
  443. {
  444. }
  445. private void 刷新好友ToolStripMenuItem_Click(object sender, EventArgs e)
  446. {
  447. }
  448. private void pictureBox1_Click(object sender, EventArgs e)
  449. {
  450. }
  451. }
  452. }

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/50486889

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。