WPF 实现自绘验证码

 WPF 实现自绘验证码

控件名:VerifyCode

作者:WPFDevelopersOrg

原文链接:   https://github.com/WPFDevelopersOrg/WPFDevelopers

  • 框架使用大于等于.NET40

  • Visual Studio 2022;

  • 项目使用 MIT 开源许可协议;

如何通过DrawingVisual进行自绘验证码

  • 首先定义验证码池作为随机生成验证码所需; private const string strCode = "abcdefhkmnprstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"; 可自行编写所需的内容(可以注意到上方的验证码池中某些存在差异的字母与数字不在其中这是为 了更好的方便生成的验证码不会给用户造成误解,用户应该输入字母l还是数字1,所以进行了排除);

  • 通过方法CreateCode生成四或更多位随机验证码,然后调用方法CreateCheckCodeImage进行绘制验证码;

    • 第一步绘制边框与背景;

    • 第二步绘制验证码;

    • 第三步绘制背景的线条;

    • 第四步绘制随机颜色进行扰乱视觉;

    • 第四步创建并返回ImageSource进行展现;

  • 鼠标点击验证码控件就能实现更换验证码;

1)VerifyCode.cs 代码如下;

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;namespace WPFDevelopers.Controls
{[TemplatePart(Name = ImageTemplateName, Type = typeof(Image))]public class VerifyCode : Control{private const string ImageTemplateName = "PART_Image";private const string strCode = "abcdefhkmnprstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";public static readonly DependencyProperty ImageSourceProperty =DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(VerifyCode),new PropertyMetadata(null));private Image _image;private Size _size = new Size(70, 23);public VerifyCode(){Foreground = DrawingContextHelper.Brush;Loaded += CheckCode_Loaded;}/// <summary>///     随机生成的验证码/// </summary>public ImageSource ImageSource{get => (ImageSource)GetValue(ImageSourceProperty);set => SetValue(ImageSourceProperty, value);}private void CheckCode_Loaded(object sender, RoutedEventArgs e){ImageSource = CreateCheckCodeImage(CreateCode(4), (int)ActualWidth, (int)ActualHeight);}public override void OnApplyTemplate(){base.OnApplyTemplate();_image = GetTemplateChild(ImageTemplateName) as Image;if (_image != null)_image.PreviewMouseDown += _image_PreviewMouseDown;}private void _image_PreviewMouseDown(object sender, MouseButtonEventArgs e){if (!IsLoaded)return;ImageSource = CreateCheckCodeImage(CreateCode(4), (int)ActualWidth, (int)ActualHeight);}private string CreateCode(int strLength){var _charArray = strCode.ToCharArray();var randomCode = "";var temp = -1;var rand = new Random(Guid.NewGuid().GetHashCode());for (var i = 0; i < strLength; i++){if (temp != -1)rand = new Random(i * temp * (int)DateTime.Now.Ticks);var t = rand.Next(strCode.Length - 1);if (!string.IsNullOrWhiteSpace(randomCode))while (randomCode.ToLower().Contains(_charArray[t].ToString().ToLower()))t = rand.Next(strCode.Length - 1);if (temp == t)return CreateCode(strLength);temp = t;randomCode += _charArray[t];}return randomCode;}private ImageSource CreateCheckCodeImage(string checkCode, int width, int height){if (string.IsNullOrWhiteSpace(checkCode))return null;if (width <= 0 || height <= 0)return null;var drawingVisual = new DrawingVisual();var random = new Random(Guid.NewGuid().GetHashCode());using (var dc = drawingVisual.RenderOpen()){dc.DrawRectangle(Brushes.White, new Pen(Foreground, 1), new Rect(_size));var formattedText = DrawingContextHelper.GetFormattedText(checkCode, Foreground,FlowDirection.LeftToRight, 20, FontWeights.Bold);dc.DrawText(formattedText,new Point((_size.Width - formattedText.Width) / 2, (_size.Height - formattedText.Height) / 2));for (var i = 0; i < 10; i++){var x1 = random.Next(width - 1);var y1 = random.Next(height - 1);var x2 = random.Next(width - 1);var y2 = random.Next(height - 1);dc.DrawGeometry(Brushes.Silver, new Pen(Brushes.Silver, 0.5D),new LineGeometry(new Point(x1, y1), new Point(x2, y2)));}for (var i = 0; i < 100; i++){var x = random.Next(width - 1);var y = random.Next(height - 1);var c = new SolidColorBrush(Color.FromRgb((byte)random.Next(0, 255), (byte)random.Next(0, 255),(byte)random.Next(0, 255)));dc.DrawGeometry(c, new Pen(c, 1D),new LineGeometry(new Point(x - 0.5, y - 0.5), new Point(x + 0.5, y + 0.5)));}dc.Close();}var renderBitmap = new RenderTargetBitmap(70, 23, 96, 96, PixelFormats.Pbgra32);renderBitmap.Render(drawingVisual);return BitmapFrame.Create(renderBitmap);}}
}

2)VerifyCode.xaml 代码如下;

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:controls="clr-namespace:WPFDevelopers.Controls"><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Basic/ControlBasic.xaml"/></ResourceDictionary.MergedDictionaries><Style TargetType="{x:Type controls:VerifyCode}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Background" Value="{x:Null}"/><Setter Property="Width" Value="100"/><Setter Property="Height" Value="40"/><Setter Property="Cursor" Value="Hand"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:VerifyCode}"><Image x:Name="PART_Image" Stretch="Fill" Source="{TemplateBinding ImageSource}"/></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>

3)VerifyCodeExample.xaml 代码如下;

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.VerifyCodeExample"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"xmlns:wpfdev="https://github.com/WPFDevelopersOrg/WPFDevelopers"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><UniformGrid Rows="2" Columns="2"><wpfdev:VerifyCode Foreground="LimeGreen"/><wpfdev:VerifyCode Foreground="Red"/><wpfdev:VerifyCode Foreground="DodgerBlue"/><wpfdev:VerifyCode Foreground="HotPink"/></UniformGrid>
</UserControl>
4f078d8671f0f1e5e0190dbab8897ffa.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css中的单位换算_CSS单位px、em、rem及它们之间的换算关系

作者:WangMin格言:努力做好自己喜欢的每一件事国内的设计师大都喜欢用px&#xff0c;而国外的网站大都喜欢用em和rem&#xff0c;那么三者的区别与优势是什么&#xff1f;接下来我们就来学习一下吧&#xff01;单位px、em、rem分别表示什么&#xff1f;1、 px(Pixel) 相对于显示…

IIS上部署Net.Core

部署: 1、安装vc_redist.x64vc_redist.x64 2、安装DotNetCore.1.0.0.RC2-WindowsHosting 3、安装DotNetCore.1.0.0-SDK.Preview2-x64 4、控制台命令执行&#xff1a;dotnet -version&#xff0c;确认是否执行成功。成功则Net.Core安装完成 5、发布参考&#xff1a;IIS上部署Net…

【MAC】Ncnn 编译so文件方案

【MAC】Ncnn 编译so文件方案 1、下载ncnn github地址是&#xff1a;https://github.com/Tencent/ncnn 指定目录&#xff1a;在终端或者git管理工具 输入&#xff1a;git clone https://github.com/Tencent/ncnn.git 2、编译Ncnn 2.1 Mac平台 安装cmake、wget&#xff08;根据实…

SSM学习注意杂记

2019独角兽企业重金招聘Python工程师标准>>> 1.spring导包时一定要版本对应&#xff0c;最好不要导不同版本的包&#xff0c;还有mybatis的包&#xff0c;springmvc的包&#xff0c;三个框架的包都需配套&#xff0c;要不然会出现一些想象不到的错误。 2.mybatis写映…

《ASP.NET Core 6框架揭秘》实例演示[15]:针对控制台的日志输出

针对控制台的ILogger实现类型为ConsoleLogger&#xff0c;对应的ILoggerProvider实现类型为ConsoleLoggerProvider&#xff0c;这两个类型都定义在 NuGet包“Microsoft.Extensions.Logging.Console”中。ConsoleLogger要将一条日志输出到控制台上&#xff0c;首选要解决的是格式…

基于mysql数据库的应用_MySQL数据库应用

参考资料&#xff1a;准备软件&#xff1a;mysql-5.5.13-win32.msi、MySQL安装图解.doc、Navicat_for_MySQL_10.0.5.0_XiaZaiBa.exe、mysqldriver.jar、eclipseMySQL基本操作登陆&#xff1a;mysql -u 用户名 -p 密码显示数据库&#xff1a;show databases;使用数据库&#xff…

《HeadFirst Python》第一章学习笔记

对于Python初学者来说&#xff0c;舍得强烈推荐从《HeadFirst Python》开始读起&#xff0c;这本书当真做到了深入浅出&#xff0c;HeadFirst系列&#xff0c;本身亦是品质的保证。这本书舍得已在《Python起步&#xff1a;写给零编程基础的童鞋》一文中提供了下载。为了方便大家…

Oracle-13:Oracle中的表分区

------------吾亦无他,唯手熟尔&#xff0c;谦卑若愚&#xff0c;好学若饥------------- 本篇博客记录了表分区 表分区的含义&#xff1a; 典型的拿空间换时间的案例&#xff01; 表分区对一张表进行分区&#xff0c;分区之后表中的数据存在相对应的分区内&#xff08;可以是不…

js控制图像等比例缩放

<!DOCTYPE html> <html> <head><title>图片内部放大效果</title> <meta charset"utf-8"> <style type"text/css">#imgborder{ width: 200px;height: 160px;border: 3px solid #000; overflow: hidden;position:…

mysql一张表最多多少索引_MySQL一个索引最多有多少个列?真实的测试例子

MySQL一个索引最多有多少个列&#xff1f;真实的测试例子更新时间&#xff1a;2009年07月01日 22:22:21 作者&#xff1a;MySQL一个索引最多有多少个列&#xff1f;下面是具体的实现代码。最多16列。create table test (f1 int,f2 int,f3 int,f4 int,f5 int,f6 int,f7 int,f8…

.NET Core 使用 LibreOffice 实现 Office 预览(Docker 部署)

前些年做云盘产品的时候&#xff0c;一个很核心的功能就是 Office 文件预览&#xff0c;当时还没有使用 .NET Core ,程序部署在 Windows Server 服务器上&#xff0c;文件预览的方案采用了微软的 OWA 。目前在做的零代码产品中的表单附件控件&#xff0c;同样面临着 Office 文件…

es6(五):函数的扩展

函数参数的默认值 function log(x, y World) {console.log(x, y); }log(Hello) // Hello World log(Hello, China) // Hello China log(Hello, ) // Hellofunction Point(x 0, y 0) {this.x x;this.y y; }var p new Point(); p // { x: 0, y: 0 }函数length 的属性 指定了…

tomcat启动报错:Bean name 'XXX' is already used in this beans element

如题&#xff0c;tomcat容器启动时加载spring的bean&#xff0c;结果报错如下&#xff1a; 六月 28, 2017 9:02:25 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property source to…

[开源精品] C#.NET im 聊天通讯架构设计 -- FreeIM 支持集群、职责分明、高性能

&#x1f4bb; FreeIM 是什么&#xff1f;FreeIM 使用 websocket 协议实现简易、高性能&#xff08;单机支持5万连接&#xff09;、集群即时通讯组件&#xff0c;支持点对点通讯、群聊通讯、上线下线事件消息等众多实用性功能。 ImCore 已正式改名为 FreeIM。使用场景&#xff…

用websploit获取管理员后台地址

1, use web/dir_scanner 2, set TARGET http://www.****.com 3, run SOURCE: https://sourceforge.net/projects/websploit/ WebSploit Advanced MITM Framework[]Autopwn – Used From Metasploit For Scan and Exploit Target Service[]wmap – Scan,Crawler Target Used Fro…

mysql事务操作_mysql的事务操作

倒着思考。杜绝纯粹的知识填鸭教育少废话&#xff0c;是上代码&#xff1a;update table1 set money-100 where id1; //A账户减少100元update table2 set money100 where id2; //B 账户增加100元问题&#xff1a;这是一个简单的银行转账案例sql&#xff0c;由于服务器等未知原因…

《ASP.NET Core 6框架揭秘》实例演示[16]:内存缓存与分布式缓存的使用

.NET提供了两个独立的缓存框架&#xff0c;一个是针对本地内存的缓存&#xff0c;另一个是针对分布式存储的缓存。前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中&#xff0c;后者则需要将对象序列化成字节数组并存储到一个独立的“中心数据库”。对于分…

高可用架构-- MySQL主从复制的配置

环境 操作系统&#xff1a;CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本&#xff1a;mysql-5.6.26.tar.gz 主节点IP&#xff1a;192.168.1.205 主机名&#xff1a;edu-mysql-01 从节点IP&#xff1a;192.168.1.206 主机名&#xff1a;edu-mysql-02 主机配置&#xff1a;4核CPU、4…

java 数组冒泡排序、转置(降序)

1.java 数组冒泡排序 排序的基本原理&#xff08;升序&#xff09;&#xff1a; 原始数据&#xff1a; 2 、1 、9 、0 、5 、3 、7 、6 、8&#xff1b; 第一次排序&#xff1a; 1 、2 、0 、5 、3 、7 、6 、8 、9 &#xff1b; 第二次排序&#xff1a; 1 、0 、2 、…

人工智能教程007:创建一个卷积神经网络(2)

2019独角兽企业重金招聘Python工程师标准>>> 我们如何对图像应用卷积 当我们在图像上应用卷积时&#xff0c;我们在两个维度上执行卷积——水平和竖直方向。我们混合两桶信息&#xff1a;第一桶是输入的图像&#xff0c;由三个矩阵构成——RGB三通道&#xff0c;其中…