2025年1月31日 星期五 甲辰(龙)年 冬月廿九 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

图形模式下的汉字显示

时间:01-03来源:作者:点击数:52

我们在编写一些应用软件时,为了使软件更为通俗浅显、易学易用,具备汉字的用户界面是必不可少的条件。在文本模式下,只要有汉字操作系统的支持,显示汉字是不成问题的。只要用printf或cprintf就可以了。

  • #include <stdio.h>
  • void main()
  • {
  • printf("我正在学习C语言!");
  • }

在图形模式下显示汉字就稍稍麻烦些。可幸的是有很多人从事这一问题的研究,并开发了一些用于汉字显示的函数。这些函数不需要汉字系统的支持,但用到其中的字库文件。如UCDOS的HZK16。

汉字显示的第一步是打开字库文件。

1、函数: int OpenHz(const char *Hz16Path);

功能:打开字库文件Hz16Pathint handle;

例如:

  • /*打开的字库文件指针*/
  • int OpenHz(const char *Hz16Path)
  • {
  • return (handle=open(Hz16Path,O_RDONLY|O_BINARY));
  • }

打开字库文件后,就可以用下面介绍的函数显示16点阵的汉字。

2、函数: 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);
  • }

3、函数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。

4、函数: 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 for(i2=0;i2<=2;i2++)
  • for(i3=0;i3<8;i3++)
  • if(GetBit(by[i1/m*3+i2],7-i3))
  • for(i5=0;i5 putpixel(x+i1+i4,y+i2*8*n+i3*n+i5,color);
  • x=x+24*m+z;
  • }
  • }
  • return(x);
  • }

使用Wrt24Hz的例子:

  • #include "\Caic\Include\Hz.h"
  • #include
  • #include const char* Hz24Path = "C:\\Ucdos\\fnt\\hzk24s."
  • const char* HzStr = "苦丁香C语言辅助学习软件";
  • void main()
  • {
  • int gr=DETECT,gm;
  • initgraph(&gr,gm,"\\Caic\\Bgi");
  • OpenHz( Hz24Path );
  • Wrt24Hz(20,20, /*先是在(x,y)*/
  • 4, /*汉字间的空格为4*/
  • RED, /*用红色显示*/
  • 2, /*x 方向放大2倍*/
  • 4, /*y 方向放大4倍*/
  • HzStr); /*显示字符串*/
  • CloseHz();
  • getch();
  • closegraph();
  • }

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门