/*此程序為建立漢字庫頭文件<hzk.h>*/
/*此程序要16乘16漢字庫文件<hzk16>*/
#include"stdio.h"
main()
??{?? int i,j,k;
???? int len,qu,wei;
??????long int l;
??????unsigned char c;
????????unsigned??char *s,*ss;
??????????FILE*fp,*p;
?? if((fp=fopen("hzk.h","w"))==NULL)?????? /*在當前位置建立漢字字模頭文件??,運行后可打開此文件看看*/
??????{printf("error not is <hzk.h>"); getch();}
??????????s="沒有太大或路徑名內足存夠了新建菜單開始錯誤找不到文件請輸入數字符的串鼠標光退出保存運行:?打能!,"; /*在次添加漢字*/
??????????ss=s;
??????????len=strlen(s)/2; /*獲得漢字個數*/
??????????fprintf(fp,"int hz[%d]={\n",len+1); /*定義特征碼*/
??????????i=0;
??????ss=s;
????while(i<len)
??????{l=(long)((*s)*256+(*(s+1)));/*得到特征碼*/
??????fprintf(fp,"%u,",l);/*寫入特征碼*/
????????????????s+=2;i++;
???????? if(i%8==0&&i!=0){fprintf(fp,"\n");}?? /*格式*/
????????????????}
????????????????l=(long)(*(s+1))*256+(*s);????????????????fprintf(fp,"%u};\n\n",0);
???????????? fprintf(fp,"unsigned char hzk_wd[%d][32]={\n",len);/*定義漢字字模*/
????????????????
??????????????if((p=fopen("HZK16","rb"))==NULL)??/*打開16*16漢字庫*/
????????????????{printf("error not is <hzk16>"); getch();}
???? s=ss;
???? j=0;
??????while(1)
????????????????{ qu=(*s)-0xa0;wei=(*(s+1))-0xa0;
???????????????? l=(long)((qu-1)*94+wei-1);
??????????????????l=(long)(l*32);????/*得到位移量*/
??
????????????????????fseek(p,l,0);
????????????????????fprintf(fp,"{");
????????????????????for(i=0;i<32;++i) /*寫入漢字字模*/
???????????????? {c=fgetc(p);?????????? /*讀入一個字節*/
??????????????????????????fprintf(fp,"0x%x,",c);
??????????????????????if((i%7 )==0&&i!=0)fprintf(fp,"\n");}
??????????????????????????fprintf(fp,"},\n\n");
?????????????????????? j++;if(j>=len)break;
????????????????????s+=2;??/*移到下一個漢字*/
????????????????????}
????????????????????fprintf(fp,"\n};\n\n",c);
????fclose(fp);
????fclose(p);
?? }
----------------------------------------------------------------------------------------------------------------------
/*顯示漢字函數,S為輸入漢字串可有字符,x,y分別為顯示位置,color為顏色*/
/*要使用此函數,要包含hzk.h頭文件,且工作在圖形方式*/
?????? print(unsigned char *s,int x,int y,int color)
???????? {int i,j,k;
????????????int xx,yy;
???? long l;
???? char c[2];
???? unsigned char mark[]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};/*定義屏蔽碼*/
???? c[1]='\0';
???? while(*s)
??????{ if((*s)>160&&(*s)<255&&(*(s+1))>160&&(*(s+1))<255)/*判斷是否為漢字*/
??????????????????{l=(*s)*256+(*(s+1));??/*得到特征碼*/
??????????????????????i=0;j=0;
??????????????????while(hz[i]!=0)??/*檢索特征碼*/
?????????????????? {if(hz[i]==l)
?????????????????????????????????????????? {j=0;break;}
????????????????????????????????????????++i;}
???????????????????????????????? if(hz[i]!=0)?? /*判斷是否結束*/
???????????????????????????????????? { if(x>623){x=1;y+=18;}/*如果到行末,則換行*/
?????????????????????? yy=y;
??????????????????for(j=0;j<32;j+=2,yy++)????/*漢字字模的32個字節,加2是每次打印一行*/
?????????????????????? { for(k=0;k<8;k++)??????/*每個字節表示8個點*/
????????????{
????????????if((hzk_wd[i][j]&mark[k])!=0)/*判斷第一字節的第K位是否為0*/
?????????????? putpixel(x+k,yy,color);/*打印點*/
????????????????
??????????if((hzk_wd[i][j+1]&mark[k])!=0)/*(j+1)判斷第二字節的第K位是否為0*/
??????????putpixel(x+k+8,yy,color);
??????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????}
??????????????????????????????????????????????}
?????????????????????????????????????????? }
???????????????????????????????? s+=2;??x+=17;/*移向下一個字符:S加2---每個漢字2個字節*/
??????????????????????????????????????????????/*X加為列加,每個漢字十六列*/????????????
??????????????????????????????}
??????????????????else?????? /*否則為英文字符*/
????????????????????{c[0]=*s;
???????????????????? setcolor(color);
??????????????????????if(x>630){x=1;y+=18;}
??????????????????????outtextxy(x,y+4,c);/*打印字符*/
?????????????????????? s++;x+=9;/*移向下一個字符:S加1---每個字符1個字節*/
????????????????????????????????/*X加9--每個字符8列*/
??????????????????????}
?????????????????? }
??????????????}???