简单的实现QQ通信功能(四)
第四部分:主界面的设计及代码
一:效果图及界面设计
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通信功能(四)的更多相关文章
- 简单的实现QQ通信功能(二)
第二部分:功能需求以及大体思路 一:功能需求: 1. 角色:登录用户. 2. 登录: (1)检查用户名和密码是否正确,正确登录成功,否则提醒用户名或密码错误. (2)登录时可以选择登录状态,送入数据库 ...
- 简单的实现QQ通信功能(三)
第三部分:登陆界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)仿照QQ的登陆界面,右上角放了三个Label,用来做关闭.最小化和设置,使用了它们的Click事件当做按钮 ...
- 简单的实现QQ通信功能(五)
第五部分:聊天界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)左上角显示朋友的头像和“某某正在和某某聊天”. (2)中间的聊天窗口用了一个ListView,视图用详细信 ...
- 简单的实现QQ通信功能(一)
第一部分:数据库的设计,数据集的建立 一:数据库的设计: 1.用户表:包含用户名.密码.昵称.性别.备注.状态.头像代号和最后登录时间. 2.朋友关系表:自增长列为主键列,用户名和好友名,还有朋友的状 ...
- Android BLE与终端通信(四)——实现服务器与客户端即时通讯功能
Android BLE与终端通信(四)--实现服务器与客户端即时通讯功能 前面几篇一直在讲一些基础,其实说实话,蓝牙主要为多的还是一些概念性的东西,当你把概念都熟悉了之后,你会很简单的就可以实现一些逻 ...
- 经测试稳定可用的蓝牙链接通信Demo,记录过程中遇到的问题的思考和解决办法,并整理后给出一个Utils类可以简单调用来实现蓝牙功能
说明:这是本人在蓝牙开发过程中遇到过的问题记录和分析,以及解决办法. 在研究过程中,许多的前人给出的解决方案和思路指导对我相当有帮助,但并非都是可采取的解决方法, 经过本人对这些方法的测试和使用过后, ...
- android-使用环信SDK开发即时通信功能及源代码下载
近期项目中集成即时聊天功能.挑来拣去,终于选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁.说明文档清楚易懂.文档有android.ios.和后台server端.还是非常全的. 环信官网: ...
- jsp+servlet+mysql 实现简单的银行登录转账功能
jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...
- 网站集成QQ登录功能
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
随机推荐
- BZOJ2741: 【FOTILE模拟赛】L
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1170 Solved: 303[Submit][Status] ...
- MFC UpdateData自动更新
嗯,添加一个按钮和我们自己定义的成员变量 关联. 方法1. 在*.rc 或者class 类视图中点击[add variable],就会自动生成DDX_Text(*,*)的内容及其IF 方法2. 自己 ...
- windows API中的各种字符串的本质
windows 库中的各种string, char, wchar, TCHAR, lpstr, lpwstr, lpcwstr , cstring , BSTR, _bstr_t 等 ...
- RegisterFunction z
#region SolidWorks Registration [ComRegisterFunctionAttribute] public static void RegisterFunction(T ...
- 【原】泛型-Java
泛型是Java SE5.0中新增的新特性,通过泛型使得在代码编译的时候就能检查类型安全,并且所有的强制类型转换都是自动和隐式的,从而提高代码的重用率. Note:在JavaSE7+以后的版本中,构造函 ...
- C程序设计 习题之1-20 detab
码农一定是最需要动手实操的行业之一.有一句话叫,好记性不如烂笔头,牵强附会引申到这里,变成看书百遍,不如码字运行一遍.是不是有那么一点味道?哈哈! 这几天看的<C程序设计>,看完每个章节还 ...
- grep环境变量常用配置
vim ~/.bashrc GREP_OPTIONS="-irns --exclude-dir=output --exclude=tags --exclude=*.files" 然 ...
- spring 的配置 bean>>property>>name属性
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- org.apache.hadoop.hbase.TableNotDisabledException 解决方法
Exception in thread "main" org.apache.hadoop.hbase.TableNotDisabledException: org.apache.h ...
- Amabri安装前的准备工作
Ambari这个东东对操作系统的要求还是很高的,首先限制了要使用CentOS,RHEL,并且还是64bit 的,让我的Ubuntu泪奔啊---手头正好有RHEL6.x的盘,于是就用红帽吧.但是红帽是收 ...