C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)
更新时间:2020年6月25日 10:35 点击:1426
一、功能界面
图1 验证码(区分大小写)
二、创建一个产生验证码的类Class1
(1)生成随机验证码字符串,用的是Random随机函数
(2)创建验证码图片,将该字符串画在PictureBox控件中
Class1.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing;//图片 using System.Windows.Forms; namespace ValidCodeTest { public class Class1 { #region 验证码功能 /// <summary> /// 生成随机验证码字符串 /// </summary> public static string CreateRandomCode(int CodeLength) { int rand; char code; string randomCode = String.Empty;//随机验证码 //生成一定长度的随机验证码 //Random random = new Random();//生成随机数对象 for (int i = 0; i < CodeLength; i++) { //利用GUID生成6位随机数 byte[] buffer = Guid.NewGuid().ToByteArray();//生成字节数组 int seed = BitConverter.ToInt32(buffer, 0);//利用BitConvert方法把字节数组转换为整数 Random random = new Random(seed);//以生成的整数作为随机种子 rand = random.Next(); //rand = random.Next(); if (rand % 3 == 1) { code = (char)('A' + (char)(rand % 26)); } else if (rand % 3 == 2) { code = (char)('a' + (char)(rand % 26)); } else { code = (char)('0' + (char)(rand % 10)); } randomCode += code.ToString(); } return randomCode; } /// <summary> /// 创建验证码图片 /// </summary> public static void CreateImage(string strValidCode, PictureBox pbox) { try { int RandAngle = 45;//随机转动角度 int MapWidth = (int)(strValidCode.Length * 21); Bitmap map = new Bitmap(MapWidth, 28);//验证码图片—长和宽 //创建绘图对象Graphics Graphics graph = Graphics.FromImage(map); graph.Clear(Color.AliceBlue);//清除绘画面,填充背景色 graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框 graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式 Random rand = new Random(); //背景噪点生成 Pen blackPen = new Pen(Color.LightGray, 0); for (int i = 0; i < 50; i++) { int x = rand.Next(0, map.Width); int y = rand.Next(0, map.Height); graph.DrawRectangle(blackPen, x, y, 1, 1); } //验证码旋转,防止机器识别 char[] chars = strValidCode.ToCharArray();//拆散字符串成单字符数组 //文字居中 StringFormat format = new StringFormat(StringFormatFlags.NoClip); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; //定义颜色 Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //定义字体 string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" }; for (int i = 0; i < chars.Length; i++) { int cindex = rand.Next(7); int findex = rand.Next(5); Font f = new System.Drawing.Font(font[findex], 13, System.Drawing.FontStyle.Bold);//字体样式(参数2为字体大小) Brush b = new System.Drawing.SolidBrush(c[cindex]); Point dot = new Point(16, 16); float angle = rand.Next(-RandAngle, RandAngle);//转动的度数 graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置 graph.RotateTransform(angle); graph.DrawString(chars[i].ToString(), f, b, 1, 1, format); graph.RotateTransform(-angle);//转回去 graph.TranslateTransform(2, -dot.Y);//移动光标到指定位置 } pbox.Image = map; } catch (ArgumentException) { MessageBox.Show("验证码图片创建错误"); } } #endregion } }
三、调用
(1)更新验证码
(2)验证(区分大小写)
(3)验证(不区分大小写)
Form1.cs:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ValidCodeTest; namespace ValidCode { public partial class Form1 : Form { public Form1() { InitializeComponent(); } #region 验证码 private const int ValidCodeLength = 4;//验证码长度 private String strValidCode = "";//验证码 //调用自定义函数,更新验证码 private void UpdateValidCode() { strValidCode = Class1.CreateRandomCode(ValidCodeLength);//生成随机验证码 if (strValidCode == "") return; Class1.CreateImage(strValidCode, pbox1);//创建验证码图片 } #endregion private void pbox1_Click(object sender, EventArgs e) { UpdateValidCode();//点击更新验证码 } private void Form1_Load(object sender, EventArgs e) { UpdateValidCode();//加载更新验证码 } /// <summary> /// 验证(区分大小写) /// </summary> private void btn1_Click(object sender, EventArgs e) { string validcode = txtValidCode.Text.Trim(); char[] ch1 = validcode.ToCharArray(); char[] ch2 = strValidCode.ToCharArray(); int Count1 = 0;//字母个数 int Count2 = 0;//数字个数 if (String.IsNullOrEmpty(validcode) != true)//验证码不为空 { for (int i = 0; i < strValidCode.Length; i++) { if ((ch1[i] >= 'a' && ch1[i] <= 'z') || (ch1[i] >= 'A' && ch1[i] <= 'Z'))//字母 { if (ch1[i] == ch2[i]) { Count1++; } } else//数字 { if (ch1[i] == ch2[i]) { Count2++; } } } int CountSum = Count1 + Count2; if (CountSum == strValidCode.Length) { MessageBox.Show("验证通过", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateValidCode(); txtValidCode.Text = ""; txtValidCode.Focus(); } else { MessageBox.Show("验证失败", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); UpdateValidCode();//更新验证码 txtValidCode.Text = ""; txtValidCode.Focus(); } } else//验证码为空 { MessageBox.Show("请输入验证码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateValidCode();//更新验证码 txtValidCode.Text = ""; txtValidCode.Focus(); } } /// <summary> /// 验证(不区分大小写) /// </summary> private void btn2_Click(object sender, EventArgs e) { string validcode = txtValidCode.Text.Trim(); if (String.IsNullOrEmpty(validcode) != true)//验证码不为空 { if (validcode.ToLower() == strValidCode.ToLower()) { MessageBox.Show("验证通过", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateValidCode(); txtValidCode.Text = ""; txtValidCode.Focus(); } else { MessageBox.Show("验证失败", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); UpdateValidCode();//更新验证码 txtValidCode.Text = ""; txtValidCode.Focus(); } } else//验证码为空 { MessageBox.Show("请输入验证码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateValidCode();//更新验证码 txtValidCode.Text = ""; txtValidCode.Focus(); } } } }
.exe测试文件下载: ValidCode_jb51.zip
参考文章:
https://www.jianshu.com/p/d89f22cf51bf
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
上一篇: C#使用Socket实现心跳的方法示例
下一篇: C#实现飞行棋项目
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25