【WinForm UI控件系列】scratchCode 刮刮乐、识别码、防伪码、验证码控件 ScratchCode 是一个刮刮卡/防伪码/识别码/验证码控件支持鼠标擦除涂层显示底层验证码。适用于抽奖活动、防伪验证、验证码等场景功能特性多种验证码类型支持数字、字母、字母数字混合、汉字可擦除涂层鼠标拖动擦除涂层支持圆形/方形橡皮擦干扰线可选添加干扰线增加识别难度自定义外观支持涂层颜色、文本颜色、边框样式等圆角边框支持圆角矩形外观擦除进度检测自动检测擦除百分比达到阈值触发揭示事件校验功能内置验证码校验方法一、效果图二、使用说明属性说明数据属性属性名类型默认值说明Codestring随机生成当前验证码CodeLengthint6验证码长度半角4-12位汉字2-6个CodeTypeScratchCodeTypeAlphanumeric验证码类型IsRevealedboolfalse是否已完全揭示只读ScratchPercentfloat0已擦除百分比只读验证码外观属性名类型默认值说明CodeColorColor24, 144, 255验证码文本颜色CodeFontFontArial 20 Bold验证码字体涂层属性属性名类型默认值说明CoatingColorColor192, 192, 192涂层底色CoatingPatternColorColor160, 160, 160涂层纹理颜色CoatingPatternDensityint50涂层纹理密度(0-100)干扰线属性属性名类型默认值说明ShowInterferenceLinesbooltrue是否显示干扰线InterferenceLineCountint3干扰线数量(0-10)InterferenceLineColorColor100, 100, 100干扰线颜色橡皮擦属性属性名类型默认值说明EraserShapeEraserShapeCircle橡皮擦形状圆形/方形EraserSizeint20橡皮擦大小(5-50像素)外观属性属性名类型默认值说明CornerRadiusint4圆角半径(0-20)BorderColorColor200, 200, 200边框颜色BorderWidthint1边框宽度(0-5)PaddingPadding4,4,4,4控件内边距TextPaddingPadding8,8,8,8文本区域内边距主题属性属性名类型默认值说明FollowGlobalThemebooltrue是否跟随全局主题切换事件事件名说明参数CodeRevealed验证码被揭示时触发擦除超过50%EventArgsScratchProgressChanged擦除进度变化时触发ScratchProgressEventArgsCodeVerified验证码校验完成时触发VerifyEventArgs枚举类型ScratchCodeType值说明Numeric纯数字(0-9)Alphabetic纯字母(A-Z, a-z)Alphanumeric字母数字混合Chinese汉字一、二、三…EraserShape值说明Square方形橡皮擦Circle圆形橡皮擦使用示例基本用法// 创建控件varscratchCodenewScratchCode();scratchCode.SizenewSize(150,50);scratchCode.LocationnewPoint(20,20);// 添加到窗体this.Controls.Add(scratchCode);// 绑定事件scratchCode.CodeRevealed(sender,e){MessageBox.Show(验证码已揭示);};自定义验证码类型// 数字验证码scratchCode.CodeTypeScratchCodeType.Numeric;scratchCode.CodeLength6;// 汉字验证码scratchCode.CodeTypeScratchCodeType.Chinese;scratchCode.CodeLength4;// 2-6个汉字// 生成新的验证码scratchCode.GenerateNewCode();自定义外观// 验证码样式scratchCode.CodeColorColor.Red;scratchCode.CodeFontnewFont(宋体,24,FontStyle.Bold);// 涂层样式scratchCode.CoatingColorColor.Silver;scratchCode.CoatingPatternColorColor.Gray;scratchCode.CoatingPatternDensity60;// 干扰线scratchCode.ShowInterferenceLinestrue;scratchCode.InterferenceLineCount5;scratchCode.InterferenceLineColorColor.DarkGray;// 橡皮擦scratchCode.EraserShapeEraserShape.Circle;scratchCode.EraserSize25;// 边框scratchCode.BorderColorColor.FromArgb(24,144,255);scratchCode.BorderWidth2;scratchCode.CornerRadius8;验证码校验// 用户输入验证stringuserInputtextBox1.Text;boolisValidscratchCode.Verify(userInput,ignoreCase:true);if(isValid){MessageBox.Show(验证成功);}else{MessageBox.Show(验证失败请重新输入);scratchCode.Reset();// 重置涂层}// 绑定校验事件scratchCode.CodeVerified(sender,e){if(e.IsValid){labelResult.Text$✓ 验证通过;labelResult.ForeColorColor.Green;}else{labelResult.Text$✗ 验证失败正确答案是{e.CorrectCode};labelResult.ForeColorColor.Red;}};擦除进度监控scratchCode.ScratchProgressChanged(sender,e){// 更新进度条progressBar1.Value(int)(e.Progress*100);// 显示百分比labelPercent.Text$已擦除{e.Progress:P0};};设置自定义验证码// 使用自定义验证码不随机生成scratchCode.SetCustomCode(A1B2C3);// 完全揭示验证码用于测试或自动展示scratchCode.RevealAll();// 重置涂层重新开始刮scratchCode.Reset();完整示例publicpartialclassForm1:Form{privateScratchCodescratchCode;privateTextBoxtxtInput;privateButtonbtnVerify;privateLabellblResult;publicForm1(){InitializeComponent();InitializeScratchCode();}privatevoidInitializeScratchCode(){// 创建刮刮卡控件scratchCodenewScratchCode{SizenewSize(180,60),LocationnewPoint(20,20),CodeTypeScratchCodeType.Alphanumeric,CodeLength6,BorderColorColor.FromArgb(24,144,255),BorderWidth2,CornerRadius8,EraserSize25};// 创建输入框txtInputnewTextBox{LocationnewPoint(20,90),SizenewSize(100,25),MaxLength6};// 创建验证按钮btnVerifynewButton{Text验证,LocationnewPoint(130,90),SizenewSize(70,25)};btnVerify.ClickBtnVerify_Click;// 创建结果标签lblResultnewLabel{LocationnewPoint(20,120),SizenewSize(180,25),TextAlignContentAlignment.MiddleCenter};// 绑定事件scratchCode.CodeRevealed(s,e){lblResult.Text验证码已揭示请输入;lblResult.ForeColorColor.Blue;txtInput.Focus();};// 添加到窗体this.Controls.Add(scratchCode);this.Controls.Add(txtInput);this.Controls.Add(btnVerify);this.Controls.Add(lblResult);}privatevoidBtnVerify_Click(objectsender,EventArgse){if(string.IsNullOrEmpty(txtInput.Text)){MessageBox.Show(请输入验证码);return;}boolisValidscratchCode.Verify(txtInput.Text,ignoreCase:true);if(isValid){lblResult.Text✓ 验证成功;lblResult.ForeColorColor.Green;// 验证成功后生成新的验证码scratchCode.GenerateNewCode();txtInput.Clear();}else{lblResult.Text✗ 验证失败;lblResult.ForeColorColor.Red;txtInput.SelectAll();txtInput.Focus();}}}事件参数类ScratchProgressEventArgs属性类型说明Progressfloat已擦除百分比0.0 - 1.0VerifyEventArgs属性类型说明IsValidbool验证是否成功Inputstring用户输入的验证码CorrectCodestring正确的验证码注意事项验证码长度限制半角字符数字/字母4-12位汉字2-6个擦除阈值默认擦除50%以上视为已揭示触发CodeRevealed事件性能考虑控件大小建议不超过300x100像素涂层纹理密度过高可能影响性能线程安全所有UI操作需在UI线程执行资源释放控件会自动管理Bitmap资源无需手动释放汉字支持汉字验证码使用常用数字汉字一、二、三…十、百、千、万、亿校验规则字母类型默认忽略大小写汉字类型必须完全匹配空字符串或null始终返回验证失败主题适配支持自动跟随全局主题切换亮色/暗色深色模式下验证码显示为亮蓝色涂层显示为深灰色可通过FollowGlobalTheme属性禁用自动主题切换三、后记陆续补充完善中敬请关注如有需求有好的建议请留言(xue5zhijing)