当前位置:编程学习 > 网站相关 >>

<Win32_7>Win32的验证码程序

上次利用文本输出规范,我写了一个"程序员求爱程序",今天还是继续玩一下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)重要的变量:

[cpp]
<P> static int  cxChar, cxCaps, cyChar; //大小写字符的宽度、字符的高度  
 static RECT  rect;     //验证码显示的范围  
 TEXTMETRIC  tm;      //文本信息结构体      </P><P> //分别表示验证码、坐标xy(为了节省空间 , 用于验证码的坐标和鼠标点击的坐标)、循环变量  
 int    num, x, y, i; 
  
 TCHAR   str[2];//验证码数组</P> 

 static int  cxChar, cxCaps, cyChar; //大小写字符的宽度、字符的高度
 static RECT  rect;     //验证码显示的范围
 TEXTMETRIC  tm;      //文本信息结构体       //分别表示验证码、坐标xy(为了节省空间 , 用于验证码的坐标和鼠标点击的坐标)、循环变量
 int    num, x, y, i;
 
 TCHAR   str[2];//验证码数组
(2)验证码的实现

实现代码如下:

[cpp] 
//先画出验证码的范围 , 矩形(默认是白色的刷子 , 所以矩形的背景是白色)  
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); 

//先画出验证码的范围 , 矩形(默认是白色的刷子 , 所以矩形的背景是白色)
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);
}
我主要讲一下这一行代码:

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

y = rand()%(31 - cyChar) + 90;这里主要是控制验证码在矩形区域的中间一个范围显示,那为什么要见一个cyChar呢?

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

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

 

 

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

 

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,