如何在C程序中显示12或16点的点阵汉字

如何在C程序中显示12或16点的点阵汉字,第1张

 在许多c程序设计中,要用到汉字进行提示或人机交互,而现行的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

程序例:

#include 〈graphicsh〉

#include 〈stdioh〉

#include 〈fcntlh〉

#include 〈ioh〉

#include 〈stdlibh〉

#include 〈conioh〉

#define row 1 //纵坐标放大倍数

#define col 2 //横坐标放大倍数

void main()

{

int x,y;

char *s=″汉字显示程序″;

file *fp;

char buffer[32]; //buffer用来存储一个汉字

register m,n,i,j,k;

unsigned char qh,wh;

unsigned long offset;

int gd=detect,gm; //图形屏幕初始化

initgraph(&gd,&gm,″ ″);

if ((fp=fopen(″hzk16″,″rb″))==null)

//打开汉字库,该字库可以在ucdos中找到

{ printf(″can't open haz16,please add it″);

getch(); closegraph(); exit(0);

}

x=20; y=100; //显示位置设置

while(*s)

{ qh=*(s)-0xa0; //汉字区位码

wh=*(s+1)-0xa0;

offset=(94*(qh-1)+(wh-1))*32l; //计算该汉字在字库中偏移量

fseek(fp,offset,seek_set);

fread(buffer,32,1,fp); //取出汉字32字节的点阵字模存入buffer中(一个汉字)

for (i=0;i〈16;i++) //将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字

for(n=0;n〈row;n++)

for(j=0;j〈2;j++)

for(k=0;k〈8;k++)

for(m=0;m〈col;m++)

if (((buffer[i*2+j]〉〉(7-k))&0x1)!=null)

putpixel(x+8*j*col+k*col+m,y+i*row+n,green);

s+=2; //因为一个汉字内码占用两个字节,所以s必须加2

x+=30;

}

getch();

closegraph();

}

上述程序在turbo c 20编译系统下运行成功,它可以将汉字放大显示,读者可以将它改成函数用在您的程序中显示汉字。

参考gugu99的博客

可以将这个功能封装为一个函数。

传入数组首地址,以及数组长度。

以循环方式,对数组逆序遍历即可。

代码:

void revers_print(int a, int l)

{

int i;

for( i = l-1; i >=0; i -- )

printf("%d,",a[i]);

return 0;

}

第一,没有硬件连接描述,单片机类型,晶振参数等;

第二,既然是点阵 ,显示的内容是需要自编字库的,即字模;

第三,没有说明所谓的移动是什么类型的,如整个字母移动,或单列移动;整屏移动又是什么情况。

char wo16S[]={

/ 以下是 '我' 的 16点阵宋体 字模,32 byte /

0x06,0x40,0x38,0x50,0x08,0x48,0x08,0x48,

0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x48,

0x0E,0x28,0x38,0x30,0xC8,0x20,0x08,0x50,

0x09,0x92,0x08,0x0A,0x28,0x06,0x10,0x02,

};

for (int i = 0; i < 16; i++)

{

for (int j = 0; j < 2; j++)

{

char ch = wo16S[i 2 + j];

for (int k = 0; k < 8; k++)

{

int x = j 8 + k; //X坐标

int y = i; //Y坐标

if (ch & (1 << (7 - k)))

{

DrawPixel(x, y); //把这里DrawPixel换成C语言中的画点 *** 作函数

}

}

}

}

你这程序写的什么乱七八糟的……跨文件调用乱成一锅粥。

图一里面应当声明成数组,DzkCode[]。

图二里面你是要调用,不是要再声明一个,应该加上extern并且确保与原始声明一致。

或者你别把字库存成C文件了,按头文件来做、让mainc包含它就好了。

int s[2][2];

for(e=0;e<2;e++)

for(f=0;f<2;f++)

{

s[e][f]=a[i][j]+b[m][n];

printf("s[%d][%d]=%d\t",e,f,s[e][f]);

}

你这个运算很明显有问题的,i和j 和m和n都没有变呢,所以这个程序段有问题的。你改下

for(e=0;e<2;e++)

for(f=0;f<2;f++)

{

s[e][f]=a[e][f]+b[e][f];

printf("s[%d][%d]=%d\t",e,f,s[e][f]);

}这样应该得的

不过不懂你是真样的设计来加的。

以上就是关于如何在C程序中显示12或16点的点阵汉字全部的内容,包括:如何在C程序中显示12或16点的点阵汉字、c语言数组输出点阵的问题,具体问题如图、怎样用c语言实现8*8点阵数字、字母的显示及移动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10147411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存