如何在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 〈graphics.h〉

#include 〈stdio.h〉

#include 〈fcntl.h〉

#include 〈io.h〉

#include 〈stdlib.h〉

#include 〈conio.h〉

#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=20y=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=0i〈16i++) //将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字

for(n=0n〈rown++)

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

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

for(m=0m〈colm++)

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 2.0编译系统下运行成功,它可以将汉字放大显示,读者可以将它改成函数用在您的程序中显示汉字。

参考gugu99的博客

#include "Conio.h"

#include "graphics.h"

#define closegr closegraph

void initgr(void) /和培* BGI初始化 */

{

int gd = DETECT, gm = 0/* 和gd=VGA,gm=VGAHI是同样效果 */

registerbgidriver(EGAVGA_driver)/没唯* 注册BGI驱动唤察唯后可以不需要.BGI文件的支持运行 */

initgraph(&gd, &gm, "")

}

void drawmat(char *mat,int matsize,int x,int y,int color)

/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/

{

int i, j, k, n

n = (matsize - 1) / 8 + 1

for(j = 0j <matsizej++)

for(i = 0i <ni++)

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

if(mat[j * n + i] &(0x80 >>k)) /*测试为1的位则显示*/

putpixel(x + i * 8 + k, y + j, color)

}

char zi24[]={

/* 以下是 '字' 的 24点阵隶书 字模,72 byte */

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x18,0x00,0x08,0x1C,0x10,

0x1F,0xFF,0xF0,0x18,0x00,0x30,0x18,0xFF,

0x10,0x09,0xC3,0x90,0x00,0x3C,0x00,0x00,

0x1C,0x00,0x3F,0xFF,0xFE,0x7E,0x0C,0xFE,

0x00,0x1C,0x04,0x00,0x1C,0x00,0x04,0x3C,

0x00,0x03,0xF8,0x00,0x00,0xE0,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

}

char mo24[]={

/* 以下是 '模' 的 24点阵楷体_GB2312 字模,72 byte */

0x00,0x00,0x00,0x00,0x00,0x60,0x02,0x00,

0x30,0x03,0x0C,0x20,0x03,0x04,0x3C,0x02,

0x07,0xE0,0x02,0x1C,0x40,0x02,0x00,0x40,

0x03,0xC0,0x70,0x7E,0x1F,0x98,0x02,0x08,

0x10,0x06,0x0F,0x90,0x07,0x88,0x10,0x0A,

0xCB,0xE0,0x1A,0x05,0x00,0x12,0x01,0x1E,

0x22,0x0F,0xFE,0x42,0x32,0x80,0x02,0x02,

0x40,0x02,0x04,0x60,0x02,0x0C,0x30,0x02,

0x18,0x1C,0x02,0x20,0x0F,0x02,0x00,0x00,

}

}

int main(void)

{

int i, j

initgr()/* BGI初始化 */

drawmat(yi12, 12, 100, 125, WHITE)

drawmat(er12, 12, 115, 125, WHITE)

drawmat(dian12, 12, 130, 125, WHITE)

drawmat(zhen12, 12, 145, 125, WHITE)

drawmat(song16, 16, 160, 123, YELLOW)

drawmat(ti16, 16, 180, 123, YELLOW)

drawmat(zi24, 24, 200, 119, CYAN)

drawmat(mo24, 24, 230, 117, GREEN)

drawmat(guan48, 48, 350, 110, RED)

drawmat(guan64, 64, 410, 100, YELLOW)

~~~~未完


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

原文地址: https://outofmemory.cn/yw/12564625.html

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

发表评论

登录后才能评论

评论列表(0条)

保存