我有一个hzk16.fnt字库,VB怎么写才能读取里面的汉字
本拉灯 2004-09-24 09:47:00 我有一个hzk16.fnt字库,VB怎么写才能读取里面的汉字,
我有一个别人给的程序,但不会,请高手帮忙,搞成VB的
它的储存格式是一个汉字占32个字节,所以得到一个汉字的gb编码后*32就能找到对应汉字字摸的起始位置。16点阵的字一共由16*16=256个点组成,正好需要32个字节来表示,所以32个字节中的每一位是1还是0就代表16*16的方阵的对应位置是否应该点上。基本的算法就是这些,下面是个turbo C的例子供你参考,该例子需要到纯DOS模式下才能执行,主要就是让你能对提取字模有个了解。
#include<io.h>
#include<dos.h>
#include<fcntl.h>
#include<graphics.h>
#include<conio.h>
#define Byte unsigned char
#define Word unsigned int
int flag16;
void dishz();
main()
{
int Driver=CGA,Mode=CGAC2;
initgraph(&Driver,&Mode,"你的turbo图形驱动的目录位置");\\因为要切到图形模式,所以这里需要图形驱动
directvideo=0;
setbkcolor(0);
cleardevice();
dishz();
getch();
closegraph();
return(0);
}
void out16hz(int x,int y,int z, int color,char *p)
{
Word num,QM,WM,flag=0;
int record,i,j,k;
long pointer;
char Bit[32];
while ((num=*p++)!=0)
{
if(num>0xA1)
if (flag==0)
{
QM=(num-0xA1)&0x07F;
flag=1;
}
else
{
WM=(num-0xA1)&0x7F;
flag=0;
record=QM*94+WM;
pointer=record*32L;
lseek(flag16,pointer,SEEK_SET);
read(flag16,Bit,32);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if (convert(Bit[i*2+j],7-k))
putpixel(x+j*8+k,y+i,color);
x=x+z+16;
}
}
}
int convert(Byte ch,int n)
{
return((ch>>n)&0x01);
}
void dishz()
{
char *str1[]={"汉字显示"};
int x=130,y=85,size=1;
flag16=open("这里是你的16点阵字库文件的位置",O_RDWR|O_BINARY);
if(flag16==-1){printf("can not open hzk16\n");exit(1);}
out16hz(x,y,size,3,*str1);
y+=30;
close(flag16);
}
hzk16.fnt
open是打开一个文件
lseek是文件内定位
read读取文件内容
convert是自己定义的函数,功能是返回一个字节的某一位
putpixel是在屏幕上画点
initgraph是c里面屏幕初始化函数
setbkcolo设置背景色
cleardevice 清除设备
dishz 是自己定义的,总的一个功能函数
getch是等待输入,目的是让你能看清屏幕上的东西
数字1半角的编码值是31H,你就用31H去乘以32,等出的数就是1在点阵字库中起始数据的位置,从这个位置起读32个字节,然后根据这32个字节中的每一位是0还是1去点,至于这个1点出来是全角形态的1还是半角形态的1,我记不清了,这个是DOS时代的东西,好久没用了。