C# WinForm 登錄界面的圖片驗(yàn)證碼(區(qū)分大小寫(xiě)+不區(qū)分大小寫(xiě))
一、功能界面

圖1 驗(yàn)證碼(區(qū)分大小寫(xiě))
二、創(chuàng)建一個(gè)產(chǎn)生驗(yàn)證碼的類Class1
(1)生成隨機(jī)驗(yàn)證碼字符串,用的是Random隨機(jī)函數(shù)
(2)創(chuàng)建驗(yàn)證碼圖片,將該字符串畫(huà)在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 驗(yàn)證碼功能 /// <summary> /// 生成隨機(jī)驗(yàn)證碼字符串 /// </summary> public static string CreateRandomCode(int CodeLength) { int rand; char code; string randomCode = String.Empty;//隨機(jī)驗(yàn)證碼 //生成一定長(zhǎng)度的隨機(jī)驗(yàn)證碼 //Random random = new Random();//生成隨機(jī)數(shù)對(duì)象 for (int i = 0; i < CodeLength; i++) { //利用GUID生成6位隨機(jī)數(shù) byte[] buffer = Guid.NewGuid().ToByteArray();//生成字節(jié)數(shù)組 int seed = BitConverter.ToInt32(buffer, 0);//利用BitConvert方法把字節(jié)數(shù)組轉(zhuǎn)換為整數(shù) Random random = new Random(seed);//以生成的整數(shù)作為隨機(jī)種子 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> /// 創(chuàng)建驗(yàn)證碼圖片 /// </summary> public static void CreateImage(string strValidCode, PictureBox pbox) { try { int RandAngle = 45;//隨機(jī)轉(zhuǎn)動(dòng)角度 int MapWidth = (int)(strValidCode.Length * 21); Bitmap map = new Bitmap(MapWidth, 28);//驗(yàn)證碼圖片—長(zhǎng)和寬 //創(chuàng)建繪圖對(duì)象Graphics Graphics graph = Graphics.FromImage(map); graph.Clear(Color.AliceBlue);//清除繪畫(huà)面,填充背景色 graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//畫(huà)一個(gè)邊框 graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式 Random rand = new Random(); //背景噪點(diǎn)生成 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); } //驗(yàn)證碼旋轉(zhuǎn),防止機(jī)器識(shí)別 char[] chars = strValidCode.ToCharArray();//拆散字符串成單字符數(shù)組 //文字居中 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);//字體樣式(參數(shù)2為字體大小) Brush b = new System.Drawing.SolidBrush(c[cindex]); Point dot = new Point(16, 16); float angle = rand.Next(-RandAngle, RandAngle);//轉(zhuǎn)動(dòng)的度數(shù) graph.TranslateTransform(dot.X, dot.Y);//移動(dòng)光標(biāo)到指定位置 graph.RotateTransform(angle); graph.DrawString(chars[i].ToString(), f, b, 1, 1, format); graph.RotateTransform(-angle);//轉(zhuǎn)回去 graph.TranslateTransform(2, -dot.Y);//移動(dòng)光標(biāo)到指定位置 } pbox.Image = map; } catch (ArgumentException) { MessageBox.Show("驗(yàn)證碼圖片創(chuàng)建錯(cuò)誤"); } } #endregion } }
三、調(diào)用
(1)更新驗(yàn)證碼
(2)驗(yàn)證(區(qū)分大小寫(xiě))
(3)驗(yàn)證(不區(qū)分大小寫(xiě))
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 驗(yàn)證碼 private const int ValidCodeLength = 4;//驗(yàn)證碼長(zhǎng)度 private String strValidCode = "";//驗(yàn)證碼 //調(diào)用自定義函數(shù),更新驗(yàn)證碼 private void UpdateValidCode() { strValidCode = Class1.CreateRandomCode(ValidCodeLength);//生成隨機(jī)驗(yàn)證碼 if (strValidCode == "") return; Class1.CreateImage(strValidCode, pbox1);//創(chuàng)建驗(yàn)證碼圖片 } #endregion private void pbox1_Click(object sender, EventArgs e) { UpdateValidCode();//點(diǎn)擊更新驗(yàn)證碼 } private void Form1_Load(object sender, EventArgs e) { UpdateValidCode();//加載更新驗(yàn)證碼 } /// <summary> /// 驗(yàn)證(區(qū)分大小寫(xiě)) /// </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;//字母?jìng)€(gè)數(shù) int Count2 = 0;//數(shù)字個(gè)數(shù) if (String.IsNullOrEmpty(validcode) != true)//驗(yàn)證碼不為空 { 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//數(shù)字 { if (ch1[i] == ch2[i]) { Count2++; } } } int CountSum = Count1 + Count2; if (CountSum == strValidCode.Length) { MessageBox.Show("驗(yàn)證通過(guò)", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateValidCode(); txtValidCode.Text = ""; txtValidCode.Focus(); } else { MessageBox.Show("驗(yàn)證失敗", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); UpdateValidCode();//更新驗(yàn)證碼 txtValidCode.Text = ""; txtValidCode.Focus(); } } else//驗(yàn)證碼為空 { MessageBox.Show("請(qǐng)輸入驗(yàn)證碼", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateValidCode();//更新驗(yàn)證碼 txtValidCode.Text = ""; txtValidCode.Focus(); } } /// <summary> /// 驗(yàn)證(不區(qū)分大小寫(xiě)) /// </summary> private void btn2_Click(object sender, EventArgs e) { string validcode = txtValidCode.Text.Trim(); if (String.IsNullOrEmpty(validcode) != true)//驗(yàn)證碼不為空 { if (validcode.ToLower() == strValidCode.ToLower()) { MessageBox.Show("驗(yàn)證通過(guò)", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateValidCode(); txtValidCode.Text = ""; txtValidCode.Focus(); } else { MessageBox.Show("驗(yàn)證失敗", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); UpdateValidCode();//更新驗(yàn)證碼 txtValidCode.Text = ""; txtValidCode.Focus(); } } else//驗(yàn)證碼為空 { MessageBox.Show("請(qǐng)輸入驗(yàn)證碼", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); UpdateValidCode();//更新驗(yàn)證碼 txtValidCode.Text = ""; txtValidCode.Focus(); } } } }
.exe測(cè)試文件下載: ValidCode_jb51.zip
參考文章:
https://www.jianshu.com/p/d89f22cf51bf
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity3D實(shí)現(xiàn)人物轉(zhuǎn)向與移動(dòng)
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)人物轉(zhuǎn)向與移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01C#使用AutoUpdater.NET實(shí)現(xiàn)程序自動(dòng)更新
開(kāi)發(fā)桌面應(yīng)用程序的時(shí)候,經(jīng)常會(huì)因?yàn)樾略龉δ苄枨蠡蛐迯?fù)已知問(wèn)題,要求客戶更新應(yīng)用程序,在.Net體系中采用?AutoUpdater.NET?組件可以非常便捷的實(shí)現(xiàn)這一功能,需要的朋友可以參考下2024-02-02C#畫(huà)筆使用復(fù)合數(shù)組繪制單個(gè)矩形的方法
這篇文章主要介紹了C#畫(huà)筆使用復(fù)合數(shù)組繪制單個(gè)矩形的方法,涉及C#使用畫(huà)筆繪制圖形的相關(guān)技巧,需要的朋友可以參考下2015-06-06關(guān)于C#基礎(chǔ)知識(shí)回顧--反射(一)
其實(shí)說(shuō)白了,反射就是能知道我們未知類型的類型信息這么一個(gè)東西.沒(méi)什么神秘可講!反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在運(yùn)行時(shí)得到類型信息2013-07-07Netcore?Webapi返回?cái)?shù)據(jù)的三種方式示例
這篇文章主要為大家介紹了Netcore?Webapi返回?cái)?shù)據(jù)的三種方式示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09淺談C#中HttpWebRequest與HttpWebResponse的使用方法
本篇文章主要介紹了淺談C#中HttpWebRequest與HttpWebResponse的使用方法,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01