在Turbo C集成开发环境中不是汉化的,如何编制能显示汉字的C程序呢?
这种方法是调用中文汉字库进行汉字显示。国家标准规定:汉字库分94个区,每个区有94个汉字(以位作区别),每个汉字在汉字库中有确定的区和位编号,
这就是汉字的区位码。每个汉字在库中是以点阵字模形式存储的,一般采用16×16点阵(32字节)、24×24点阵(72字节),每个点用一个二进制位
(0或1)表示,对应在屏幕上显示出来,就是相应的汉字。
由于在中文环境下,输入的是汉字的内码,我们必须将之转换成区位码,算出偏移量,从字库中找到对应的汉字,将其字模显示即可。
内码转换成区位码方法如下:
qh=c1-0xa0;
wh=c2-0xa0;
其区位码就是:
qw=qh*0xff+wh
该汉字在字库中离起点的位置是:
offset=(94*(qh-1)+(wh-1))*32L
得到了数据之后再对每个字节的每个位进行判断,如果为1就用putpixel()在相应的点上画一点,如果为0就不进行画点操作。
void hanzi16(int x,int y,char *s,int color,int row,int col)
{
FILE *fp;
char buf[16][2];
int i,j,k,m,n;
unsigned char qh,wh;
unsigned long offset;
if( (fp=fopen("hzk16","rb"))==NULL )
{
closegraph();
printf("Can‘t open hzk16");
getch();
exit(0);
}
while(*s) ;遍历所有需要显示的汉字
{
qh=(*s)-0xa0; ;内码转区码
wh=*(s+1)-0xa0; ;内码转位码
offset=(94*(qh-1)+(wh-1))*32L; ;计算该汉字在字库中的偏移量
fseek(fp,offset,SEEK_SET); ;在文件中定位
fread(buf,32,1,fp); ;取出32字节的点阵字模存入BUF中
for(i=0;i<16;i++) ;由于16X16点阵中有16行
for(n=0;n<row;n++) ;行增大倍数
for(j=0;j<2;j++) ;每行有2个字节
for(k=0;k<8;k++) ;测试字节的位
for(m=0;m<col;m++) ;列增大倍数
if( buf[i][j] & (0x80>>k) ) ;做“与”位操作,如果是1,就画点
putpixel(x+j*8*col+k*col+m,y+i*row+n,color);
s+=2; ;一个汉字占2个字节
x+=(16*col); ;下一列的输出位置
}
fclose(fp);
}