码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-06 21:29:56      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   os   for   sp   数据   

第五部分:聊天界面的设计及代码

一:效果图及界面设计

1. 效果图:

bubuko.com,布布扣

2. 界面设计:

(1)左上角显示朋友的头像和“某某正在和某某聊天”。

(2)中间的聊天窗口用了一个ListView,视图用详细信息Details,设置了一列用来显示主项,只用了其中的主项(里面加载头像和需要显示的信息及消息内容),没有设置子项信息。

(3)TextBox用来写消息。

(4)一个发送的Button。

(5)界面用Dock布局。

(6)imageList1里面放用户的ico图标,imageList2放用户头像,时钟timer1来查询显示聊天消息内容。

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

聊天内容显示窗口chatwindow,写信息文本框senderword,发送按钮btnsender

二:代码设计:

       private string _Friendname;

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

        public string Mename
        {
            get { return _Mename; }
            set { _Mename = value; }
        }
        public Chat()
        {
            InitializeComponent();
        }
        //构造函数重载
        public Chat(string friendname,string mename)
            : this()
        {
            _Friendname = friendname;
            _Mename = mename;
        }
        //加载
        private void Chat_Load(object sender, EventArgs e)
        {
            //加载左上角的ico及显示文字
            UsersTableAdapter adp = new UsersTableAdapter();
            qqdata.UsersDataTable table = adp.GetDataByUsername(_Friendname);
            Bitmap a = (Bitmap)imageList1.Images[table[0].PhotoCode-1];
            
            this.Icon = System.Drawing.Icon.FromHandle(a.GetHicon());

            this.Text = getmemoname(_Mename) + "正在和" + getmemoname(_Friendname) + "聊天";
        }
        //根据用户名获取昵称的方法
        private string getmemoname(string name)
        {
            UsersTableAdapter adp1 = new UsersTableAdapter();
            qqdata.UsersDataTable tab = new qqdata.UsersDataTable();
            tab = adp1.GetDataByUsername(name);

            return tab[0].Memo;
        }

        //按下发送键
        private void btnsender_Click(object sender, EventArgs e)
        {
            string nr = senderword.Text;
            DateTime sj = DateTime.Now;

            //将自己发送的聊天内容,时间传到数据库
            new ChatTableAdapter().InsertChat(_Mename,_Friendname,nr,sj,0);
            senderword.Text = "";
            
            //将自己发送的内容直接显示出来,添加显示(非绑定)
            qqdata.UsersDataTable tab = new UsersTableAdapter().GetDataByUsername(_Mename);
            //造主项
            ListViewItem item = new ListViewItem();
            //设置主项信息
            item.Text = getmemoname(_Mename) + sj.ToString() + "说:" + nr;
            item.ImageIndex = tab[0].PhotoCode - 1;
            chatwindow.Items.Add(item);
        }

        //时间控件循环查
        private void timer1_Tick(object sender, EventArgs e)
        {
            //数据库内查找此朋友发来的未读消息,添加显示出来,显示完设置已读
            qqdata.ChatDataTable tab2 = new ChatTableAdapter().GetDataBySenderAndReceiver(_Friendname,_Mename,0);

            foreach (qqdata.ChatRow row in tab2.Rows)
            {
                qqdata.UsersDataTable tab = new UsersTableAdapter().GetDataByUsername(row.Sender);
                //造主项
                ListViewItem item = new ListViewItem();
                //设置主项信息
                item.Text = getmemoname(row.Sender) + row.Time.ToString() + "说:" + row.Content;
                item.ImageIndex = tab[0].PhotoCode - 1;
                //标记为已读
                if (row.Sender == _Friendname)
                {
                    new ChatTableAdapter().UpdateState(1, row.Ids);
                }

                chatwindow.Items.Add(item);
            }
           
        }
        //窗体关闭的时候给N赋值为0,控制自定义控件头像在聊天关闭后来消息提醒
        private void Chat_FormClosed(object sender, FormClosedEventArgs e)
        {
            Friendsmode.N = 0;
        }

 

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

标签:style   blog   http   color   ar   os   for   sp   数据   

原文地址:http://www.cnblogs.com/Alvin-ftd/p/4079713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!