本文由BlueCoder编写 转载请说明出处:
http://blog.csdn.net/crocodile__/article/details/9612189
我的邮箱:bluecoder@yeah.net 欢迎大家和我交流编程心得
我的微博:BlueCoder_黎小华 欢迎光临^_^
上次利用文本输出规范,我写了一个"程序员求爱程序",今天还是继续玩一下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是字符的高度
因为显示字符的位置是它左上角的坐标,如果不减去字符的高度,那么仅仅是字符的左上角坐标在我们想要的范围内,字符的显示却会超出这个范围
今儿这个程序很简单,但是重在它能体现文本输出的一些技巧,个人觉得还是比较重要的,希望读者多下点儿功夫吧
源代码下载