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)
        {

        }

       
    }
}

posted on 2016-01-09 09:30  波波嘟  阅读(288)  评论(0编辑  收藏  举报