简单的实现QQ通信功能(四)

第四部分:主界面的设计及代码

一:效果图及界面设计

1. 效果图:

2. 界面设计:

(1)上面显示自己信息用一个PictureBox和两个Label,用来显示自己的头像和昵称备注名。

(2)下面用了一个FlowLayoutPanel来显示好友列表,FlowDirection设置为TopDown,从上到下流式布局。

(3)下面一个ComboBox用来选择自己的状态。

(4)一个imageList3存放用户头像,根据登录者的头像代号进来选择需要的头像。

(5)一个notifyIcon1来设置任务栏右下角显示小图标。

(6)朋友列表中每一个朋友信息的显示是用了一个自定义控件Friendsmode,专门来加载朋友信息。

(7)Friendsmode里面一个imageList2存放用户头像,imageList2存放用户离线头像,时钟Timer1控制头像抖动,时钟Timer2控制来消息声音,时钟controltx来控制朋友上线和下线的声音及头像变化。

3. 用到的各个控件的名称:

登录者头像metouxiang,登录者昵称menickname,登录者备注名mememoname,用户列表friendlist,右下角修改状态updatastate;

自定义控件Friendsmode,自定义控件里的头像touxiang,自定义控件里的昵称nicheng,自定义控件里的备注名beizhu。

二:代码设计:

1. MainForm里的代码:

        //定义个_Uid记住登录者
        private string _Uid;
        //创建adp1是查user表的适配器,下面经常要用,写在了外面。
        UsersTableAdapter adp1 = new UsersTableAdapter();
        //构造函数
        public MainForm()
        {
            InitializeComponent();
        }
        //构造函数重载,将登录者记录
        public MainForm(string uid)
        {
            _Uid = uid;
            InitializeComponent();
        }
        //加载
        private void MainForm_Load(object sender, EventArgs e)
        {
            //根据登录者代号去数据库查找朋友
            FriendsTableAdapter adp = new FriendsTableAdapter();
            qqdata.FriendsDataTable table = new qqdata.FriendsDataTable();
            table = adp.GetDataBy(_Uid);
            //逐个朋友查找出来并显示
            foreach (qqdata.FriendsRow row in table.Rows)
            {
                qqdata.UsersDataTable tab = new qqdata.UsersDataTable();
                tab = adp1.GetDataByUsername(row.FriendName);
                //造自定义控件,用到了自定义控件的构造函数传参数
                Friendsmode friend = new Friendsmode(tab[0].PhotoCode, tab[0].NickName, tab[0].Memo, row.FriendName,_Uid);
                //将控件添加进主界面
                friendlist.Controls.Add(friend);
            }
            //调用显示自己信息的方法
            loadmeinfo();

            //调用加载状态列表的方法
            loadState();

        }
        //显示自己的方法
        private void loadmeinfo()
        {
            qqdata.UsersDataTable tab = new qqdata.UsersDataTable();
            tab = adp1.GetDataByUsername(_Uid);

            metouxiang.Image = imageList3.Images[tab[0].PhotoCode-1];
            menickname.Text = tab[0].NickName;
            mememoname.Text = tab[0].Memo;

            //加载右下角ico上的文字
            notifyIcon1.Text = "QQ:"+tab[0].NickName;
        }
        //加载状态列表的方法
        private void loadState()
        {
            qqdata.UsersDataTable tab = new qqdata.UsersDataTable();
            tab = adp1.GetDataByUsername(_Uid);

            StateTableAdapter adp2 = new StateTableAdapter();
            qqdata.StateDataTable tabs = new qqdata.StateDataTable();
            tabs = adp2.GetData();
            //绑定显示
            updatastate.DataSource = tabs;
            updatastate.DisplayMember = "StateName";
            updatastate.ValueMember = "State";
            //默认状态设置为数据库内的状态
            updatastate.SelectedValue = tab[0].State;

        }
        //窗体关闭后状态设置为离线
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            adp1.UpdateStateByCode(0,_Uid);
        }
        //当用户更改状态时将更改的状态传到数据库
        private void updatastate_SelectionChangeCommitted(object sender, EventArgs e)
        {
            adp1.UpdateStateByCode((Int32)updatastate.SelectedValue, _Uid);
        }
        //双击任务栏右下角小图标显示主窗体
        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            this.Visible = true;
            this.WindowState = FormWindowState.Normal;
        }

        //最小化的时候隐藏窗体
        const int WM_SYSCOMMAND = 0x112;
        const int SC_CLOSE = 0xF060;
        const int SC_MINIMIZE = 0xF020;
        const int SC_MAXIMIZE = 0xF030;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_SYSCOMMAND)
            {
                if (m.WParam.ToInt32() == SC_MINIMIZE)
                {
                    this.Visible = false;
                    return;
                }
            }
            base.WndProc(ref m);
        }

2. 自定义控件下的代码:

       //定义一个变量、属性来控制头像抖动和声音
        private static int n = 0;

        public static int N
        {
            get { return Friendsmode.n; }
            set { Friendsmode.n = value; }
        }
        //定义变量、属性来接收MainForm传过来的自己的名字代号
        private string _Mename;

        public string Mename
        {
            get { return _Mename; }
            set { _Mename = value; }
        }
        //定义变量、属性来接收MainForm传过来的朋友的名字代号
        private string _Friendname;

        public string Friendname
        {
            get { return _Friendname; }
            set { _Friendname = value; }
        }

        private string _Nickname;
        private string _Memo;
        private int _Photo;

        //默认构造
        public Friendsmode()
        {
            InitializeComponent();
        }

        //构造函数重载,将头像代号,昵称,备注,朋友代号和自己的代号传过来接收
        public Friendsmode(int photo,string nickname,string memo,string friendname,string mename):this()
        {
            _Mename = mename;
            _Friendname = friendname;
            _Photo = photo-1;
            _Nickname = nickname;
            _Memo = memo;
        }

        //加载
        private void Friendsmode_Load(object sender, EventArgs e)
        {
            //加载的时候根据朋友代号查询数据库,如果在线头像显示彩色,如果离线或隐身显示头像灰色
            //并将其加载到主界面
            UsersTableAdapter adp = new UsersTableAdapter();
            qqdata.UsersDataTable tab = adp.GetDataByUsername(_Friendname);
            if (tab[0].State == 0 || tab[0].State == 9)
            {
                touxiang.Image = imageList1.Images[_Photo];
            }
            else
            {
                touxiang.Image = imageList2.Images[_Photo];
            }
            nicheng.Text = _Nickname;
            beizhu.Text = _Memo;
        }

        //双击头像进入聊天窗口
        private void touxiang_DoubleClick(object sender, EventArgs e)
        {
            Chat ch = new Chat(_Friendname, _Mename);
            ch.Show();
            //此朋友的头像抖动在打开此聊天窗口时不可用
            timer1.Enabled = false;
            //设置n为1,用来标识此朋友聊天窗口已打开
            n = 1;
        }

        //控制头像抖动
        int i = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            //获取PictureBox当前的位置
            int x = touxiang.Location.X;
            int y = touxiang.Location.Y;
            if (i == 0)
            {
                touxiang.Location = new Point(x + 3, y + 3);
            }
            else if (i == 1)
            {
                touxiang.Location = new Point(x - 6, y);
            }
            else if (i == 2)
            {
                touxiang.Location = new Point(x + 3, y - 3);
            }
            i++;
            if (i >= 3)
            {
                i = 0;
            }
        }

        //记录朋友最后发送时间,用来区别新的未读消息
        DateTime tabx ;

        //控制来新消息的头像抖动和声音提示的时钟
        private void timer2_Tick(object sender, EventArgs e)
        {
            //去数据库查询发送者是该朋友的接受者是自己的,状态未读的消息
            ChatTableAdapter adp = new ChatTableAdapter();
            qqdata.ChatDataTable tab = adp.GetDataBySenderAndReceiver(_Friendname, _Mename, 0);

            //判断如果查出来了,而且最后一条的发送时间与上次的不一样,且聊天窗口未打开时头像抖动和声音提示。
            if (tab.Count > 0 && tab[tab.Count-1].Time != tabx && n==0)
            {
                timer1.Enabled = true;
                tabx =tab[tab.Count-1].Time;
                                //播放声音
                string sound = Application.StartupPath + "/sound/msg.wav";  //Application.StartupPath:程序exe所在的位置
                SoundPlayer player = new SoundPlayer(sound);
                player.Load(); //把声音加载到内存
                //player.PlayLooping();//播放
                player.Play();
            }
        }

        //定义变量用来控制上线时声音只响一次
        int sx = 0;
        //控制在线头像变化和声音
        private void controltx_Tick(object sender, EventArgs e)
        {
            UsersTableAdapter adp = new UsersTableAdapter();
            qqdata.UsersDataTable tab = adp.GetDataByUsername(_Friendname);
            if (tab[0].State == 0 || tab[0].State == 9)
            {
                touxiang.Image = imageList1.Images[_Photo];
                sx = 0;
            }
            else
            {
                if (sx == 0)
                {
                    touxiang.Image = imageList2.Images[_Photo];
                    sx = 1;
                    string sound = Application.StartupPath + "/sound/Global.wav";  //Application.StartupPath:程序exe所在的位置
                    SoundPlayer player = new SoundPlayer(sound);
                    player.Load(); //把声音加载到内存
                    //player.PlayLooping();//播放
                    player.Play();
                }
            }
        }
时间: 2024-10-29 19:08:33

简单的实现QQ通信功能(四)的相关文章

简单的实现QQ通信功能(二)

第二部分:功能需求以及大体思路 一:功能需求: 1. 角色:登录用户. 2. 登录: (1)检查用户名和密码是否正确,正确登录成功,否则提醒用户名或密码错误. (2)登录时可以选择登录状态,送入数据库. (3)记录登录时间,送入数据库. 3. 登录成功之后显示所有的好友信息: (1)分类列出所有好友的信息(带头像). (2)如果有未读的信息,则给提示. (3)来新消息提醒. 4. 主界面功能: (1)显示登录者自己的信息. (2)可以修改自己的状态. (3)最小化之后在右下角显示小图标,双击小图

简单的实现QQ通信功能(三)

第三部分:登陆界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)仿照QQ的登陆界面,右上角放了三个Label,用来做关闭.最小化和设置,使用了它们的Click事件当做按钮用. (2)上面是一个pictureBox放一个图片. (3)下面用tableLayoutPanel布局. (4)tableLayoutPanel左侧图片和图片右下角的在线图放在一个Panel里,这个Panel占3行. (5)用户名用ComboBox,密码框用TextBox,登陆用了个Button.

简单的实现QQ通信功能(一)

第一部分:数据库的设计,数据集的建立 一:数据库的设计: 1.用户表:包含用户名.密码.昵称.性别.备注.状态.头像代号和最后登录时间. 2.朋友关系表:自增长列为主键列,用户名和好友名,还有朋友的状态. 3.聊天内容表:自增长列为主键列,发送者和接收者,中间有聊天内容和发送时间,还有一个标记未读已读的状态. 4. 用户状态表:用户状态表主要是有用户状态和状态名字. 5. SQL数据库内用用查询建立这几个表: use mydb go create table Users ( UserName v

简单的实现QQ通信功能(五)

第五部分:聊天界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)左上角显示朋友的头像和“某某正在和某某聊天”. (2)中间的聊天窗口用了一个ListView,视图用详细信息Details,设置了一列用来显示主项,只用了其中的主项(里面加载头像和需要显示的信息及消息内容),没有设置子项信息. (3)TextBox用来写消息. (4)一个发送的Button. (5)界面用Dock布局. (6)imageList1里面放用户的ico图标,imageList2放用户头像,时

经测试稳定可用的蓝牙链接通信Demo,记录过程中遇到的问题的思考和解决办法,并整理后给出一个Utils类可以简单调用来实现蓝牙功能

说明:这是本人在蓝牙开发过程中遇到过的问题记录和分析,以及解决办法. 在研究过程中,许多的前人给出的解决方案和思路指导对我相当有帮助,但并非都是可采取的解决方法, 经过本人对这些方法的测试和使用过后,给出自己的理解和解决方案,不一定是正确的,但这些方法的确可以解决问题. 如果有人遇到同样的问题,并且看到我的文章解决,那是我的荣幸. !!!!!!但特别需要说明的是,看的越多,不明白的越多,我的看法可能是完全错误的,这些方法只是暂时解决了我的问题, !!!!!!如果有人发现了我的错误,请私信或评论告

Android借用QQ开放平台,简单实现联系客服功能

公司做的电商APP,现在要加入联系客服功能,起初想的是做一个即时聊天系统,以前没做过,这两天开始恶补,后来需求变了,改成调用QQ开放平台,做一个临时会话就行了,这就省了不少力气,也不需要再去组件服务端了. 步骤: 1.引用QQ SDK源码文件. 创建一个工程,并把open-sdk.jar文件和mta_sdk_x.x.x.jar文件拷贝到libs(或lib)目录下,如下图所示: 选中open-sdk.jar和mta_sdk_x.x.x.ja,右键菜单中选择Build Path, 选择Add to 

QQ 通信原理分析(转)

之前写过一个简单的IM,当时遇到过各种令人崩溃的问题:事后也没有做很好的总结,现在看到这篇文章,感慨良多,特此转摘过来,以做备忘. 出处:http://blog.csdn.net/lxnkobe/article/details/7521331 下面有4个基本的问答: 问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机,有着不同的IP地址.服务器端不会以qq用户端的ip作为唯

网站集成QQ登录功能(转)

最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一下,希望对有这方面需求的朋友有所帮助. 一.前期准备 首先你需要登录QQ的开发平台注册一个账号,QQ互联平台官方地址:http://connect.qq.com/ 进去后注册一个开发账号,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图.最后我们会有一个APP ID和APP KEY

网站集成QQ登录功能

最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一下,希望对有这方面需求的朋友有所帮助. 一.前期准备 首先你需要登录QQ的开发平台注册一个账号,QQ互联平台官方地址:http://connect.qq.com/ 进去后注册一个开发账号,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图.最后我们会有一个APP ID和APP KEY