????
Asp.net的設(shè)計方式和設(shè)計理念和其他的如Asp,Jsp,Php,Perl
等都不一樣,幾乎是完全的面向?qū)ο笤O(shè)計!代碼的復用就是其
中差異較大的特點之一,Asp.net除了可以用Include以外,還提供
了比較有特點的Web控件,包括:Ascx形式和帶設(shè)計時支持的控
件[本文屬于后者],為了熟悉這些新概念,我自己寫了個Web控件。
在實際項目中運行使用良好,以后,要有時間,我還將不斷改進。
ValidateCode控件的使用方法:
第一步:
編譯我提供的原代碼, 然后,在Studio.net 2003工具欄上, 選擇"添加/移除項", 選中編譯好的dll文件。
第二步:
工具欄上就會多一個Web控件ValidateCode,做好一個Web窗體,在Studio.net 2003開發(fā)界面上,直接把控件拖到WebForm上,就OK!
第三步:
在該控件的GraphicOK事件中獲取,驗證碼的字符信息,用于和用戶錄入做比較!
最后一步:
在網(wǎng)站的根目錄下,建一個temp目錄(也可以自己指定目錄),用于存放驗證碼
圖片,不用擔心,代碼會自動刪除無用的圖片!
原代碼如下:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace WebValidateCode
{
?/// <summary>
?/// ValidateCode 的摘要說明。
?/// 設(shè)計者:王海波 2004-11-20
?/// </summary>
?///
?public enum GraphicType
?{
??Jpg = 0,
??Gif = 1,
??Png = 2,
??Bmp = 3,
?}
?//[ToolboxBitmap(@"D:\DotnetApp\ValidateCode\ValidateCode.bmp") ]?//設(shè)置控件在工具箱上的圖標
?public class ValidateCode : System.Web.UI.WebControls.WebControl ,INamingContainer
?{
??private int pCodelen=5;
??private int pChartWidth=100;
??private int pChartHeight=20;
??private GraphicType pChartType;
??
??private string pAuthenCode;
??private string pTempImageURLPath="/temp";
??private string pAuthenImageFullname;
??private string pAuthenImageFullURL;
??
??//生成校驗碼的變量 start
??private Bitmap validateImage;
??private Graphics g;
??//生成校驗碼的變量 End
??private TextBox txt=new TextBox();
??private System.Web.UI.WebControls.Image img= new System.Web.UI.WebControls.Image();
??#region 定義控件事件
??
??public delegate void GraphicCreated(object sender, EventArgs e);
??public event EventHandler GraphicOK;?? //在校驗圖片生成結(jié)束以后觸發(fā)
??protected virtual void OnGraphicOK(object sender, EventArgs e)
??{???
???if (GraphicOK != null)
???{
????//Invokes the delegates.
????GraphicOK(sender, e);
???}??
??}
?
??#endregion
????
??#region 控件屬性
??
??//生成校驗碼的長度
??[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("需要驗證碼的長度,建議在5~8位之間!")]
??public int CodeLength
??{
???get
???{
????return pCodelen;
???}
???set
???{
????pCodelen = value;
???}
??}
??//生成校驗碼的長度
??[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("生成驗證碼圖片的臨時存放路徑,要求必須是網(wǎng)站下的虛擬目錄!")]
??public string TempImageURLPath
??{
???get
???{
????return pTempImageURLPath;
???}
???set
???{
????pTempImageURLPath = value;
???}
??}
??[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(GraphicType.Jpg),Description("選擇生成校驗圖文件的類型(Jpg;Gif;Png;Bmp)!")]
??public GraphicType ChartType
??{
???get
???{
????return pChartType;
???}
???set
???{
????pChartType = value;
???}??
??}
??//生成校驗碼圖片的寬度
??public int ChartWidth
??{
???get
???{
????return pChartWidth;
???}
???set
???{
????pChartWidth = value;
???}
??}
??//生成校驗碼圖片的高度
??public int ChartHeight
??{
???get
???{
????return pChartHeight;
???}
???set
???{
????pChartHeight = value;
???}
??}
??//需要生成的校驗碼
??public string AuthenCode
??{
???get
???{
????return pAuthenCode;
???}
???set
???{
????pAuthenCode = value;
???}
??}
??#endregion
??/// <summary>
??/// 將此控件呈現(xiàn)給指定的輸出參數(shù)。
??/// </summary>
??/// <param name="output"> 要寫出到的 HTML 編寫器 </param>
??protected override void Render(HtmlTextWriter output)
??{
????????
???System.Web.UI.WebControls.Image objImage;
???????? //TextBox objTxt;
????
????
???//繪制包含的控件???
???objImage? = (System.Web.UI.WebControls.Image) Controls[0];?
???//objTxt? = (TextBox) Controls[1];?????
???
???if(pAuthenCode==null)
????? pAuthenCode=GetValidateCode();
?????????????
???OnGraphicOK(this,EventArgs.Empty );
???
???GetRandomImage(pAuthenCode);
???objImage.ImageUrl=pAuthenImageFullURL;
???objImage.RenderControl(output);?
????????????????
??}
??/// <summary>
??/// 給控件添加子控件
??/// </summary>
??protected? override? void? CreateChildControls(??? )
??{
???
???//Controls.Add(btn);
???Controls.Add(img);
???//Controls.Add(txt);
??}
??/// <summary>
??/// 控件Load時候?qū)傩缘某跏蓟?br />??/// </summary>
??/// <param name="e"></param>
??protected? override? void OnLoad(System.EventArgs e)
??{
???? ?EraseOldGraphic();?? //刪除過期的圖片
??}
??/// <summary>
??/// 生成隨機的
??/// </summary>
??private void MakeRandomFileName()
??{
???string strRandName=DateTime.Now.Ticks.ToString()+".jpg";??
???pAuthenImageFullname=this.Page.MapPath(TempImageURLPath)+@"\"+strRandName;
???pAuthenImageFullURL=TempImageURLPath+"/"+strRandName;
??}
??private void GetRandomImage(string strValidateCode)
??{???
???//生成隨即圖片的全名,和全URL
???MakeRandomFileName();
???validateImage = new Bitmap(pChartWidth, pChartHeight, PixelFormat.Format24bppRgb); // .Format24bppRgb);
???g = Graphics.FromImage(validateImage);
?
???g.Clear(Color.LightGray) ;
???//g.DrawString(strValidateCode , new Font("宋體",16,FontStyle.Bold),new SolidBrush(Color.DarkRed),new PointF(2,2));
???for(int i=0;i<strValidateCode.Length;i++)
???{?????
????Random r = new Random();
????PointF startPos=new PointF(r.Next(3,6)+(r.Next(12,14)*i ),r.Next(-1,2) );
???????
????g.DrawString(strValidateCode.Substring(i,1) , new Font("宋體",14,FontStyle.Italic),new SolidBrush(Color.Blue),startPos);
???}
???
???//g.FillRectangle(new LinearGradientBrush(new Point(0,0), new Point(120,30), Color.FromArgb(0,0,0,0),Color.FromArgb(255,255,255,255)),0,0,120,30);
???switch(pChartType)
???{
????case GraphicType.Jpg:
????
?????validateImage.Save(pAuthenImageFullname, ImageFormat.Jpeg);
?????break;
?
????case GraphicType.Gif:
?????validateImage.Save(pAuthenImageFullname, ImageFormat.Gif);
?????break;
????case GraphicType.Png:
?????validateImage.Save(pAuthenImageFullname, ImageFormat.Png);
?????break;
?
????case GraphicType.Bmp:
?????validateImage.Save(pAuthenImageFullname, ImageFormat.Bmp);
?????break;
?
????default:
?????validateImage.Save(pAuthenImageFullname, ImageFormat.Jpeg);
?????break;
???
???}
???????
???validateImage.Dispose();
???g.Dispose();
???
???
??
??}
??/// <summary>
??/// 動態(tài)從數(shù)字和字母組成的元素中動態(tài)選擇生成校驗碼
??/// </summary>
??private string GetValidateCode()
??{
???char[] s = new char[]{'0','1', '2','3','4','5','6','7','8','9','a'
????????? ,'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q'
????????? ,'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G'
????????? ,'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W'
????????? ,'X','Y','Z'};
???string num = "";
???Random r = new Random();
???//根據(jù)用戶需要的長度來定義驗證碼的位數(shù)
???for(int i = 0; i < CodeLength; i++)
???{
????num += s[r.Next(0, s.Length)].ToString();
???}
???
???return num;
??}
??/// <summary>
??/// 清除時間超過20秒的臨時圖片記錄
??/// </summary>
??/// <returns>成功返回true,失敗返回false</returns>
??public bool EraseOldGraphic()
??{
???try
???{
????DirectoryInfo Dinfo=new DirectoryInfo(this.Page.MapPath(pTempImageURLPath));
????FileInfo[] FileSet;
?
????if(Dinfo.Exists)
????{????
?????switch(pChartType)
?????{
??????case GraphicType.Jpg:
????
???????FileSet=Dinfo.GetFiles("*.jpg");
???????break;
?
??????case GraphicType.Gif:
???????FileSet=Dinfo.GetFiles("*.gif");
???????break;
??????case GraphicType.Png:
???????FileSet=Dinfo.GetFiles("*.png");
???????break;
?
??????case GraphicType.Bmp:
???????FileSet=Dinfo.GetFiles("*.bmp");
???????break;
?
??????default:
???????FileSet=Dinfo.GetFiles("*.jpg");
???????break;
???
?????}
?????foreach(FileInfo fileInfo in FileSet)
?????{
??????if(fileInfo.Exists)
??????{
???????DateTime dts=DateTime.Now;
???????DateTime dtc=fileInfo.CreationTime;
???????TimeSpan ts=dts-dtc;
?
???????if(ts.Seconds>20)
???????{????????
????????fileInfo.Delete();
???????}
??????}
?????}
????}
????return true;
???}
???catch(IOException ioe)
???{
?????? return false;
???}
??}
??
?}
}
posted on 2007-02-01 10:43
SIMONE 閱讀(547)
評論(0) 編輯 收藏 所屬分類:
.NET