下面的方法可以帮你在西文环境下显示汉字。这种方法是调用中文汉字库进行汉字显示。国家标准规定:汉字库分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)
~~~~未完
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)