?? 點陣漢字顯示.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://www.8623.com/article/hanzishow.htm -->
<HTML><HEAD><TITLE>點陣漢字顯示</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1400" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY text=#00ff00 bgColor=#000000>
<DIV align=center>
<TABLE width=640 border=0>
<TBODY>
<TR>
<TD>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD>
<P align=center><FONT face=楷體_GB2312 color=#ffff00
size=7><B>點陣漢字顯示</B></FONT></P></TD></TR>
<CENTER>
<TR>
<TD>
<P align=center><FONT color=#00ffff size=2>Little
Tiger Nov 16,2003</FONT></P></TD></TR></CENTER>
<TR>
<TD></TD></TR>
<TR>
<TD>
<P align=center><FONT size=3><A
href="http://www.8623.com/pro/hanzi.rar">點擊下載示例程序</A></FONT></P></TD></TR>
<TR>
<TD></TD></TR>
<TR>
<TD><FONT size=3> 由于Turbo C應用于DOS操作系統下,在使用Turbo
C進行程序設計時,一般情況下只好使用英文進行人機交互。要是想直接用中文界面,就需要另想他法了。<BR> 如果使用中文DOS系統(如UCDOS),則可以解決在字符界面下的漢字顯示問題。也就是說,可以用printf或其他字符串函數來輸出漢字。<BR> 但是,這樣仍然有一些不方便。必須先啟動中文DOS系統,再執行Turbo
C或編譯好的程序。并且在中文版DOS下運行Tubor
C時,還可能出現一些問題。而對于圖形界面來說,這種辦法也行不通了。<BR> 那么在圖形界面下顯示漢字的問題就迫切需要解決了。既然是圖形界面,只要把漢字當成一幅畫,畫在顯示屏上不就可以了。關鍵在于如何取得漢字的圖形,也就是漢字的點陣字模呢。其實那些中文版的DOS顯示漢字的方式也就是在圖形界面下畫出漢字的,它們已經提供了現成的點陣字庫文件。例如常用的16×16點陣HZK16文件,12×12點陣HZK12文件等等,這些文件包括了GB
2312字符集中的所有漢字?,F在只要弄清漢字點陣在字庫文件中的格式,就可以按照自己的意愿去顯示漢字了。<BR> 下面以HZK16文件為例,分析取得漢字字模的方法。<BR> HZK16文件是按照GB
2312-80標準,也就是通常所說的國標碼或區位碼的標準排列的。國標碼分為 94 個區(Section),每個區 94
個位(Position),所以也稱為區位碼。其中01~09 區為符號、數字區,16~87 區為漢字區。而 10~15 區、88~94
區是空白區域。<BR> 如何取得漢字的區位碼呢?在計算機處理漢字和ASCII字符時,使每個ASCII字符占用1個字節,而一個漢字占用兩個字節,其值稱為漢字的內碼。其中第一個字節的值為區號加上32(20H),第二個字節的值為位號加上32(20H)。為了與ASCII字符區別開,表示漢字的兩個字節的最高位都是1,也就是兩個字節的值都又加上了128(80H)。這樣,通過漢字的內碼,就可以計算出漢字的區位碼。<BR> 具體算式如下:<BR> qh=c1-32-128=c1-160
wh=c2-32-128=c2-160<BR> 或</FONT> <BR><FONT
size=3> qh=c1-0xa0
wh=c2-0xa0<BR> qh,wh為漢字的區號和位號,c1,c2為漢字的第一字節和第二字節。<BR> 根據區號和位號可以得到漢字字模在文件中的位置:<BR> location=(94*(qh-1)+(wh-1))*一個點陣字模的字節數。<BR> 那么一個點陣字模究竟占用多少字節數呢?我們來分析一下漢字字模的具體排列方式。<BR> 例如下圖中顯示的“漢”字,使用16×16點陣。字模中每一點使用一個二進制位(Bit)表示,如果是1,則說明此處有點,若是0,則說明沒有。這樣,一個16×16點陣的漢字總共需要16*16/8=32個字節表示。字模的表示順序為:先從左到右,再從上到下,也就是先畫左上方的8個點,再是右上方的8個點,然后是第二行左邊8個點,右邊8個點,依此類推,畫滿16×16個點。</FONT>
</TD></TR>
<TR>
<TD>
<P align=center><IMG height=129 src="點陣漢字顯示.files/han.gif" width=129
border=0> </P></TD></TR>
<TR>
<TD>
<P
align=left> 對于其它點陣字庫文件,則也是使用類似的方法進行顯示。例如HZK12,但是HZK12文件的格式有些特別,如果你將它的字模當作12*12位計算的話,根本無法正常顯示漢字。因為字庫設計者為了使用的方便,字模每行的位數均補齊為8的整數倍,于是實際該字庫的位長度是16*12,每個字模大小為24字節,雖然每行都多出了4位,但這4位都是0(不顯示),并不影響顯示效果。
還有UCDOS下的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體)這些打印字庫文件,每個字模占用24*24/8=72字節,不過這類大字模漢字庫為了打印的方便,將字模都放倒了,所以在顯示時要注意把橫縱方向顛倒過來就可以了。<BR> 這樣我們就完全清楚了如何得到漢字的點陣字模,這樣就可以在程序中隨意的顯示漢字了。<BR> 如果在程序中使用的漢字數目不多,也可以不必總是在程序里帶上幾百K的字庫文件,也許你的程序才只有幾十K。這樣可以事先將所需要顯示的漢字字模提取出來,放在另一個文件里,按照自己的順序讀取文件就可以了。<BR> 下面的程序說明了具體顯示漢字的方法,以16×16漢字為例,使用HZK16文件。<BR><BR>#include<stdio.h><BR>#include<graphics.h><BR><BR>/*
x,y為顯示坐標,s為顯示字符串,colour為顏色 */<BR>void hanzi16(int x,int y,char
*s,int colour)<BR>{<BR> FILE *fp;<BR> char
buffer[32];
/* 32字節的字模緩沖區 */<BR> register i,j,k;<BR> unsigned char
qh,wh;<BR> unsigned long
location;<BR> if((fp=fopen("hzk16","rb"))==NULL)<BR>
{<BR> printf("Can't open hzk16!");<BR>
getch();<BR> exit(0);<BR>
}<BR> while(*s)<BR> {<BR>
qh=*s-0xa0;<BR> wh=*(s+1)-0xa0;<BR>
location=(94*(qh-1)+(wh-1))*32L; /* 計算漢字字模在文件中的位置
*/<BR> fseek(fp,location,SEEK_SET);<BR>
fread(buffer,32,1,fp);<BR>
for(i=0;i<16;i++)<BR>
for(j=0;j<2;j++)<BR>
for(k=0;k<8;k++)<BR>
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)<BR>
putpixel(x+8*j+k,y+i,colour);<BR> s+=2;<BR>
x+=16;
/* 漢字間距 */<BR>
}<BR> fclose(fp);<BR>}<BR><BR>main()<BR>{<BR> int
gd=DETECT,gm;<BR> initgraph(&gd,&gm,"");<BR><BR> hanzi16(246,200,"瘋狂甲蟲樂園!",BROWN);<BR><BR> getch();<BR> closegraph();<BR>}<BR></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -