这里面我们首先需要拉一个第三方控件:sidebar控件,然都在拉一些声音源到bin下面的Debug
在进行代码编写
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using Aptech.UI;
using System.Media;//引入声音命名空间
namespace MyQQ
{
public partial class MainFrm : Form
{
public MainFrm()
{
InitializeComponent();
}
//改变QQ登录的状态
private void MainFrm_FormClosed(object sender, FormClosedEventArgs e)
{
LoginState();
}
//得到登陆者的信息
public void GetSelf()
{
string sql = string.Format("select FaceId,NickName from users where Id = {0}", LoginHelper.fromQQ);
SqlCommand cmd = new SqlCommand(sql, DbHelper.conn);
SqlDataReader reader = null;
try
{
DbHelper.opendb();
reader = cmd.ExecuteReader();
if (reader.Read())
{
this.picFace.Image = this.imageFace.Images[Convert.ToInt32(reader[0])];
this.lblNickName.Text = Convert.ToString(reader[1]) + "(" + LoginHelper.fromQQ + ")";
}
this.Text = LoginHelper.fromQQ.ToString();
reader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
DbHelper.closedb();
}
}
//窗体加载时(调用所显示的内容的方法)
private void MainFrm_Load(object sender, EventArgs e)
{
GetSelf();
this.sideBar.AddGroup("我的好友");
this.sideBar.AddGroup("陌生人");
GetFriends();
}
//主窗体信息
public void GetFriends()
{
this.sideBar.Groups[0].Items.Clear();
string sql = string.Format(@"select Users.Id,Users.NickName,Users.FaceId
from Friends inner join Users
on Friends.FriendId = Users.Id
where HostId = {0}",LoginHelper.fromQQ);
SqlCommand cmd = new SqlCommand (sql,DbHelper.conn);
SqlDataReader reader = null;
try
{
DbHelper.opendb();
reader = cmd.ExecuteReader();
while(reader.Read())
{
SbItem sidebar =new SbItem (reader[1].ToString(),Convert.ToInt32(reader[2]));
sidebar.Tag = Convert.ToInt32(reader[0]);
this.sideBar.Groups[0].Items.Add(sidebar);
}
reader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}finally
{
DbHelper.closedb();
}
}
//点击查找添加好友显示查找/添加好友窗体
private void tsbSearchFriends_Click(object sender, EventArgs e)
{
SearchFrm sf = new SearchFrm();
sf.ShowDialog();
}
//通过个人信息窗体控制主窗体上面的信息
public void SetNickNameFaceId(string NickName, int faceId)
{
this.lblNickName.Text = NickName + "("+LoginHelper.fromQQ.ToString()+")";
this.picFace.Image = this.imageFace.Images[faceId];
}
//点击编辑个人信息显示编辑个人信息窗体(调用通过个人信息窗体控制主窗体的上面的主要信息的方法)
private void tsbEdiPersonalInformaion_Click(object sender, EventArgs e)
{
PersonalFrm pf = new PersonalFrm();
pf.mf = this;
pf.ShowDialog();
}
int fromQQ = 0;//发过来消息的QQ号。
int faceid = 0;//发过来消息的QQ头像。
//获取QQ号
public bool hasFriends(int fromQQ)
{
for (int i = 0; i < this.sideBar.Groups.Count; i++)
{
for (int j = 0; j < this.sideBar.Groups[i].Items.Count; j++)
{
if (Convert.ToInt32(this.sideBar.Groups[i].Items[j].Tag) == fromQQ)
{
return true;
}
}
}
return false;
}
//添加陌生人为好友
public void AddStrangeness(int fromQQ)
{
string sql = string.Format("select NickName,FaceId from Users where Id = {0}", fromQQ);
SqlCommand cmd = new SqlCommand(sql,DbHelper.conn);
SqlDataReader reader = null;
try
{
DbHelper.opendb();
reader = cmd.ExecuteReader();
if (reader.Read())
{
SbItem item = new SbItem(reader[0].ToString(), Convert.ToInt32(reader[1]));
item.Tag = fromQQ;
this.sideBar.Groups[1].Items.Add(item);
this.sideBar.VisibleGroup = this.sideBar.Groups[1];
}
reader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
DbHelper.closedb();
}
}
//使用time每两秒获取数据库里面的信息对其进行判断
private void timer_Tick(object sender, EventArgs e)
{
GetFriends();
int messageTypeId = 0;//消息类型
int messageState = 0;//消息状态
string sql = string.Format("select top 1 FromUserId,MessageTypeId,MessageState from Messages where MessageState = 0 and ToUserId = {0}", LoginHelper.fromQQ);
SqlCommand cmd = new SqlCommand(sql, DbHelper.conn);
SqlDataReader reader = null;
try
{
DbHelper.opendb();
reader = cmd.ExecuteReader();
if(reader.Read())
{
this.fromQQ = Convert.ToInt32(reader[0]);
messageTypeId = Convert.ToInt32(reader[1]);
messageState = Convert.ToInt32(reader[2]);
}
reader.Close();
if (messageTypeId == 2 && messageState == 0)
{//未读的添加消息,让消息喇叭闪烁。
this.timerAddFriends.Enabled = true;
SoundPlayer player = new SoundPlayer("system.wav");
player.Play();
}
else if (messageTypeId == 1 && messageState == 0)
{//未读的聊天消息,让头像闪烁。
SoundPlayer player = new SoundPlayer("msg.wav");
player.Play();
sql = string.Format("select FaceId from users where Id = {0}", this.fromQQ);
cmd.CommandText = sql;
cmd.Connection = DbHelper.conn;
this.faceid = Convert.ToInt32(cmd.ExecuteScalar());
if (hasFriends(fromQQ) == false)
{//添加陌生人,说明:sidebar控件中,没有头像
AddStrangeness(fromQQ);
}
//启动时间控件使头像闪烁
this.timerFlash.Enabled = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
DbHelper.closedb();
}
}
//使用time控件对头像进行切换
private void timerFlash_Tick(object sender, EventArgs e)
{
for (int i = 0; i < this.sideBar.Groups.Count; i++)
{
for (int j = 0; j < this.sideBar.Groups[i].Items.Count; j++)
{
if (this.fromQQ == Convert.ToInt32(this.sideBar.Groups[i].Items[j].Tag))
{
if (this.sideBar.Groups[i].Items[j].ImageIndex < 100)
{
this.sideBar.Groups[i].Items[j].ImageIndex = 100;
}
else
{
this.sideBar.Groups[i].Items[j].ImageIndex = this.faceid;
}
this.sideBar.Invalidate();//重绘sideBar控件
}
}
}
}
//点击头像进行聊天
public static ChatFrm cf;
private void sideBar_ItemDoubleClick(SbItemEventArgs e)
{
//保存对方QQ号
int fromQQ = Convert.ToInt32(e.Item.Tag);
//判断当前好友的聊天窗体是否存在与集合中
if(OpenedFrmList.dicts.ContainsKey(fromQQ))
{
//使窗体激活并赋予焦点
OpenedFrmList.dicts[fromQQ].Activate();
return;
}
//如果未在集合中,则打开一个新窗体
ChatFrm cf = new ChatFrm();
//对方昵称
cf.NickName = e.Item.Text;
if (e.Item.ImageIndex == 100)
{
//对方的头像ID
cf.fromQQ = faceid;
e.Item.ImageIndex = this.faceid;
}
else
{
//双击的头像
cf.fromQQ = e.Item.ImageIndex;
}
//我的昵称
cf.fromQQ = fromQQ;
if (this.timerFlash.Enabled == true)
{
this.timerFlash.Stop();
}
//把打开的聊天窗体的QQ号保存在集合中
OpenedFrmList.dicts.Add(fromQQ, cf);
cf.Show();
}
//右键是否显这些菜单
private void cmsMenu_Opening(object sender, CancelEventArgs e)
{
if (this.sideBar.SeletedItem == null)
{
this.Deletetsmi.Visible = false;
}
else
{
this.Deletetsmi.Visible = true;
}
if (this.sideBar.VisibleGroup == this.sideBar.Groups[1])
{
this.AddFriendstsmi.Visible = true;
}
else
{
this.AddFriendstsmi.Visible = false;
}
}
//右键切换图标大小
private void BigIcontsmi_Click(object sender, EventArgs e)
{
if (this.sideBar.View == SbView.LargeIcon)
{
this.BigIcontsmi.Text = "大图标";
this.sideBar.View = SbView.SmallIcon;
}
else if (this.sideBar.View == SbView.SmallIcon)
{
this.BigIcontsmi.Text = "小图标";
this.sideBar.View = SbView.LargeIcon;
}
}
//右键添加好友
private void AddFriendstsmi_Click(object sender, EventArgs e)
{
if(this.sideBar.SeletedItem != null)
{
string sql = "";
int fromQQ = Convert.ToInt32(this.sideBar.SeletedItem.Tag);
sql = string.Format("insert into friends values({0},{1})",LoginHelper.fromQQ,fromQQ);
SqlCommand cmd = new SqlCommand(sql, DbHelper.conn);
try
{
DbHelper.opendb();
cmd.ExecuteNonQuery();
sql = string.Format("insert into friends values({0},{1})", fromQQ,LoginHelper.fromQQ );
cmd.CommandText = sql;
cmd.Connection = DbHelper.conn;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
DbHelper.closedb();
this.sideBar.Groups[1].Items.Remove(this.sideBar.SeletedItem);
}
}
}
//右键删除好友
private void Deletetsmi_Click(object sender, EventArgs e)
{
if (this.sideBar.VisibleGroup == this.sideBar.Groups[0])
{
if (this.sideBar.SeletedItem != null)
{
int fromQQ = Convert.ToInt32(this.sideBar.SeletedItem.Tag);
string sql = string.Format("delete from Friends where HostId = {0} and FriendId = {1}", LoginHelper.fromQQ, fromQQ);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = sql;
cmd.Connection = DbHelper.conn;
try
{
DbHelper.opendb();
cmd.ExecuteNonQuery();
sql = string.Format("delete from Friends where HostId = {0} and FriendId = {1}", fromQQ, LoginHelper.fromQQ);
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
DbHelper.closedb();
}
}
}
else if (this.sideBar.VisibleGroup == this.sideBar.Groups[1])
{
this.sideBar.Groups[1].Items.Remove(this.sideBar.SeletedItem);
}
}
bool flag = false;
//如果有消那么消息按钮闪烁
private void timerAddFriends_Tick(object sender, EventArgs e)
{
if(flag == true)
{
this.tsbNewMessage.Image = this.imageAddFriends.Images[0];
flag = false;
}else if(flag == false)
{
this.tsbNewMessage.Image = this.imageAddFriends.Images[1];
flag = true;
}
}
//点击弹出添加好友验证窗体
private void tsbNewMessage_Click(object sender, EventArgs e)
{
AddFriendsFrm af = new AddFriendsFrm();
af.Show();
if (this.timerAddFriends.Enabled == true)
{
this.timerAddFriends.Enabled = false;
}
this.tsbNewMessage.Image = this.imageAddFriends.Images[1];
}
//点击sidebar里面的组播放切换组的声音
private void sideBar_VisibleGroupChanged(SbGroupEventArgs e)
{
SoundPlayer player = new SoundPlayer("folder.wav");
player.Play();
}
//刷新窗体
private void tsbRefresh_Click(object sender, EventArgs e)
{
GetFriends();
}
//点击判断是否退出程序
private void tsbExi_Click(object sender, EventArgs e)
{
DialogResult r = MessageBox.Show("提示信息","确认要退出么?",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
if (r == System.Windows.Forms.DialogResult.Yes)
{
LoginState();
Application.Exit();
}
}
//点击头像获取个人信息
private void picFace_Click(object sender, EventArgs e)
{
PersonalFrm pf = new PersonalFrm();
pf.Show();
}
//点击菜单按钮链接到本地外部资源
private void tsbTencent_Click(object sender, EventArgs e)
{
Help.ShowHelp(this, "D:\\Program Files\\Tencent\\QQLive\\QQLive.exe");
}
//单击头像弹出个人资料
private void picFace_DoubleClick(object sender, EventArgs e)
{
PersonalFrm pf = new PersonalFrm();
pf.Show();
}
//登录的状态
public void LoginState()
{
string sql = string.Format("update users set LoginState=0 where id={0}", LoginHelper.fromQQ);
SqlCommand cmd = new SqlCommand(sql, DbHelper.conn);
try
{
DbHelper.opendb();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
DbHelper.closedb();
}
}
//退出应用程序
private void MainFrm_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
//跳转到设置密保的窗体
private void MiBaotsmt_Click(object sender, EventArgs e)
{
MiBaoFrm mbf = new MiBaoFrm();
mbf.ShowDialog();
}
}
}