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)[email protected]"/"+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;
 }
 }
 
 }
}