该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
N久以有写的,图形模式下显示中文的程序,需要ucdos下ASC16,HZK16两个字库文件的支持。
里面的 printdot 函数为自己写的打点函数,非C标准的,用C标准函数代替一下。
参数:transparency 是否有背景色
printword(int x,int y,char *string,unsigned char color,unsigned char bgcolor,int transparency)
{
FILE *chinesestream,*englishstream;
int charpoint=0;
unsigned char mask=1;
int i,j,k;
unsigned char bit[32];
long fpos;
unsigned char c;
mask=mask<<7;
/*读入中文字库*/
if((chinesestream=fopen("HZK16","rb"))==NULL)
{
printf("Open hzk16 error!\n");
exit(0);
}
/*读入英文字库*/
if((englishstream=fopen("ASC16","rb"))==NULL)
{
printf("Open asc16 error!\n");
exit(0);
}
while(string[charpoint]!='\0')
{
c=string[charpoint];
if(c<128) /*要显示的字为英文*/
{
fpos=16L*string[charpoint];
fseek(englishstream, fpos, SEEK_SET);
fread(bit,16,1,englishstream);
for(i=0;i<16;i++)
{
for(j=0;j<8;j++)
{
if(bit[i]&mask)
printdot(x+j+charpoint*8,y+i,color);
else
if(transparency) printdot(x+j+charpoint*8,y+i,bgcolor);
bit[i]=bit[i]<<1;
}
}
charpoint++;
}
else /*要显示的字为中文*/
{
fpos=32L*(((unsigned char)string[charpoint]-161)*94+((unsigned char)string[charpoint+1]-161));
fseek(chinesestream, fpos, SEEK_SET);
fread(bit,32,1,chinesestream);
for(i=0;i<32;i=i+2)
{
for(k=0;k<2;k++)
for(j=0;j<8;j++)
{
if(bit[i+k]&mask)
printdot(x+j+charpoint*8+k*8,y+i/2,color);
else
if(transparency) printdot(x+j+charpoint*8+k*8,y+i/2,bgcolor);
bit[i+k]=bit[i+k]<<1;
}
}
charpoint++;
charpoint++;
}
}
}