QQ項目之九 主窗體

      網(wǎng)友投稿 756 2025-04-01

      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;  // 消息的發(fā)起者

      int friendFaceId; // 發(fā)消息的好友的頭像Id

      //********************************************************成員變量定義的結(jié)束!!!!!!!!!

      public MainForm()

      {

      InitializeComponent();

      }

      ///

      /// 加載好友到主界面;鏈接數(shù)據(jù)庫的代碼,交給大家!

      /// 寫一個連接查詢語句,連接兩個表哦?。。?!

      ///

      ///

      ///

      private void MainForm_Load(object sender, EventArgs e)

      {

      Point p = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width, this.Top);

      this.PointToScreen(p); //制定工作區(qū)的坐標,轉(zhuǎn)換成屏幕坐標;

      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.加載好友頭像列表放到自定義的方法內(nèi);

      public void showFriend() {

      //+++++++++++++斷點絕招;大招:try塊;

      sbFriends.Groups[0].Items.Clear(); //清除好友分組一內(nèi)所有項

      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:不顯示,是一個隱藏標記,我們發(fā)消息的時候,可以直接引用;

      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類添加數(shù)據(jù)進行完善!

      }

      #endregion

      #region 2.加載自己頭像列表的方法;

      public void showMyInfo() {

      //如何加載自己的頭像和昵稱 /鏈接數(shù)據(jù)庫

      //借助于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(); //執(zhí)行,返回獲取的數(shù)據(jù)

      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"); //設(shè)置托盤圖標的位置;

      }

      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;

      }

      //實現(xiàn)的新功能!

      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.編輯個人信息窗體,已經(jīng)寫過了

      private void tsbtnPersonalInfo_Click(object sender, EventArgs e)

      {

      PersonalInfoForm personalInfoForm = new PersonalInfoForm();

      personalInfoForm.mainForm = this; // 將當前窗體本身傳給個人信息窗體

      personalInfoForm.ShowDialog(); //模態(tài)對話框;

      }

      #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; // 消息狀態(tài)

      // 找出未讀消息對應(yīng)的好友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();

      // 循環(huán)讀出一個未讀消息

      if (dataReader.Read())

      {

      fromUserId = (int)dataReader["FromUserId"]; //獲得發(fā)消息的ID

      messageTypeId = (int)dataReader["MessageTypeId"]; //得到消息的類型

      messageState = (int)dataReader["MessageState"]; //發(fā)的消息狀態(tài);

      }

      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)

      {

      // 獲得發(fā)消息的人的頭像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()); // 設(shè)置發(fā)消息的好友的頭像索引;

      }

      catch (Exception ex)

      {

      Console.WriteLine(ex.Message);

      }

      finally

      {

      DBHelper.conn.Close();

      }

      //如果發(fā)消息的人沒有在列表中就添加到陌生人列表中

      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; // 用來標識是否出現(xiàn)錯誤

      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]; // 設(shè)定陌生人組為可見組

      }

      catch (Exception ex)

      {

      error = true;

      Console.WriteLine(ex.Message);

      }

      finally

      {

      DBHelper.conn.Close();

      }

      if (error) // 出錯了

      {

      MessageBox.Show("服務(wù)器出現(xiàn)意外錯誤!", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error);

      }

      }

      #endregion

      #region 判斷發(fā)消息的人是否在列表中

      private bool HasShowUser(int fromUserId)

      { //fromUserId:發(fā)消息過來的好友 號碼,傳參過來,如果相同,表示找到!就在好友閃爍;否則,陌生人

      bool find = false; // 表示是否在當前顯示出的用戶列表中找到了該用戶

      // 循環(huán) SideBar 中的2個組,尋找發(fā)消息的人是否在列表中

      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)

      {

      // 反復(fù)修改它的圖像;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停止運行

      // 圖片恢復(fù)正常

      messageImageIndex = 0; //tsbtnMessageReading.Image = Image.FromFile("MessageReading.gif");

      tsbtnMessageReading.Image = ilMessage.Images[messageImageIndex];

      // 顯示系統(tǒng)消息窗體;請求加為好友的窗體;!!!!

      RequestForm requestForm = new RequestForm();

      requestForm.ShowDialog();

      }

      #region 讓相應(yīng)的好友頭像閃爍

      private void tmrChatRequest_Tick(object sender, EventArgs e)

      {

      // 循環(huán)好友列表兩個組中的每個item,找到發(fā)消息的好友,讓他的頭像閃爍

      for (int i = 0; i < 2; i++) //0或1

      {

      for (int j = 0; j < sbFriends.Groups[i].Items.Count; j++) //j:0,....,好友個數(shù)

      {

      if (Convert.ToInt32(sbFriends.Groups[i].Items[j].Tag) == this.fromUserId) //如果[0][j]==你的好友號碼;

      {

      if (sbFriends.Groups[i].Items[j].ImageIndex < 100) //實現(xiàn)頭像變化,什么時候引起呢?

      {

      sbFriends.Groups[i].Items[j].ImageIndex = 100;// 索引為100的圖片是一個空白圖片

      }

      else

      {

      sbFriends.Groups[i].Items[j].ImageIndex = this.friendFaceId;

      }

      sbFriends.Invalidate(); // 重新繪制,只要告訴學(xué)生需要這句話才能正常閃爍頭像就行

      }

      }

      }

      }

      #endregion

      private void MainForm_FormClosed(object sender, FormClosedEventArgs e)

      {

      Application.Exit(); //退出整個程序,不會導(dǎo)致,你的程序存在于資源管理器

      }

      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;

      QQ項目之九 主窗體

      }

      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)

      {

      }

      }

      }

      數(shù)據(jù)庫

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:MapReduce 教程 – MapReduce 基礎(chǔ)知識和 MapReduce 示例
      下一篇:excel如何設(shè)置下劃線?excel設(shè)置下劃線的方法。
      相關(guān)文章
      亚洲视频在线观看免费| 亚洲国产精品毛片av不卡在线| 4338×亚洲全国最大色成网站| 亚洲AV第一成肉网| 亚洲va成无码人在线观看| 亚洲视频在线一区二区三区| 亚洲人成网站在线播放影院在线| 亚洲AV人人澡人人爽人人夜夜| 精品国产综合成人亚洲区| 亚洲V无码一区二区三区四区观看| 亚洲欧洲自拍拍偷午夜色无码| 亚洲av无码国产精品夜色午夜 | 亚洲日韩一中文字暮| 波多野结衣亚洲一级| 亚洲国产精品一区二区三区在线观看| 亚洲欧洲自拍拍偷综合| 亚洲成a人片在线网站| 亚洲不卡在线观看| 亚洲字幕AV一区二区三区四区| 亚洲精品第一综合99久久| 亚洲最大无码中文字幕| 亚洲国产成人手机在线观看| 亚洲国产综合AV在线观看| 国产精品亚洲一区二区在线观看| 国产精品亚洲va在线观看| 亚洲精品国产精品国自产观看| 国产成人精品曰本亚洲79ren| 亚洲精品制服丝袜四区| 精品国产综合成人亚洲区| 亚洲最大成人网色| 亚洲中文久久精品无码1| 亚洲综合av一区二区三区| 国产成人高清亚洲一区91| 国产乱辈通伦影片在线播放亚洲 | 亚洲一区二区久久| 亚洲乱色熟女一区二区三区蜜臀| 亚洲av色香蕉一区二区三区| 亚洲精品和日本精品| 人人狠狠综合久久亚洲婷婷| 亚洲视频一区在线播放| 亚洲卡一卡二卡乱码新区|