📄 hzk.h
字号:
#include "font.h"
short textasc7(BITMAP *bmp,int x, int y, char * str,unsigned char col);
struct ChinaHzk{
FILE *CHINZK,*ASCZK,*HZK24;
long HZKLEN;
short len;
char *CHzkBuf,*AHzkBuf;
char ChinaName[50],Hzk24Name[50];
char Loadhzk,HZK;
ChinaHzk();
}ChinaHzk;
ChinaHzk::ChinaHzk()
{CHzkBuf=NULL;
AHzkBuf=NULL;
}
/*将汉字库调入内存
也可提前将字库打开,
ChinaHzk.CHINZK 中文字库结构(ucdos)
ChinaHzk.ASCZK 西文字库结构(ucdos)
退出时关闭.
*/
void setChinaLen(int len)
{ChinaHzk.len=len;}
void CloseHzk()
{
if(ChinaHzk.CHINZK!=NULL)
delete []ChinaHzk.CHzkBuf;
if(ChinaHzk.ASCZK!=NULL)
delete []ChinaHzk.AHzkBuf;
if(ChinaHzk.HZK24!=NULL)
{
fclose(ChinaHzk.HZK24);
}
}
char LoadAsc()
{ if((ChinaHzk.ASCZK=fopen("asc16","rb"))==NULL)
{
sprintf(grp_err,"can not open asc16.");
return FALSE;
}
ChinaHzk.AHzkBuf=new unsigned char [4097];
if(ChinaHzk.AHzkBuf==NULL){return FALSE;}
fread(ChinaHzk.AHzkBuf,1,4096,ChinaHzk.ASCZK);
fclose(ChinaHzk.ASCZK);
ChinaHzk.Loadhzk=1;
ChinaHzk.HZK=1;
fclose(ChinaHzk.ASCZK);
atexit(CloseHzk);
return TRUE;
}
char LoadHzk()
{ if((ChinaHzk.CHINZK=fopen("hzk16","rb"))==NULL)
{
sprintf(grp_err,"can not open hzk16.");
return FALSE;
}
fseek(ChinaHzk.CHINZK,0,SEEK_END);
ChinaHzk.HZKLEN=ftell(ChinaHzk.CHINZK);
rewind(ChinaHzk.CHINZK);
ChinaHzk.CHzkBuf=new unsigned char [ChinaHzk.HZKLEN+1];
if(ChinaHzk.CHzkBuf==NULL){return FALSE;}
fread(ChinaHzk.CHzkBuf,1,ChinaHzk.HZKLEN,ChinaHzk.CHINZK);
fclose(ChinaHzk.CHINZK);
ChinaHzk.Loadhzk=1;
ChinaHzk.HZK=1;
fclose(ChinaHzk.CHINZK);
atexit(CloseHzk);
return TRUE;
}
char load_font()
{if(LoadAsc()||LoadHzk())return FALSE;
else
return TRUE;
}
char LoadHzk24()
{ if((ChinaHzk.HZK24=fopen(ChinaHzk.Hzk24Name,"rb"))==NULL)
{
sprintf(grp_err,"Error on open the Hzk24.");
return FALSE;}
else
return TRUE;
}
void show24(BITMAP *bitmap,char *p,int x,int y,unsigned char color)
{
unsigned int i,c1,c2,f=0;
int i1,i2,i3,rec;
int l;
char by[72];
while((i=*p++)!=0)
{
if(i>0xb0)
if(f==0)
{
c1=(i-0xb0)&0x07f;
f=1;
}
else
{
c2=(i-0xa1)&0x07f;
f=0;
rec=c1*94+c2;
l=rec*72L;
fseek(ChinaHzk.HZK24,l,SEEK_SET);
fread(by,72,1,ChinaHzk.HZK24);
for(i1=0;i1<24;i1++)
for(i2=0;i2<=2;i2++)
for(i3=0;i3<8;i3++)
if(getbit(*(by+i1*3+i2),7-i3))
putpixel(bitmap,x+i1,y+i2*8+i3,color);
x=x+24+ChinaHzk.len;
}
}
}
void hzput(int x,int y,int col,BITMAP *bitmap1)
{ register unsigned char dot[16][2];
register i,j,k,mask;
if(ChinaHzk.HZK){
for(i=0;i<=15;i++)
{for(j=0;j<=1;j++)
{
if(!ChinaHzk.Loadhzk||ChinaHzk.CHzkBuf==NULL)
dot[i][j]=fgetc(ChinaHzk.CHINZK);
else
dot[i][j]=*ChinaHzk.CHzkBuf++;
mask=0x80;
for(k=0;k<=7;k++)
{if(dot[i][j]&mask)
putpixel(bitmap1,x+((j<<3)+k),y+i,col);
mask>>=1;
}
}
}
}else
for(i=0;i<=15;i++)
{j=0;
if(!ChinaHzk.Loadhzk||ChinaHzk.AHzkBuf==NULL)
dot[i][j]=fgetc(ChinaHzk.ASCZK);
else
dot[i][j]=*ChinaHzk.AHzkBuf++;
mask=0x80;
for(k=0;k<=7;k++)
{if(dot[i][j]&mask)
putpixel(bitmap1,x+((j<<3)+k),y+i,col);
mask>>=1;
}
}
ChinaHzk.HZK=1;
}
//显示字符
void textout(BITMAP *bitmap1,char *Str,int x,int y,unsigned char col)
{ register unsigned int offset1;
int oldx;
register unsigned char *_bakCHzkBuf,*_bakAHzkBuf,val;
_bakCHzkBuf=ChinaHzk.CHzkBuf;
_bakAHzkBuf=ChinaHzk.AHzkBuf;
oldx=x;
while(*Str)
{if(*Str=='\n'){y+=17;x=oldx;*Str++;continue;}
if(!(*Str&0x80)){
if((!ChinaHzk.Loadhzk)||ChinaHzk.AHzkBuf==NULL){
val=textasc7(bitmap1,x,y,Str,col);
if(!val)return;
Str+=val;
x+=6*val;
goto hz;
}
offset1=*Str<<4;
ChinaHzk.HZK=0;
ChinaHzk.AHzkBuf+=offset1;
hzput(x,y,col,bitmap1);
if(x+8+ChinaHzk.len<bitmap1->w)
{x+=(8+ChinaHzk.len);}
else
{y+=17;x=oldx;}
Str++;
ChinaHzk.HZK=1;
ChinaHzk.AHzkBuf=_bakAHzkBuf;
continue;
}
hz:
offset1=(unsigned int)((((*Str+95)<<6)+((*Str+95)<<5))-
((*Str+95)<<1)+(*(Str+1)+95))<<5;
ChinaHzk.CHzkBuf+=(unsigned int)(offset1-778240);
hzput(x,y,col,bitmap1);
if(x+16+ChinaHzk.len<bitmap1->w)
{x+=(16+ChinaHzk.len);}
else
{y+=17;x=oldx;}
Str+=2;
ChinaHzk.CHzkBuf=_bakCHzkBuf;
}
}
//显示字符
void OutText(BITMAP *bitmap,int x,int y,char *str,...)
{ va_list ptr;char *strr;
strr=new char [strlen(str)+2];
va_start(ptr,str);
vsprintf(strr,str,ptr);
va_end(ptr);
textout(bitmap,strr,x,y,_COLOR);
delete []strr;
}
void print_letter(BITMAP *bmp,int x, int y, char letter,unsigned char col)
{
static int y_scan, width;
static unsigned char mask;
static unsigned char * fontptr;
register int x_scan;
if(letter <= 31) return;
letter -= 32;
width = font_width[(int)letter];
fontptr = font[(int)letter];
for(y_scan = 0; y_scan != 7; y_scan++) {
mask = 128;
for(x_scan = 0; x_scan != width; x_scan++) {
if(*fontptr & mask)
putpixel(bmp,x+x_scan,y+y_scan,col);
mask >>= 1;
}
++fontptr;
}
}
short textasc7(BITMAP *bmp,int x, int y, char * str,unsigned char col)
{register short str_num=0;
while(*str) {
if((*str&0x80))return str_num;
print_letter(bmp,x, y, *str,col);
x += font_width[*str-32];
++str;
str_num++;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -