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

一:效果图及界面设计

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[].PhotoCode, tab[].NickName, tab[].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[].PhotoCode-];
menickname.Text = tab[].NickName;
mememoname.Text = tab[].Memo; //加载右下角ico上的文字
notifyIcon1.Text = "QQ:"+tab[].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[].State; }
//窗体关闭后状态设置为离线
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
adp1.UpdateStateByCode(,_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 = ; 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-;
_Nickname = nickname;
_Memo = memo;
} //加载
private void Friendsmode_Load(object sender, EventArgs e)
{
//加载的时候根据朋友代号查询数据库,如果在线头像显示彩色,如果离线或隐身显示头像灰色
//并将其加载到主界面
UsersTableAdapter adp = new UsersTableAdapter();
qqdata.UsersDataTable tab = adp.GetDataByUsername(_Friendname);
if (tab[].State == || tab[].State == )
{
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 = ;
} //控制头像抖动
int i = ;
private void timer1_Tick(object sender, EventArgs e)
{
//获取PictureBox当前的位置
int x = touxiang.Location.X;
int y = touxiang.Location.Y;
if (i == )
{
touxiang.Location = new Point(x + , y + );
}
else if (i == )
{
touxiang.Location = new Point(x - , y);
}
else if (i == )
{
touxiang.Location = new Point(x + , y - );
}
i++;
if (i >= )
{
i = ;
}
} //记录朋友最后发送时间,用来区别新的未读消息
DateTime tabx ; //控制来新消息的头像抖动和声音提示的时钟
private void timer2_Tick(object sender, EventArgs e)
{
//去数据库查询发送者是该朋友的接受者是自己的,状态未读的消息
ChatTableAdapter adp = new ChatTableAdapter();
qqdata.ChatDataTable tab = adp.GetDataBySenderAndReceiver(_Friendname, _Mename, ); //判断如果查出来了,而且最后一条的发送时间与上次的不一样,且聊天窗口未打开时头像抖动和声音提示。
if (tab.Count > && tab[tab.Count-].Time != tabx && n==)
{
timer1.Enabled = true;
tabx =tab[tab.Count-].Time;

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

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

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

    第二部分:功能需求以及大体思路 一:功能需求: 1. 角色:登录用户. 2. 登录: (1)检查用户名和密码是否正确,正确登录成功,否则提醒用户名或密码错误. (2)登录时可以选择登录状态,送入数据库 ...

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

    第三部分:登陆界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)仿照QQ的登陆界面,右上角放了三个Label,用来做关闭.最小化和设置,使用了它们的Click事件当做按钮 ...

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

    第五部分:聊天界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)左上角显示朋友的头像和“某某正在和某某聊天”. (2)中间的聊天窗口用了一个ListView,视图用详细信 ...

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

    第一部分:数据库的设计,数据集的建立 一:数据库的设计: 1.用户表:包含用户名.密码.昵称.性别.备注.状态.头像代号和最后登录时间. 2.朋友关系表:自增长列为主键列,用户名和好友名,还有朋友的状 ...

  5. Android BLE与终端通信(四)——实现服务器与客户端即时通讯功能

    Android BLE与终端通信(四)--实现服务器与客户端即时通讯功能 前面几篇一直在讲一些基础,其实说实话,蓝牙主要为多的还是一些概念性的东西,当你把概念都熟悉了之后,你会很简单的就可以实现一些逻 ...

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

    说明:这是本人在蓝牙开发过程中遇到过的问题记录和分析,以及解决办法. 在研究过程中,许多的前人给出的解决方案和思路指导对我相当有帮助,但并非都是可采取的解决方法, 经过本人对这些方法的测试和使用过后, ...

  7. android-使用环信SDK开发即时通信功能及源代码下载

    近期项目中集成即时聊天功能.挑来拣去,终于选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁.说明文档清楚易懂.文档有android.ios.和后台server端.还是非常全的. 环信官网: ...

  8. jsp+servlet+mysql 实现简单的银行登录转账功能

    jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...

  9. 网站集成QQ登录功能

    最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...

随机推荐

  1. NOI2008 志愿者招募

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1859  Solved: 1169[Submit][Stat ...

  2. 通过 Azure 媒体管理门户开始使用直播流媒体

    Jason Suess Azure媒体服务首席项目经理 几个月前,我们宣布发布 Azure媒体服务直播服务的公共预览版.其实这些直播服务早已被美国国家广播公司体育台用于多项重大体育赛事的多平台直播 ...

  3. 【转】我的WIN7分辨率是1920*1080,调低后字体模糊

    原文网址:http://tieba.baidu.com/p/778306758 WIN7还有一个“使用XP风格DPI缩放”的选项,如果选中则只放大文字,不选会连对话框和文字全部放大 这么多层楼,只有这 ...

  4. 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...

  5. javascript 中concat与push的区别

    1. push 遇到数组参数时,把整个数组参数作为一个元素:而 concat 则是拆开数组参数,一个元素一个元素地加进去. 2. push 直接改变当前数组:concat 不改变当前数组. 总结:如果 ...

  6. BrnMall多店版网上商城正式发布

    前些日子一直忙于多店版网上商城系统BrnMall的开发,工作比较多,所以博客断了.这几天项目完成了,时间比较自由,所以把这段时间总结的一些关于单店版BrnShop和多店版BrnMall区别写下来,希望 ...

  7. c#抓取当前电脑显示分辨率

    using System.Windows.Forms; 获取屏幕分辨率            int SH = Screen.PrimaryScreen.Bounds.Height;          ...

  8. BZOJ 2588: Spoj 10628. Count on a tree 主席树+lca

    分析:树上第k小,然后我想说的是主席树并不局限于线性表 详细分析请看http://www.cnblogs.com/rausen/p/4006116.html,讲的很好, 然后因为这个熟悉了主席树,真是 ...

  9. 【HTML】Advanced2:Conditional Comments

    1.try and figure out what is sensible for you to support. Are your web site visitors likely to be us ...

  10. JDK1.5新特性(一)……Enhanced for Loop

    援引 Enhanced for Loop - This new language construct eliminates the drudgery and error-proneness of it ...