一个在图形模式下显示汉字的C程序例子
/*注:编译运行时程序目录下需要 字库文件 HZK12,在UCDOS CCDOS 还有许多地方可以找到这个文件的*/
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
void DISPLAY_HZ();
/*-------------------------------------------------------------------------*/
main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
DISPLAY_HZ(200,50,1,1,14,10,"Hello, world! 图形模式下显示汉字");
DISPLAY_HZ(60,100,2,2,28,13,"Hello, world! 图形模式下显示汉字");
DISPLAY_HZ(100,200,3,3,42,9,"图形模式下显示汉字");
DISPLAY_HZ(100,300,1,1,14,15,"注:图形模式下显示汉字是用画点的方法一点一点画出来的^_^");
getch();
closegraph();
}
/*-------------------------------------------------------------------------*/
/*在C程序中显示汉字的函数*/
void DISPLAY_HZ(
int cx, /*横坐标*/
int cy, /*纵坐标*/
int Width, /*宽的放大倍数*/
int Height, /*长的放大倍数*/
int w, /*字间隔*/
int color, /*汉字颜色*/
char *s /*汉字*/
)
{
FILE *fp;
char buffer[24]; /*buffer用来存储一个汉字*/
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset; /*长整型 以支持长文件*/
char EC[2];
if ((fp=fopen("hzk12","rb"))==NULL) /*打开字库文件 HZK12*/
{
return;
}
while(*s) /*循环条件:指针为真*/
{
if(*s<0) /*是汉字的话*/
{
qh=*(s)-0xa0; /*汉字区位码*/
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*24L; /*计算该汉字在字库中偏移量*/
fseek(fp,offset,SEEK_SET);
/*offset(偏移量) SEEK_SET(起始位置为开头) 设置与fp相连接的文件位置指示器*/
/*使文件指针偏移*/
fread(buffer,24,1,fp);
/*从fp指向的流中,读取1各字段长度24字节的点阵字模(一个汉字),存入buffer中*/
/*将24位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字*/
for(i=0;i<12;i++) /*字模的12个行*/
for(n=0;n<Height;n++) /**/
for(j=0;j<2;j++) /*每个行的个2字节*/
for(k=0;k<8;k++) /*每个字节8位*/
for(m=0;m<Width;m++) /**/
if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(cx+8*j*Width+k*Width+m,cy+i*Height+n,color);
s+=2; /*因为一个汉字内码占用两个字节,所以s必须加2 */
cx+=w; /*字间隔*/
}
else
{
settextstyle(0,0,1);
setcolor(color);
EC[0]=*s;
EC[1]='\0';
outtextxy(cx,cy+3,EC);
cx+=w-6;
s++;
}
}
fclose(fp);
}
/*-------------------------------------------------------------------------*/

