c# Winform 實現(xiàn)登錄界面驗證碼功能(文末附源碼)

閑來無事挠锥,最近自己發(fā)現(xiàn)自己的驗證碼功能還沒有寫過十兢。于是就寫下了這篇文章。

界面就比較丑了耘擂,一個picturebox胆剧,一個textbox,一個button按鈕主要想的是先把功能實現(xiàn)了醉冤,萬一以后業(yè)務(wù)上需要使用呢秩霍。

界面

實現(xiàn)以后的功能圖


驗證碼

在文本框中輸入對應(yīng)文字,點擊確定來驗證冤灾,正確時候如圖所示

驗證通過

如果驗證失敗前域,沒有提示,直接更新驗證碼韵吨,當(dāng)然需要使用的時候根據(jù)業(yè)務(wù)邏輯來就是了匿垄,這個就比較簡單了。

第一:生成驗證碼字符串归粉,用到的是Random隨機(jī)函數(shù)

隨機(jī)字符

第二:將該字符串畫在picturebox中

接下
生成驗證碼圖片

第三點擊圖片椿疗,刷新驗證碼


圖片點擊事件

第四驗證驗證碼不區(qū)分大小寫


驗證

或者區(qū)分大小寫

驗證

此時完成

源碼:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace suijima

{

? ? public partial class Form1 : Form

? ? {

? ? ? ? public Form1()

? ? ? ? {

? ? ? ? ? ? InitializeComponent();

? ? ? ? }

? ? ? ? //驗證碼的長度

? ? ? ? private const int iVerifyCodeLength = 6;

? ? ? ? //驗證碼

? ? ? ? private String strVerifyCode = "";

? ? ? ? //匹配字符的臨時變量

? ? ? ? string strTemp = "";

? ? ? ? private void btnUpdate_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? UpdateVerifyCode();

? ? ? ? }

? ? ? ? private void Form1_Load(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? UpdateVerifyCode();

? ? ? ? }

? ? ? ? //更新驗證碼

? ? ? ? private void UpdateVerifyCode()

? ? ? ? {

? ? ? ? ? ? strVerifyCode = CreateRandomCode(iVerifyCodeLength);

? ? ? ? ? ? if(strVerifyCode=="")

? ? ? ? ? ? {

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? ? ? strTemp = strVerifyCode;

? ? ? ? ? ? CreateImage(strVerifyCode);

? ? ? ? }

? ? ? ? //生成驗證碼字符串

? ? ? ? private string CreateRandomCode(int iLength)

? ? ? ? {

? ? ? ? ? ? int rand;

? ? ? ? ? ? char code;

? ? ? ? ? ? string randomCode = String.Empty;

? ? ? ? ? ? //生成一定長度的驗證碼

? ? ? ? ? ? System.Random random = new Random();

? ? ? ? ? ? for (int i = 0; i < iLength; i++)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? rand = random.Next();

? ? ? ? ? ? ? ? if (rand % 3 == 0)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? code = (char)('A' + (char)(rand % 26));

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? code = (char)('0' + (char)(rand % 10));

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? randomCode += code.ToString();

? ? ? ? ? ? }

? ? ? ? ? ? return randomCode;

? ? ? ? }

? ? ? ? ///? 創(chuàng)建驗證碼圖片

? ? ? ? private void CreateImage(string strVerifyCode)

? ? ? ? {

? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? int iRandAngle = 45;? ? //隨機(jī)轉(zhuǎn)動角度

? ? ? ? ? ? ? ? int iMapWidth = (int)(strVerifyCode.Length * 21);

? ? ? ? ? ? ? ? Bitmap map = new Bitmap(iMapWidth, 28);? ? //創(chuàng)建圖片背景

? ? ? ? ? ? ? ? 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);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //驗證碼旋轉(zhuǎn)糠悼,防止機(jī)器識別

? ? ? ? ? ? ? ? char[] chars = strVerifyCode.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(-iRandAngle, iRandAngle);//轉(zhuǎn)動的度數(shù)

? ? ? ? ? ? ? ? ? ? graph.TranslateTransform(dot.X, dot.Y);//移動光標(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);//移動光標(biāo)到指定位置

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? pictureBox1.Image = map;

? ? ? ? ? ? }

? ? ? ? ? ? catch (ArgumentException)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? MessageBox.Show("創(chuàng)建圖片錯誤届榄。");

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? private void button1_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? //驗證大小寫


? ? ? ? ? ? ? ? char[] ch1 = textBox1.Text.ToCharArray();

? ? ? ? ? ? ? ? char[] ch2 = strTemp.ToCharArray();

? ? ? ? ? ? ? ? int nCount = 0;

? ? ? ? ? ? ? ? for (int i = 0; i < strTemp.Length;i++ )

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? if((ch1[i]>='a'&&ch1[i]<='z')||(ch1[i]>='A'&&ch1[i]<='Z'))

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? if (ch1[i] - 32 == ch2[i] || ch1[i] + 32 == ch2[i])

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? nCount++;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? if (ch1[i]==ch2[i])

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? nCount++;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if (nCount==strTemp.Length)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? MessageBox.Show("驗證通過");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? UpdateVerifyCode();

? ? ? ? ? ? ? ? ? ? textBox1.Text = "";

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ////不能驗證大小寫

? ? ? ? ? ? //if(textBox1.Text==strTemp)

? ? ? ? ? ? //{

? ? ? ? ? ? //? ? MessageBox.Show("驗證通過");

? ? ? ? ? ? //}

? ? ? ? ? ? //else

? ? ? ? ? ? //{

? ? ? ? ? ? //? ? UpdateVerifyCode();

? ? ? ? ? ? //? ? textBox1.Text = "";

? ? ? ? ? ? //}

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// 圖片點擊事件

? ? ? ? /// </summary>

? ? ? ? /// <param name="sender"></param>

? ? ? ? /// <param name="e"></param>

? ? ? ? private void pictureBox1_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? UpdateVerifyCode();

? ? ? ? }

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倔喂,隨后出現(xiàn)的幾起案子铝条,更是在濱河造成了極大的恐慌,老刑警劉巖席噩,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件班缰,死亡現(xiàn)場離奇詭異,居然都是意外死亡悼枢,警方通過查閱死者的電腦和手機(jī)埠忘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莹妒,你說我怎么就攤上這事名船。” “怎么了旨怠?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵渠驼,是天一觀的道長。 經(jīng)常有香客問我运吓,道長渴邦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任拘哨,我火速辦了婚禮谋梭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倦青。我一直安慰自己瓮床,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布产镐。 她就那樣靜靜地躺著隘庄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪癣亚。 梳的紋絲不亂的頭發(fā)上丑掺,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音述雾,去河邊找鬼街州。 笑死,一個胖子當(dāng)著我的面吹牛玻孟,可吹牛的內(nèi)容都是我干的唆缴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼黍翎,長吁一口氣:“原來是場噩夢啊……” “哼面徽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匣掸,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤趟紊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碰酝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霎匈,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年砰粹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡碱璃,死狀恐怖弄痹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嵌器,我是刑警寧澤肛真,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站爽航,受9級特大地震影響蚓让,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讥珍,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一历极、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衷佃,春花似錦趟卸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惯悠,卻和暖如春邻邮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背克婶。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工筒严, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸠补。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓萝风,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紫岩。 傳聞我的和親對象是個殘疾皇子规惰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • using System;using System.Collections.Generic;using Syste...
    落地成佛閱讀 255評論 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,698評論 0 3
  • 疏影燈藏倩影稀,留戀梧桐裹殘月泉蝌。逝去西湖纏粘夜歇万,季暖荷花情缺閱。長恨歌起琵琶語勋陪,思君念君妾烏啼贪磺。斷得河山又如何?霸...
    蟠桃大仙閱讀 205評論 0 0
  • 我在楓樹下 不小心睡著了 睜開眼 滿天綠色的星星 圍著我的窘態(tài) 擠眉弄眼 沙沙壞笑
    許彧彧閱讀 226評論 1 4
  • 【新網(wǎng)師過關(guān)作業(yè):《王子微課2.0:極簡教育技術(shù)》課程】 9.20:第二次直播后作業(yè) 提交人:184...
    潔言潔語閱讀 496評論 0 1