posts - 495,comments - 227,trackbacks - 0
          ???? Asp.net的設(shè)計(jì)方式和設(shè)計(jì)理念和其他的如Asp,Jsp,Php,Perl

          等都不一樣,幾乎是完全的面向?qū)ο笤O(shè)計(jì)!代碼的復(fù)用就是其

          中差異較大的特點(diǎn)之一,Asp.net除了可以用Include以外,還提供

          了比較有特點(diǎn)的Web控件,包括:Ascx形式和帶設(shè)計(jì)時(shí)支持的控

          件[本文屬于后者],為了熟悉這些新概念,我自己寫了個(gè)Web控件。

          在實(shí)際項(xiàng)目中運(yùn)行使用良好,以后,要有時(shí)間,我還將不斷改進(jìn)。

          ValidateCode控件的使用方法:

          第一步:

          編譯我提供的原代碼, 然后,在Studio.net 2003工具欄上, 選擇"添加/移除項(xiàng)", 選中編譯好的dll文件。

          第二步:

          工具欄上就會(huì)多一個(gè)Web控件ValidateCode,做好一個(gè)Web窗體,在Studio.net 2003開發(fā)界面上,直接把控件拖到WebForm上,就OK!

          第三步:

          在該控件的GraphicOK事件中獲取,驗(yàn)證碼的字符信息,用于和用戶錄入做比較!

          最后一步:

          在網(wǎng)站的根目錄下,建一個(gè)temp目錄(也可以自己指定目錄),用于存放驗(yàn)證碼

          圖片,不用擔(dān)心,代碼會(huì)自動(dòng)刪除無用的圖片!

          原代碼如下:

          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è)計(jì)者:王海波 2004-11-20
          ?/// </summary>
          ?///
          ?public enum GraphicType
          ?{
          ??Jpg = 0,
          ??Gif = 1,
          ??Png = 2,
          ??Bmp = 3,
          ?}


          ?//[ToolboxBitmap(@"D:\DotnetApp\ValidateCode\ValidateCode.bmp") ]?//設(shè)置控件在工具箱上的圖標(biāo)
          ?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;
          ??
          ??//生成校驗(yàn)碼的變量 start
          ??private Bitmap validateImage;
          ??private Graphics g;
          ??//生成校驗(yàn)碼的變量 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;?? //在校驗(yàn)圖片生成結(jié)束以后觸發(fā)

          ??protected virtual void OnGraphicOK(object sender, EventArgs e)
          ??{???
          ???if (GraphicOK != null)
          ???{
          ????//Invokes the delegates.
          ????GraphicOK(sender, e);
          ???}??
          ??}
          ?
          ??#endregion
          ????
          ??#region 控件屬性
          ??
          ??//生成校驗(yàn)碼的長度
          ??[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("需要驗(yàn)證碼的長度,建議在5~8位之間!")]
          ??public int CodeLength
          ??{
          ???get
          ???{
          ????return pCodelen;
          ???}

          ???set
          ???{
          ????pCodelen = value;
          ???}
          ??}

          ??//生成校驗(yàn)碼的長度
          ??[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("生成驗(yàn)證碼圖片的臨時(shí)存放路徑,要求必須是網(wǎng)站下的虛擬目錄!")]
          ??public string TempImageURLPath
          ??{
          ???get
          ???{
          ????return pTempImageURLPath;
          ???}

          ???set
          ???{
          ????pTempImageURLPath = value;
          ???}
          ??}

          ??[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(GraphicType.Jpg),Description("選擇生成校驗(yàn)圖文件的類型(Jpg;Gif;Png;Bmp)!")]
          ??public GraphicType ChartType
          ??{
          ???get
          ???{
          ????return pChartType;
          ???}

          ???set
          ???{
          ????pChartType = value;
          ???}??
          ??}


          ??//生成校驗(yàn)碼圖片的寬度
          ??public int ChartWidth
          ??{
          ???get
          ???{
          ????return pChartWidth;
          ???}

          ???set
          ???{
          ????pChartWidth = value;
          ???}
          ??}

          ??//生成校驗(yàn)碼圖片的高度
          ??public int ChartHeight
          ??{
          ???get
          ???{
          ????return pChartHeight;
          ???}

          ???set
          ???{
          ????pChartHeight = value;
          ???}
          ??}

          ??//需要生成的校驗(yàn)碼
          ??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時(shí)候?qū)傩缘某跏蓟?br />??/// </summary>
          ??/// <param name="e"></param>
          ??protected? override? void OnLoad(System.EventArgs e)
          ??{
          ???? ?EraseOldGraphic();?? //刪除過期的圖片
          ??}

          ??/// <summary>
          ??/// 生成隨機(jī)的
          ??/// </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>
          ??/// 動(dòng)態(tài)從數(shù)字和字母組成的元素中動(dòng)態(tài)選擇生成校驗(yàn)碼
          ??/// </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ù)用戶需要的長度來定義驗(yàn)證碼的位數(shù)
          ???for(int i = 0; i < CodeLength; i++)
          ???{
          ????num += s[r.Next(0, s.Length)].ToString();
          ???}
          ???
          ???return num;
          ??}

          ??/// <summary>
          ??/// 清除時(shí)間超過20秒的臨時(shí)圖片記錄
          ??/// </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 閱讀(553) 評(píng)論(0)  編輯  收藏 所屬分類: .NET
          主站蜘蛛池模板: 安顺市| 桃园市| 老河口市| 会宁县| 克什克腾旗| 桦甸市| 泸西县| 江源县| 漳州市| 湖北省| 清涧县| 新民市| 新建县| 崇左市| 渝北区| 库车县| 东乡族自治县| 祁连县| 巫溪县| 惠来县| 万山特区| 博白县| 长泰县| 新营市| 建水县| 岳西县| 临猗县| 类乌齐县| 镇远县| 舟山市| 台南县| 招远市| 聂拉木县| 太仓市| 大英县| 白城市| 泰安市| 江达县| 东乌珠穆沁旗| 黄石市| 清远市|