目录
下面是代码的详细解释:
类声明和成员变量
构造函数
窗体加载事件
生成验证码方法
pictureBox1 点击事件
按钮点击事件
完整代码:
总结
这段代码是一个C# Windows Forms应用程序的一部分,用于生成和验证验证码。
下面是代码的详细解释:
类声明和成员变量
Form1
类继承自Form
,表示一个Windows表单。checkCode
是一个私有字符串变量,用于存储生成的验证码,以便与用户输入的数据进行比较。public partial class Form1 : Form { private string checkCode = string.Empty;
构造函数
InitializeComponent
方法用于初始化窗体上public Form1() { InitializeComponent(); }
窗体加载事件
- 当窗体加载时,这个方法设置了一个工具提示,提示用户可以点击
pictureBox1
来重新生成验证码,并调用GenCheckCode
方法生成一个包含5个字符的验证码图像。private void Form1_Load(object sender, EventArgs e) { toolTip1.SetToolTip(pictureBox1, "点击重新生成验证码"); pictureBox1.Image = GenCheckCode(5); }
生成验证码方法
GenCheckCode
方法生成一个包含指定数量字符的验证码图像。- 创建一个
Bitmap
对象,大小与pictureBox1
相同。 - 使用
Graphics
对象在Bitmap
上绘制白色背景。 - 定义一个包含字母和数字的字符串。
- 使用
Random
类生成随机数,用于选择字符和颜色。 - 使用
StringBuilder
构建验证码字符串。 - 绘制每个字符,并随机设置字符的颜色和位置。
- 定义一组
Pen
对象,用于绘制干扰线。 - 绘制干扰线。
private Bitmap GenCheckCode(int count) { int width = pictureBox1.Width; int height = pictureBox1.Height; Bitmap bitMap = new Bitmap(width, height); Graphics g = Graphics.FromImage(bitMap); g.FillRectangle(new SolidBrush(Color.White), 0, 0, width, height); string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; Random r = new Random(); StringBuilder s = new StringBuilder(); Font font = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold, GraphicsUnit.Pixel); Color[] colors = { Color.Blue, Color.Green, Color.Red, Color.Orange, Color.Orchid,Color.Yellow,Color.Chocolate,Color.Brown, Color.Gold, Color.Black, Color.Gray, Color.DarkBlue }; for (int i = 0; i < count; i++) { int colorIndex = r.Next(0, colors.Length); int letterIndex = r.Next(0, letters.Length); string letter = letters[letterIndex].ToString(); s.Append(letter); g.DrawString(letter, font, new SolidBrush(colors[colorIndex]), i * 28, r.Next(0, 15)); } checkCode = s.ToString(); Pen[] pens = { new Pen(Color.Blue, 2){DashStyle=DashStyle.Solid}, new Pen(Color.Green, 2){DashStyle=DashStyle.Dash}, new Pen(Color.Red, 2){DashStyle=DashStyle.Dot}, new Pen(Color.Orange, 2){DashStyle=DashStyle.DashDot}, new Pen(Color.Orchid, 2){DashStyle=DashStyle.DashDotDot}, new Pen(Color.Yellow, 2){DashStyle=DashStyle.Solid}, new Pen(Color.Chocolate, 2){DashStyle=DashStyle.Dash}, new Pen(Color.Brown, 2){DashStyle=DashStyle.Dot}, new Pen(Color.Gold, 2){DashStyle=DashStyle.DashDot}, new Pen(Color.Black, 2){DashStyle=DashStyle.DashDotDot}, new Pen(Color.Gray, 2){DashStyle=DashStyle.DashDot}, new Pen(Color.DarkBlue, 2){DashStyle=DashStyle.DashDotDot} }; for (int i = 0; i < 10; i++) { int penIndex = r.Next(0,12); g.DrawLine(pens[penIndex], new Point(r.Next(0, width), r.Next(0, height)), new Point(r.Next(0, width), r.Next(0, height))); } return bitMap; }
pictureBox1 点击事件
- 当用户点击
pictureBox1
时,调用GenCheckCode
方法重新生成验证码。private void pictureBox1_Click(object sender, EventArgs e) { pictureBox1.Image = GenCheckCode(5); }
按钮点击事件
- 当用户点击验证按钮时,这个方法会比较文本框
textBox1
中的文本与生成的验证码checkCode
是否匹配,并显示相应的消private void button2_Click(object sender, EventArgs e) { if (textBox1.Text == checkCode) { MessageBox.Show("输入的验证码正确!"); return; } else { MessageBox.Show("验证码不正确,请重新输入!"); return; } }
完整代码:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;
namespace _2.验证码
{
public partial class Form1 : Form
{
// 保存生成的验证码,和用户输入的数据进行比较。
private string checkCode = string.Empty;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
toolTip1.SetToolTip(pictureBox1, "点击重新生成验证码");
pictureBox1.Image = GenCheckCode(5);
}
/// <summary>
/// 生成验证图片核心代码
/// </summary>
/// <param name="count">几位验证码</param>
/// <returns>验证码</returns>
private Bitmap GenCheckCode(int count)
{
//背景用白色填充
int width = pictureBox1.Width;
int height = pictureBox1.Height;
Bitmap bitMap = new Bitmap(width, height);
// 创建画板
Graphics g = Graphics.FromImage(bitMap);
// 画板用白色填充
g.FillRectangle(new SolidBrush(Color.White), 0, 0, width, height);
//将随机生成的字符串绘制到图片上
string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
Random r = new Random();
StringBuilder s = new StringBuilder();
Font font = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold, GraphicsUnit.Pixel);
Color[] colors = {
Color.Blue, Color.Green, Color.Red, Color.Orange,
Color.Orchid,Color.Yellow,Color.Chocolate,Color.Brown,
Color.Gold, Color.Black, Color.Gray, Color.DarkBlue
};
for (int i = 0; i < count; i++)
{
// 产生颜色的随机索引
int colorIndex = r.Next(0, colors.Length); // 生成一个0到11的随机数
// 产生是字符的随机索引
int letterIndex = r.Next(0, letters.Length);
string letter = letters[letterIndex].ToString();
s.Append(letter);
g.DrawString(letter, font, new SolidBrush(colors[colorIndex]), i * 28, r.Next(0, 15));
}
checkCode = s.ToString(); //先保存,将来验证与用户输入是否一致
//生成干扰线条,混淆背景
Pen[] pens = {
new Pen(Color.Blue, 2){DashStyle=DashStyle.Solid},
new Pen(Color.Green, 2){DashStyle=DashStyle.Dash},
new Pen(Color.Red, 2){DashStyle=DashStyle.Dot},
new Pen(Color.Orange, 2){DashStyle=DashStyle.DashDot},
new Pen(Color.Orchid, 2){DashStyle=DashStyle.DashDotDot},
new Pen(Color.Yellow, 2){DashStyle=DashStyle.Solid},
new Pen(Color.Chocolate, 2){DashStyle=DashStyle.Dash},
new Pen(Color.Brown, 2){DashStyle=DashStyle.Dot},
new Pen(Color.Gold, 2){DashStyle=DashStyle.DashDot},
new Pen(Color.Black, 2){DashStyle=DashStyle.DashDotDot},
new Pen(Color.Gray, 2){DashStyle=DashStyle.DashDot},
new Pen(Color.DarkBlue, 2){DashStyle=DashStyle.DashDotDot}
};
for (int i = 0; i < 10; i++)
{
int penIndex = r.Next(0,12); // 生成一个0到11的随机数
g.DrawLine(pens[penIndex], new Point(r.Next(0, width), r.Next(0, height)), new Point(r.Next(0, width), r.Next(0, height)));
}
return bitMap;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
pictureBox1.Image = GenCheckCode(5);
}
private void button2_Click(object sender, EventArgs e)
{
if (textBox1.Text == checkCode)
{
MessageBox.Show("输入的验证码正确!");
return;
}
else
{
MessageBox.Show("验证码不正确,请重新输入!");
return;
}
}
}
}
总结
这个程序的主要功能是生成一个包含随机字符和干扰线的验证码图像,并允许用户输入验证码进行验证。它使用了 Graphics
类来绘制图像,并在用户操作(如点击图片或验证按钮)时响应事件。