正文

图形模式下的汉字显示2007-03-18 12:16:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wfxsky/24059.html

分享到:

我们在编写一些应用软件时,为了使软件更为通俗浅显、易学易用,具备汉字的用户界面是必不可少的条件。在文本模式下,只要有汉字操作系统的支持,显示汉字是不成问题的。只要用printf或cprintf就可以了。#include void main(){printf("我正在学习C语言!");}  在图形模式下显示汉字就稍稍麻烦些。可幸的是有很多人从事这一问题的研究,并开发了一些用于汉字显示的函数。这些函数不需要汉字系统的支持,但用到其中的字库文件。如UCDOS的HZK16。  汉字显示的第一步是打开字库文件。   函数: int OpenHz(const char *Hz16Path); 功能:打开字库文件Hz16Pathint handle; /*打开的字库文件指针*/int OpenHz(const char *Hz16Path){return (handle=open(Hz16Path,O_RDONLY|O_BINARY));} 打开字库文件后,就可以用下面介绍的函数显示16点阵的汉字。  函数: int WrtHz16(int x,int y,int z,int color,char *p); 功能:在(x,y)用color颜色显示汉字串p,汉字之间的空格数为z。intWrtHz16(int x, int y,int z,int color,char *p){unsigned int i,c1,c2,f=0; /*x,y:write at (x,y);*/int rec,i1,i2,i3; /*z:space between;*/long l; /*color:txt color*/char by[32]; /*p:HZ str*/if( handle<0 ) return -1; while((i=*p++)!=0){if(i>0xa1)if(f==0){c1=(i-0xa1)&0x07f;f=1;}else{c2=(i-0xa1)&0x07f;f=0;rec=c1*94+c2;l=rec*32L;lseek(handle,l,SEEK_SET);read(handle,by,32);for(i1=0;i1<16;i1++)for(i2=0;i2<2;i2++)for(i3=0;i3<8;i3++)if(GetBit(by[i1*2+i2],7-i3))putpixel(x+i2*8+i3,y+i1,color);x=x+z+16;}}return(x);}函数GetBit定义如下:  函数: int GetBit(unsigned char c,int n); 功能:取得汉字的点阵数据。int GetBit(unsigned char c,int n){return((c>>n)&1);}汉字显示结束,应该关闭字库文件。void CloseHz(void){close( handle );}#include "\Caic\Include\Hz.h"#include #include const char* Hz16Path = "\\UCDOS\\Hzk16.";const char* HzStr = "苦丁香C语言辅助学习软件";void main(){int gr=DETECT,gm;initgraph(&gr,&gm,"\\Caic\\Bgi");OpenHz( Hz16Path );Wrt16Hz(20,20,4,RED,HzStr);CloseHz();getch();closegraph();}显示24点阵及放大汉字  下面探讨一下如何显示24点阵及放大汉字。24点阵字库也可在任意一种汉字系统中找到。如UCDOS的HZK24S。函数: int WrtHz24(int x,int y,int z,int color,int m,\int n,char *p); 功能:显示24点阵及放大汉字。int WrtHz24(int x,int y,int z,int color,int m,int n,char *p){unsigned int i,c1,c2,f=0; /*z: 汉字字符间的空格*/int i1,i2,i3,i4,i5,rec; /*x,y: 先是位置(x,y)*/long l; /*color:汉字颜色*/char by[72]; /*m: x 方向的放大倍数*//*n: y 方向的放大倍数*/if( handle<0 ) return -1; /*p: 显示汉字串*/ while((i=*p++)!=0){if(i>0xa1)if(f==0){c1=(i-0xa1)&0x7f;f=1;}else{c2=(i-0xa1)&0x7f;f=0;rec=(c1-15)*94+c2;l=rec*72L;lseek(handle,l,SEEK_SET);read(handle,by,72);for(i1=0;i1<24*m;i1=i1+m)for(i4=0;i4

阅读(3079) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册