QQ項目之九 主窗體
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; // 消息的發(fā)起者
int friendFaceId; // 發(fā)消息的好友的頭像Id
//********************************************************成員變量定義的結(jié)束!!!!!!!!!
public MainForm()
{
InitializeComponent();
}
///
/// 加載好友到主界面;鏈接數(shù)據(jù)庫的代碼,交給大家!
/// 寫一個連接查詢語句,連接兩個表哦?。。?!
///
///
///
private void MainForm_Load(object sender, EventArgs e)
{
Point p = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width, this.Top);
this.PointToScreen(p); //制定工作區(qū)的坐標,轉(zhuǎn)換成屏幕坐標;
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.加載好友頭像列表放到自定義的方法內(nèi);
public void showFriend() {
//+++++++++++++斷點絕招;大招:try塊;
sbFriends.Groups[0].Items.Clear(); //清除好友分組一內(nèi)所有項
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:不顯示,是一個隱藏標記,我們發(fā)消息的時候,可以直接引用;
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類添加數(shù)據(jù)進行完善!
}
#endregion
#region 2.加載自己頭像列表的方法;
public void showMyInfo() {
//如何加載自己的頭像和昵稱 /鏈接數(shù)據(jù)庫
//借助于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(); //執(zhí)行,返回獲取的數(shù)據(jù)
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"); //設(shè)置托盤圖標的位置;
}
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;
}
//實現(xiàn)的新功能!
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.編輯個人信息窗體,已經(jīng)寫過了
private void tsbtnPersonalInfo_Click(object sender, EventArgs e)
{
PersonalInfoForm personalInfoForm = new PersonalInfoForm();
personalInfoForm.mainForm = this; // 將當前窗體本身傳給個人信息窗體
personalInfoForm.ShowDialog(); //模態(tài)對話框;
}
#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; // 消息狀態(tài)
// 找出未讀消息對應(yīng)的好友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();
// 循環(huán)讀出一個未讀消息
if (dataReader.Read())
{
fromUserId = (int)dataReader["FromUserId"]; //獲得發(fā)消息的ID
messageTypeId = (int)dataReader["MessageTypeId"]; //得到消息的類型
messageState = (int)dataReader["MessageState"]; //發(fā)的消息狀態(tài);
}
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)
{
// 獲得發(fā)消息的人的頭像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()); // 設(shè)置發(fā)消息的好友的頭像索引;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
DBHelper.conn.Close();
}
//如果發(fā)消息的人沒有在列表中就添加到陌生人列表中
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; // 用來標識是否出現(xiàn)錯誤
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]; // 設(shè)定陌生人組為可見組
}
catch (Exception ex)
{
error = true;
Console.WriteLine(ex.Message);
}
finally
{
DBHelper.conn.Close();
}
if (error) // 出錯了
{
MessageBox.Show("服務(wù)器出現(xiàn)意外錯誤!", "抱歉", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
#region 判斷發(fā)消息的人是否在列表中
private bool HasShowUser(int fromUserId)
{ //fromUserId:發(fā)消息過來的好友 號碼,傳參過來,如果相同,表示找到!就在好友閃爍;否則,陌生人
bool find = false; // 表示是否在當前顯示出的用戶列表中找到了該用戶
// 循環(huán) SideBar 中的2個組,尋找發(fā)消息的人是否在列表中
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)
{
// 反復(fù)修改它的圖像;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停止運行
// 圖片恢復(fù)正常
messageImageIndex = 0; //tsbtnMessageReading.Image = Image.FromFile("MessageReading.gif");
tsbtnMessageReading.Image = ilMessage.Images[messageImageIndex];
// 顯示系統(tǒng)消息窗體;請求加為好友的窗體;!!!!
RequestForm requestForm = new RequestForm();
requestForm.ShowDialog();
}
#region 讓相應(yīng)的好友頭像閃爍
private void tmrChatRequest_Tick(object sender, EventArgs e)
{
// 循環(huán)好友列表兩個組中的每個item,找到發(fā)消息的好友,讓他的頭像閃爍
for (int i = 0; i < 2; i++) //0或1
{
for (int j = 0; j < sbFriends.Groups[i].Items.Count; j++) //j:0,....,好友個數(shù)
{
if (Convert.ToInt32(sbFriends.Groups[i].Items[j].Tag) == this.fromUserId) //如果[0][j]==你的好友號碼;
{
if (sbFriends.Groups[i].Items[j].ImageIndex < 100) //實現(xiàn)頭像變化,什么時候引起呢?
{
sbFriends.Groups[i].Items[j].ImageIndex = 100;// 索引為100的圖片是一個空白圖片
}
else
{
sbFriends.Groups[i].Items[j].ImageIndex = this.friendFaceId;
}
sbFriends.Invalidate(); // 重新繪制,只要告訴學(xué)生需要這句話才能正常閃爍頭像就行
}
}
}
}
#endregion
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit(); //退出整個程序,不會導(dǎo)致,你的程序存在于資源管理器
}
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)
{
}
}
}
數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。