<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 設計應用 > 點(diǎn)陣漢字顯示

點(diǎn)陣漢字顯示

作者: 時(shí)間:2008-05-30 來(lái)源:老古開(kāi)發(fā)網(wǎng) 收藏

  由于Turbo C應用于DOS操作系統下,在使用Turbo C進(jìn)行程序設計時(shí),一般情況下只好使用英文進(jìn)行人機交互。要是想直接用中文界面,就需要另想他法了。

  如果使用中文DOS系統(如UCDOS),則可以解決在字符界面下的問(wèn)題。也就是說(shuō),可以用printf或其他字符串函數來(lái)輸出漢字。

  但是,這樣仍然有一些不方便。必須先啟動(dòng)中文DOS系統,再執行Turbo C或編譯好的程序。并且在中文版DOS下運行Tubor C時(shí),還可能出現一些問(wèn)題。而對于來(lái)說(shuō),這種辦法也行不通了。

  那么在下顯示漢字的問(wèn)題就迫切需要解決了。既然是只要把漢字當成一幅畫(huà),畫(huà)在顯示屏上不就可以了。關(guān)鍵在于如何取得漢字的圖形,也就是漢字的呢。其實(shí)那些中文版的DOS顯示漢字的方式也就是在圖形界面下畫(huà)出漢字的,它們已經(jīng)提供了現成的字庫文件。例如常用的16×16HZK16文件,12×12點(diǎn)陣HZK12文件等等,這些文件包括了GB 2312字符集中的所有漢字?,F在只要弄清漢字點(diǎn)陣在字庫文件中的格式,就可以按照自己的意愿去顯示漢字了。

  下面以HZK16文件為例,分析取得漢字的方法。

  HZK16文件是按照GB 2312-80標準,也就是通常所說(shuō)的國標碼或區位碼的標準排列的。國標碼分為 94 個(gè)區(Section),每個(gè)區 94 個(gè)位(Position),所以也稱(chēng)為區位碼。其中01~09 區為符號、數字區,16~87 區為漢字區。而 10~15 區、88~94 區是空白區域。

  如何取得漢字的區位碼呢?在計算機處理漢字和ASCII字符時(shí),使每個(gè)ASCII字符占用1個(gè)字節,而一個(gè)漢字占用兩個(gè)字節,其值稱(chēng)為漢字的內碼。其中第一個(gè)字節的值為區號加上32(20H),第二個(gè)字節的值為位號加上32(20H)。為了與ASCII字符區別開(kāi),表示漢字的兩個(gè)字節的最高位都是1,也就是兩個(gè)字節的值都又加上了128(80H)。這樣,通過(guò)漢字的內碼,就可以計算出漢字的區位碼。

  具體算式如下:
  qh=c1-32-128=c1-160    wh=c2-32-128=c2-160
  或   
  qh=c1-0xa0    wh=c2-0xa0
  qh,wh為漢字的區號和位號,c1,c2為漢字的第一字節和第二字節。
  根據區號和位號可以得到漢字在文件中的位置:
  location=(94*(qh-1)+(wh-1))*一個(gè)點(diǎn)陣字模的字節數。
  那么一個(gè)點(diǎn)陣字模究竟占用多少字節數呢?我們來(lái)分析一下漢字字模的具體排列方式。

  例如下圖中顯示的“漢”字,使用16×16點(diǎn)陣。字模中每一點(diǎn)使用一個(gè)二進(jìn)制位(Bit)表示,如果是1,則說(shuō)明此處有點(diǎn),若是0,則說(shuō)明沒(méi)有。這樣,一個(gè)16×16點(diǎn)陣的漢字總共需要16*16/8=32個(gè)字節表示。字模的表示順序為:先從左到右,再從上到下,也就是先畫(huà)左上方的8個(gè)點(diǎn),再是右上方的8個(gè)點(diǎn),然后是第二行左邊8個(gè)點(diǎn),右邊8個(gè)點(diǎn),依此類(lèi)推,畫(huà)滿(mǎn)16×16個(gè)點(diǎn)。  


 
  對于其它點(diǎn)陣字庫文件,則也是使用類(lèi)似的方法進(jìn)行顯示。例如HZK12,但是HZK12文件的格式有些特別,如果你將它的字模當作12*12位計算的話(huà),根本無(wú)法正常顯示漢字。因為字庫設計者為了使用的方便,字模每行的位數均補齊為8的整數倍,于是實(shí)際該字庫的位長(cháng)度是16*12,每個(gè)字模大小為24字節,雖然每行都多出了4位,但這4位都是0(不顯示),并不影響顯示效果。 還有UCDOS下的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體)這些打印字庫文件,每個(gè)字模占用24*24/8=72字節,不過(guò)這類(lèi)大字模漢字庫為了打印的方便,將字模都放倒了,所以在顯示時(shí)要注意把橫縱方向顛倒過(guò)來(lái)就可以了。

  這樣我們就完全清楚了如何得到漢字的點(diǎn)陣字模,這樣就可以在程序中隨意的顯示漢字了。

  如果在程序中使用的漢字數目不多,也可以不必總是在程序里帶上幾百K的字庫文件,也許你的程序才只有幾十K。這樣可以事先將所需要顯示的漢字字模提取出來(lái),放在另一個(gè)文件里,按照自己的順序讀取文件就可以了。

  下面的程序說(shuō)明了具體顯示漢字的方法,以16×16漢字為例,使用HZK16文件。

本文引用地址:http://dyxdggzs.com/article/83370.htm

#include
#include

/* x,y為顯示坐標,s為顯示字符串,colour為顏色 */
void hanzi16(int x,int y,char *s,int colour)
{
 FILE *fp;
 char buffer[32];                   /* 32字節的字模緩沖區 */
 register i,j,k;
 unsigned char qh,wh;
 unsigned long location;
 if((fp=fopen("hzk16","rb"))==NULL)
  {
   printf("Cant open hzk16!");
   getch();
   exit(0);
  }
 while(*s)
  {
   qh=*s-0xa0;
   wh=*(s+1)-0xa0;
   location=(94*(qh-1)+(wh-1))*32L;    /* 計算漢字字模在文件中的位置 */
   fseek(fp,location,SEEK_SET);
   fread(buffer,32,1,fp);
   for(i=0;i<16;i++)
    for(j=0;j<2;j++)
     for(k=0;k<8;k++)
      if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
       putpixel(x+8*j+k,y+i,colour);
   s+=2;
   x+=16;                              /* 漢字間距 */
  }
 fclose(fp);
}

main()
{
 int gd=DETECT,gm;
 initgraph(&gd,&gm,"");

 hanzi16(246,200,"瘋狂甲蟲(chóng)樂(lè )園!",BROWN);

 getch();
 closegraph();
}



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>