首页 > 代码库 > 简单的实现QQ通信功能(五)

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

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

一:效果图及界面设计

1. 效果图:

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通信功能(五)