登录某些网站时除了输入用户名和密码,有时还会要求在密码框下方输入在图片中显示的随机验证码,或是解答在图片中随机出现数学题。前段时间又见到一种验证方式,在图片中随机出现几个中文字符,每个字符或立、或倒、或卧、或躺,用户点击某字符,该字符会顺时针(或逆时针)旋转90度,需要用户将每个字符都变成立着的才算验证通过(写本文时再到需要登录的网站中看,已经见不到这种验证方式了)。 我平时使用C#中的GDI+功能较多,看到这种旋转文字验证方式之后,感觉可以使用GDI+来实现旋转文本验证,于是写了个简单的测试程序,本文即叙述该功能的实现过程。
功能分析
旋转文字验证功能包括下面几个子功能: 创建旋转文字:随机生成不同旋转角度的文字 显示旋转文字:在控件中显示旋转文字 鼠标点击旋转文字:用户点击某旋转文字,然后顺时针或者逆时针旋转文字 验证旋转文字:验证是否所有的文字都已经是立着的
程序设计
首先定义一个旋转文本类RotatedText,该类表示一个旋转的文字,该类中的属性和方法如下图所示:
其中: ANGLES:静态属性,所有可用旋转角度的集合,本文中文本角度固定为0、90、180、270四个角度; m_angle及ANGLE:记录文字对象当前的旋转角度; m_bound及BOUND:记录文字的区域,用于绘制文字和定位文字,测试程序中,为简单起见,默认设置区域为正方形; m_text:要绘制的旋转文字内容; ROTATE_TEXT_ANGLE_STEP:用户每次点击旋转文本,然后旋转文本增加的旋转角度,固定为90度; ROTATE_TEXT_FONT:文本的字体,测试程序中是固定为宋体,字号为12。 DrawText函数绘制旋转文字; InitPosition函数初始化旋转文字所占区域的左上角坐标 RotateTextAnticlockwise函数逆时针90度旋转文字 RotateTextClockwise函数顺时针90度旋转文字
测试程序中创建和显示旋转文字的主要流程如下:
1)测试程序的界面如下,用户在原始文本出输入要进行旋转测试的文本,然后点击生成按钮创建旋转文字,并在内容显示区域显示
2)为用户输入的每个文字都创建响应的RotatedText对象,并初始化文字对象的区域大小,随机生成文字方向; 3)初始化每个RotatedText对象,这里有点偷懒,就是随机生成每个对象的左上角坐标位置,直到不与其它对象的区域重叠为止; 4)绘制RotatedText对象稍微麻烦一些,如下左图所示,为了使文字在旋转之后还在规定的区域内,在绘制旋转文字时,首先将坐标原点移动至文字区域中心,然后旋转坐标系,这时区域的左上角坐标始终是(-Bound.Width/2, -Bound.Height/2),然后就是调用Graphics.DrawString方法绘制旋转文本,这样无论文本如何旋转,它始终在步骤3生成的文字区域内旋转。这里还需要注意的一点是窗口坐标系如下右图所示,而不是笛卡尔坐标系, 因此区域的左上角坐标是(-Bound.Width/2,-Bound.Height/2),而不是(-Bound.Width/2,Bound.Height/2)。
用户鼠标点击旋转文字: 由于每个RotatedText对象都保存有区域信息,只要判断鼠标在哪个对象所在区域就可以对那个进行旋转(调用对象的RotateTextClockwise和RotateTextAnticlockwise函数)。 验证旋转文字 只要判断每个RotatedText的Angle属性是不是0就可以了。
最后是程序的截图,
程序的源码地址为:https://github.com/guochao2299/UserValidationOfRotatedText
|