<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 設(shè)計應(yīng)用 > 點陣漢字顯示

          點陣漢字顯示

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

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

            如果使用中文DOS系統(tǒng)(如UCDOS),則可以解決在字符界面下的問題。也就是說,可以用printf或其他字符串函數(shù)來輸出漢字。

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

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

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

            HZK16文件是按照GB 2312-80標(biāo)準(zhǔn),也就是通常所說的國標(biāo)碼或區(qū)位碼的標(biāo)準(zhǔn)排列的。國標(biāo)碼分為 94 個區(qū)(Section),每個區(qū) 94 個位(Position),所以也稱為區(qū)位碼。其中01~09 區(qū)為符號、數(shù)字區(qū),16~87 區(qū)為漢字區(qū)。而 10~15 區(qū)、88~94 區(qū)是空白區(qū)域。

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

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

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


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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/83370.htm

          #include
          #include

          /* x,y為顯示坐標(biāo),s為顯示字符串,colour為顏色 */
          void hanzi16(int x,int y,char *s,int colour)
          {
           FILE *fp;
           char buffer[32];                   /* 32字節(jié)的字模緩沖區(qū) */
           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,"瘋狂甲蟲樂園!",BROWN);

           getch();
           closegraph();
          }



          關(guān)鍵詞: 漢字顯示 點陣 圖形界面 字模

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();