登录窗体设计如上图所示。图中标注的1是两个自定义的按钮,分别是最小化与关闭,鼠标移动到上面时会出现颜色改变的效果。2是一个pictureBox,背景颜色与下方颜色相同,一般是隐藏的,当验证信息正确之后,会显示出来,遮挡上面panel的下面一部分,然后小图片会向右向上移动到中间,产生动画效果。
3是三个文本框,打开时分别显示用户名、密码等,鼠标点击时,会清空文本框内容。鼠标离开时,如果有输入则显示输入内容,如果没有输入则会还原显示。
正下方是一个登陆按钮,原本用的是button,后来出现一个小问题,然后改成了pictureBox,最后发现那个问题并不是button引起的。(这个小问题是,登陆button弄成无边框的,但是点击之后登陆button周围有时会出现边框,试了各种方法都没找出是什么原因,于是换成pictureBox,换了之后没再出现边框,但是右上角的按钮偶尔又出现了边框,后来百度了半天发现是由于seleteTab的原因,于是写了button的子类,将seleteTab设为false,接着边框又出现在了linklabel上,于是又写了linklabel的子类,问题就解决了)
文本框点击效果代码:
privatevoideUser_Leave(objectsender, EventArgse) //文本框如果没有输入,就会显示回去
{
if (eUser.Text=="")
{
eUser.ForeColor=Color.FromArgb(150, 150, 150);
eUser.Text="用户名";
}
}
privatevoideUser_Enter(objectsender, EventArgse)
{
if (eUser.Text=="用户名")
{
eUser.Text="";
eUser.ForeColor=Color.FromArgb(0, 0, 0);
}
}
验证用户名与密码的方法:
数据保存在当前目录下的gameData中,格式为:用户名★密码★分数☆
读取当前目录下的gameData文件,如果不存在则创建,提示用户不存在,进行注册。如果存在的话,将文件读取至一个string s里,利用Split按照☆对字符串s进行分割,获得一个数组sp[],数组的元素为每个用户的信息(用户名、密码、分数)。然后对该数组sp[]的每个元素利用Split按照★进行分割,存入数组ssp[]中,此时的数组ssp[]中包含3个元素(用户名、密码、分数),遍历数组sp[]对每个ssp[0]进行查看,如果等于登陆框中的用户名则进行密码判断(比对ssp[1]),如果不存在则提示用户不存在。
FileStreamfsRead=newFileStream("gameData", FileMode.OpenOrCreate, FileAccess.Read);
byte[] rbuffer=newbyte[1024*1024];
intr=fsRead.Read(rbuffer, 0, rbuffer.Length);
strings=Encoding.Default.GetString(rbuffer, 0, r); //所有的游戏数据
fsRead.Close();
fsRead.Dispose();
if (s!="")
{
char[] cs= { '☆' };
string[] sp=s.Split(cs, StringSplitOptions.RemoveEmptyEntries);//每个人的游戏数据
for (inti=0; i<sp.Length; i++)
{
char[] ccs= { '★' };
string[] ssp=sp[i].Split(ccs, StringSplitOptions.RemoveEmptyEntries);//个人的数据
if (eUser.Text==ssp[0])
{
if (ePasswd.Text==ssp[1])
{
aFlag=false; //用来判断执行登录操作还是取消登录操作
eUser.Hide();
ePasswd.Hide();
eIdentify.Hide();
linkLabel1.Hide();
linkLabel2.Hide();
linkLabel3.Hide();
label4.Hide();
pictureBox2.Show();
pictureBox3.Image=Image.FromFile(target+@"\Resources\取消1.png");
loFlag=true; //判断窗口保持原样还是登录中的样子
suFlag=true; //判断是否登录成功(用户名、密码、验证码均正确)
yFlag=true; //再次判断是否登录取消,若取消则登录界面回到原样
break;
}
else
{
MessageBox.Show("密码错误");
break;
}
}
else
{
count++;
if (count==sp.Length)
{
MessageBox.Show("账号不存在,请注册");
}
}
}
}
验证信息成功后头像移动的动画效果(通过三个timer实现):
private void timer1_Tick(object sender, EventArgs e)//登录时,图片移动到中间,仿QQ式登录
{
if (loFlag) //判断点击登录时是登录还是取消登陆
{
if (pictureBox1.Left <= 148)
{
pictureBox1.Left += 10;
}
if (pictureBox1.Top >= 152)
{
pictureBox1.Top -= 2;
if (pictureBox1.Top == 152)
{
if (suFlag) //判断登录信息是否验证成功
{
this.timer4.Interval = 1000; //为了让窗口停留在正在登陆的状态
this.timer4.Enabled = true;
this.timer4.Start();
}
}
}
}
private void timer4_Tick(object sender, EventArgs e) //仿QQ登录中的状态
{
if (this.Opacity > 0)
{
this.Opacity -= 0.05;
if (this.Opacity < 0.9)
{
if (yFlag) //再次判断是否登录取消,若取消则登录界面回到原样 {
this.timer3.Interval = 10;
this.timer3.Enabled = true;
this.timer3.Start();
}
else if(this.Opacity < 0.8)
this.Opacity = 0.9;
this.timer4.Stop();
}
}
}
private void timer3_Tick(object sender, EventArgs e) //登录窗口贱贱消失,游戏窗口贱贱出现
{
if (this.Opacity > 0)
{
this.Opacity -= 0.05;
if (this.Opacity < 0.1)
{
this.Hide();
MainForm mf = new MainForm();
mf.Opacity = 0;
mf.Show();
mf.timer1.Interval = 10;
mf.timer1.Enabled = true;
mf.timer1.Start();
this.timer3.Stop();
}
}
}
注册窗体如上图所示,与登录窗体差不多文本框的处理也是一样。
当玩家点击注册时,首先会打开当前目录下的gameData文件,如果不存在则创建,然后与登录检测用户名时一样,先检测玩家输入的名字是否已经存在,如果存在则提示其重新注册,如果不存在,则追加进去,格式就是上面说的那样,分数默认为0。