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

          等都不一樣,幾乎是完全的面向對象設計!代碼的復用就是其

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

          了比較有特點的Web控件,包括:Ascx形式和帶設計時支持的控

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

          在實際項目中運行使用良好,以后,要有時間,我還將不斷改進。

          ValidateCode控件的使用方法:

          第一步:

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

          第二步:

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

          第三步:

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

          最后一步:

          在網站的根目錄下,建一個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 的摘要說明。
          ?/// 設計者:王海波 2004-11-20
          ?/// </summary>
          ?///
          ?public enum GraphicType
          ?{
          ??Jpg = 0,
          ??Gif = 1,
          ??Png = 2,
          ??Bmp = 3,
          ?}


          ?//[ToolboxBitmap(@"D:\DotnetApp\ValidateCode\ValidateCode.bmp") ]?//設置控件在工具箱上的圖標
          ?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;?? //在校驗圖片生成結束以后觸發

          ??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("生成驗證碼圖片的臨時存放路徑,要求必須是網站下的虛擬目錄!")]
          ??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>
          ??/// 將此控件呈現給指定的輸出參數。
          ??/// </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時候屬性的初始化
          ??/// </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>
          ??/// 動態從數字和字母組成的元素中動態選擇生成校驗碼
          ??/// </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();

          ???//根據用戶需要的長度來定義驗證碼的位數
          ???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 閱讀(554) 評論(0)  編輯  收藏 所屬分類: .NET
          主站蜘蛛池模板: 静宁县| 营山县| 增城市| 禹城市| 滨海县| 怀宁县| 淅川县| 武城县| 玉林市| 锡林浩特市| 怀来县| 册亨县| 乌鲁木齐市| 东明县| 旅游| 铅山县| 白河县| 行唐县| 曲水县| 岚皋县| 宁夏| 双牌县| 施甸县| 贵州省| 平乐县| 东宁县| 常州市| 综艺| 云林县| 乌什县| 西安市| 崇仁县| 刚察县| 建始县| 崇明县| 边坝县| 赤城县| 连江县| 英超| 普兰店市| 宁明县|