- 相關推薦
不依賴高點陣字庫實現屏幕漢字顯示
在設計軟件封面或菜單標題時,常需用到放大的漢字顯示。通常采用的方法是一邊從高點陣字庫中讀取漢字的字形碼,一邊加以變換在圖形方式下繪點;但高點陣字庫占有較大存儲空間,例如 :2.13漢字系統中四種字體(宋、仿宋、黑、楷)的40X40點陣字庫共占用近5M字節的硬盤空間。一般漢字操作系統中的漢字顯示都采用16X16點陣字庫(僅占約260K字節);
而由于硬盤空間的限制,并不是每臺微機上都裝有高點陣字庫。
如何使漢字放大顯示程序不依賴高點陣字庫而獨立運行?本文提供一種方法,將需要放大顯示的漢字串的字形碼一次性從2.13I高點陣字庫(40X40點陣)讀入一個SUBHZK文件,以后每次顯示放大漢字時只需從該文件讀取字模信息,而SUBHZK比高點陣字庫要小的多。這樣,漢字顯示程序運行時就徹底擺脫了高點陣字庫(只需打開文件SUBHZK),可在西文方式或任何中文方式下運行。
程序采用Turbo C2.0編寫,漢字放大顯示程序DISPHZ運行時只需將SUBHZK和相應顯示器的圖形驅動程序(如CGA.BGI、EGAVGA.BGI)隨DISPHZ.EXE放在同一目錄下即可。
須注意的是,40X40點陣字模(字形碼)實際上由40×36點陣組成,其漢字字形碼排列格式為
@@T5S06100.GIF;圖1@@
程序清單:
/*程序READGHZ.C:將需放大顯示的漢字串的字形碼從2.13系統40X40點陣字庫讀入
文件SUBHZK*/
#include
#include
int openhzk40(int);
FILE *fp,*fptr; /*定義全局文件指針*/
char *hzk-table[]={"c:\\213\\hzk40s","c:\\231\\hzk40f",
"c:\\213\\hzk40h","c:\\213\hzk40k"};
main()
{
unsigned char *string="管理信息系統";
/*需放大的漢字串*/
unsigned char inter-code ,zone-code,bit-code;
int locate,hzk-num,flag=0
char *p,dot-arrays[180];
if((fptr=fopen("subhzk","wb"))==NULL){
printf("Cannot open file\n");
exit(1);
} /*打開或創建文件SUBHZK */
openhzk40(1);
p=string;
while(*p)
{
inter-code=*p++;
if(inter-code>0xal)
if(flag==0)
{
zone-code=(inter-code-0xa0)&0x7f;/*漢字區碼*/
flag=1;
}
eles
{
bit-code=(inter-code-0xa0)&0x7f;
/*漢字位碼*/
flag=0;
locate=(zone-code-0x10)*94+bit-code-1;
/*漢字字模地址*/
fseek(fp,locate*180L,SEEK-SET);
/*置文件指針于漢字字模地址*/
fread(dot-arrays,sizeof(dot-arrays),1,fp);
/*讀漢字字模于數組中*/
fwrite(dot-arrays,sizeof(dot-arrays),1,fptr);
/*寫漢字字模到文件*/
}
}
fclose(fp);
fclose(fptr);
return 0;
}
int openhzk40(int hzk-num)
/*打開2.13系統40X40點陣字庫文件*/
{
if((fp=fopen(hzk-table[hzk-num],"rb"))==NULL)
{
cputs("Error on open file");
getch();
exit(1);
}
return 0;
}
/*程序DISPHZ.C:從文件SUBHZK中讀取漢字
字形碼信息并放大顯示*/
#include
#include
#include
#define RED 4
#define grOK 0
#define STRLEN 6
/*要顯示的漢字串所含漢字個數*/
int writehz (int,int,int,int,int,int);
void init-graph();
void far restorecr tmode();
FILE *fp;
main ()
{
init-graph(); /*初始化圖形模式*/
if((fp=fopen("subhzk","rb"))==NULL){
printf("Cannot open file/n");
exit(1);
}
writehz(30,30,10,2,2,RED);
fclose(fp);
getch();
restorecr tmode();
return 0;
}
void init-graph()
{
int gdriver=DETECT,gmode,errorcode;
initgraph(&gdriver,&gmode,"");
errorcode=graphresult();
if(errorcode!=grOK)
{
printf("Graphics error:%s\n",grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit();
}
}
/*漢字字模讀取與放大顯示*/
int writehz(int x,int y,int z,int x-zoom,int y-zoom,int color)
{
int i,j,k,n;
char dot-arrays[180]; /*定義180字節數組,暫存漢字字模*/
for(n=0;n{
fread(dot-arrays,sizeof(dot-arrays),1,fp);
for(i=0;i<36;i++) /*繪漢字上排(1至72字節所含點陣)*/
for(j=0,j<2;j++)
for(k=0;k<8,k++)
if((dot-arrays[i*2+j]>>(7-k))&1)
putpixel(x-zoom*(x+i),y-zoom*(y+j*8+k),color);
for(i=0;i<36;i++) /*繪漢字下排(73至180字節所含點陣);*/
for(j=0,j<3;j++)
for(k=0,k<8,k++)
if((dot-arrays[72+i*3+j]>>(7-k))&1)
putpixel(x-zoom*(x+i),y-zoom*(y+16+j*8+k),color);
x=x+36+z; /*移位,準備繪下一漢字*/
}
return 0;
}
【不依賴高點陣字庫實現屏幕漢字顯示】相關文章:
都市頻道制作網的設計與實現05-29
基于minigui的網真機界面的實現08-05
城市旅游網站的設計與實現論文(精選6篇)05-07
企業知識管理的實現技術和工具的電商論文05-02
企業法律風險防范體系建立的原因及實現路徑08-06
如何通過內部控制實現企業持續性發展05-21
利用電力線實現住宅智能化06-13
構筑企業數據中心 實現理性分析決策06-04