码迷,mamicode.com
首页 > Windows程序 > 详细

在c#的winform登录窗体中,如何实现窗口验证码

时间:2014-09-29 20:40:12      阅读:1102      评论:0      收藏:0      [点我收藏+]

标签:c#

  

c#的winform可开发qq聊天程序,聊天登录窗体验证码是如何实现的呢?
在winform中,需要增加自己的控件
一个picturebox控件pbverifycode
一个按钮butupdateverifycode
代码如下:
  public partial class FrmLogin : Form
    {
        //随机码的长度
        private const int iVerifyCodeLength = 6;
        //随机码
        private String strVerifyCode = "";
        public FrmLogin()
        {
            InitializeComponent();
            UpdateVerifyCode();
        }
        //更新验证码
         private void UpdateVerifyCode()
        {
            strVerifyCode = CreateRandomCode(iVerifyCodeLength);
            CreateImage(strVerifyCode);
        }        private string CreateRandomCode(int iLength)
        {
            int rand;
            char code;
            string randomCode = String.Empty;
            //生成一定长度的验证码
            System.Random random = new Random();
            for (int i = 0; i < iLength; i++)
            {
                rand = random.Next();
           if (rand % 3 == 0)
                {
                    code = (char)(‘A‘ + (char)(rand % 26));
                }
                else
                {
                    code = (char)(‘0‘ + (char)(rand % 10));
                }                randomCode += code.ToString();
            }
            return randomCode;
        }
        ///  创建随机码图片
        private void CreateImage(string strVerifyCode) 
         {
            try
            {
                int iRandAngle = 45;    //随机转动角度
                int iMapWidth = (int)(strVerifyCode.Length * 21);
                Bitmap map = new Bitmap(iMapWidth, 28);     //创建图片背景
                
                Graphics graph = Graphics.FromImage(map);
                graph.Clear(Color.AliceBlue);//清除画面,填充背景
                graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框
                graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式
                Random rand = new Random();
                //背景噪点生成
                Pen blackPen = new Pen(Color.LightGray, 0);
                for (int i = 0; i < 50; i++) 
       {
                    int x = rand.Next(0, map.Width);
                    int y = rand.Next(0, map.Height);
                    graph.DrawRectangle(blackPen, x, y, 1, 1);
                }
                //验证码旋转,防止机器识别
                char[] chars = strVerifyCode.ToCharArray();//拆散字符串成单字符数组
                //文字距中
                StringFormat format = new StringFormat(StringFormatFlags.NoClip);
                format.Alignment = StringAlignment.Center;
                format.LineAlignment = StringAlignment.Center;
                //定义颜色
               
 Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, 
Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
                //定义字体
                string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };  
           for (int i = 0; i < chars.Length; i++)
                {
                    int cindex = rand.Next(7);
                    int findex = rand.Next(5);                    Font f = new System.Drawing.Font(font[findex], 13, System.Drawing.FontStyle.Bold);//字体样式(参数2为字体大小)
                    Brush b = new System.Drawing.SolidBrush(c[cindex]);
                    Point dot = new Point(16, 16);
                    
                    float angle = rand.Next(-iRandAngle, iRandAngle);//转动的度数
                    graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
                    graph.RotateTransform(angle);
                    graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
                    
                    graph.RotateTransform(-angle);//转回去
                    graph.TranslateTransform(2, -dot.Y);//移动光标到指定位置 
              }
                pbVerifyCode.Image = map;                
            }
            catch (ArgumentException)
            {
                MessageBox.Show("创建图片错误。");
            }
        }
 
        private void butUpdateVerifyCode_Click(object sender, EventArgs e)
        {
            UpdateVerifyCode();
        }   
        代码全部写完。


在c#的winform登录窗体中,如何实现窗口验证码

标签:c#

原文地址:http://7330234.blog.51cto.com/7320234/1559429

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!