现在的位置: 首页 > 综合 > 正文

Win32的验证码程序

2013年11月13日 ⁄ 综合 ⁄ 共 1492字 ⁄ 字号 评论关闭

上次利用文本输出规范,我写了一个"程序员求爱程序",今天还是继续玩一下Win32的文本输出,这次我将详细谈一下Win32的文本输出规范。毕竟,这个在Win32编程中还是很重要的,基本上每一个程序都离不开这个玩意儿

 

ok,先来说一下基础:

Win32中有一个关于文本信息的结构体TEXTMETRIC,它包含很丰富的文本信息,而P先生(Charles Petzold)的书中说道,我日常编程中仅仅用到其中几个,以下就是:

{ 
  LONG tmHeight; 		//每一行文本的高度
  LONG tmAscent; 		//上边沿字符(相对于基线baseline)
  LONG tmDescent; 		//下边沿字符(相对于基线baseline)
  LONG tmInternalLeading; 	//重音符号的高度
  LONG tmExternalLeading; 	//每一行字符的间距
  LONG tmAveCharWidth;    	//字符平均高度
  LONG tmMaxCharWidth;    	//最大字符的宽度
  BYTE tmPitchAndFamily;  	//字体的一些信息(但是就目前而言,这个信息的低8位多数用于大写字符的判断)
}

 

继续用P先生的一张图来诠释这些玩意儿:

 

这个东西还是不难看懂,主要是要熟记,这样以后就不用查看api,直接上阵演练

 

 

好了,有了这些基础,我们就开始今儿的主题,编写一个简易的验证码程序

先来瞧一眼它的运行效果:

 

 

 

主要功能如下:

(1)验证码显示的位置在一定范围内随机、验证码在0~9随机、验证码颜色随机

(2)鼠标点击验证码可以变换(这个和实际生活中见到的是一样的)

 

下面来看看试下细节吧:

(1)重要的变量:

 static int  cxChar, cxCaps, cyChar; //大小写字符的宽度、字符的高度  static RECT  rect;     //验证码显示的范围  TEXTMETRIC  tm;      //文本信息结构体      

 //分别表示验证码、坐标xy(为了节省空间 , 用于验证码的坐标和鼠标点击的坐标)、循环变量  int    num, x, y, i;    TCHAR   str[2];//验证码数组

(2)验证码的实现

实现代码如下:

//先画出验证码的范围 , 矩形(默认是白色的刷子 , 所以矩形的背景是白色)
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);

//打印验证码
for(i=0; i<4; i++)
{
	SetTextColor(hdc, RGB(rand()%255, rand()%255, rand()%255));//设置随机文本颜色

	//设置随机验证码
	num = rand()%10;
	wsprintf(str, TEXT("%d"), num);

	//设定每一位验证码的坐标
	x = rect.left + 20 + i * (cxChar + cxCaps);
	y = rand()%(31 - cyChar) + 90;

	//显示验证码
	TextOut(hdc, x, y, str, 1);
}

我主要讲一下这一行代码:

y = rand()%(31 - cyChar) + 90;

这里主要是控制验证码在矩形区域的中间一个范围显示,那为什么要见一个cyChar呢?

对于rand()求余运算,就是获得0~(31 - cyChar)之间的随机数,而cyChar是字符的高度

因为显示字符的位置是它左上角的坐标,如果不减去字符的高度,那么仅仅是字符的左上角坐标在我们想要的范围内,字符的显示却会超出这个范围

 

 

今儿这个程序很简单,但是重在它能体现文本输出的一些技巧,个人觉得还是比较重要的,希望读者多下点儿功夫吧

 

源代码下载

抱歉!评论已关闭.