的设计方式和设计理念和其他的如AspJspPhpPerl等都不一样几乎是完全的面向对象设计!代码的复用就是其中差异较大的特点之一除了可以用Include以外还提供了比较有特点的Web控件包括Ascx形式和带设计时支持的控件[本文属于后者]为了熟悉这些新概念我自己写了个Web控件
在实际项目中运行使用良好以后要有时间我还将不断改进
ValidateCode控件的使用方法:
第一步
编译我提供的原代码 然后在 工具栏上 选择添加/移除项 选中编译好的dll文件
第二步
工具栏上就会多一个Web控件ValidateCode做好一个Web窗体在 开发界面上直接把控件拖到WebForm上就OK!
第三步
在该控件的GraphicOK事件中获取验证码的字符信息用于和用户录入做比较!
最后一步
在网站的根目录下建一个temp目录(也可以自己指定目录)用于存放验证码
图片不用担心代码会自动删除无用的图片!
原代码如下
using System;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemComponentModel;
using SystemIO;
using SystemDrawing;
using SystemDrawingDrawingD;
using SystemDrawingImaging;
namespace WebValidateCode
{
/// <summary>
/// ValidateCode 的摘要说明
/// 设计者:王海波
/// </summary>
///
public enum GraphicType
{
Jpg =
Gif =
Png =
Bmp =
}
//[ToolboxBitmap(@D:\DotnetApp\ValidateCode\ValidateCodebmp) ] //设置控件在工具箱上的图标
public class ValidateCode : SystemWebUIWebControlsWebControl INamingContainer
{
private int pCodelen=;
private int pChartWidth=;
private int pChartHeight=;
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 SystemWebUIWebControlsImage img= new SystemWebUIWebControlsImage();
#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(需要验证码的长度建议在~位之间!)]
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(GraphicTypeJpg)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)
{
SystemWebUIWebControlsImage objImage;
//TextBox objTxt;
//绘制包含的控件
objImage= (SystemWebUIWebControlsImage) Controls[];
//objTxt= (TextBox) Controls[];
if(pAuthenCode==null)
pAuthenCode=GetValidateCode();
OnGraphicOK(thisEventArgsEmpty );
GetRandomImage(pAuthenCode);
objImageImageUrl=pAuthenImageFullURL;
objImageRenderControl(output);
}
/// <summary>
/// 给控件添加子控件
/// </summary>
protectedoverridevoidCreateChildControls()
{
//ControlsAdd(btn);
ControlsAdd(img);
//ControlsAdd(txt);
}
/// <summary>
/// 控件Load时候属性的初始化
/// </summary>
/// <param name=e></param>
protectedoverridevoid OnLoad(SystemEventArgs e)
{
EraseOldGraphic(); //删除过期的图片
}
/// <summary>
/// 生成随机的
/// </summary>
private void MakeRandomFileName()
{
string strRandName=DateTimeNowTicksToString()+jpg;
pAuthenImageFullname=thisPageMapPath(TempImageURLPath)+@\+strRandName;
pAuthenImageFullURL=TempImageURLPath+/+strRandName;
}
private void GetRandomImage(string strValidateCode)
{
//生成随即图片的全名和全URL
MakeRandomFileName();
validateImage = new Bitmap(pChartWidth pChartHeight PixelFormatFormatbppRgb); // FormatbppRgb);
g = GraphicsFromImage(validateImage);
gClear(ColorLightGray) ;
//gDrawString(strValidateCode new Font(宋体FontStyleBold)new SolidBrush(ColorDarkRed)new PointF());
for(int i=;i<strValidateCodeLength;i++)
{
Random r = new Random();
PointF startPos=new PointF(rNext()+(rNext()*i )rNext() );
gDrawString(strValidateCodeSubstring(i) new Font(宋体FontStyleItalic)new SolidBrush(ColorBlue)startPos);
}
//gFillRectangle(new LinearGradientBrush(new Point() new Point() ColorFromArgb()ColorFromArgb()));
switch(pChartType)
{
case GraphicTypeJpg:
validateImageSave(pAuthenImageFullname ImageFormatJpeg);
break;
case GraphicTypeGif:
validateImageSave(pAuthenImageFullname ImageFormatGif);
break;
case GraphicTypePng:
validateImageSave(pAuthenImageFullname ImageFormatPng);
break;
case GraphicTypeBmp:
validateImageSave(pAuthenImageFullname ImageFormatBmp);
break;
default:
validateImageSave(pAuthenImageFullname ImageFormatJpeg);
break;
}
validateImageDispose();
gDispose();
}
/// <summary>
/// 动态从数字和字母组成的元素中动态选择生成校验码
/// </summary>
private string GetValidateCode()