谁能解释一下汉字字模的作用是什么 ???
2个回答
展开全部
b4,b1,b0 =字库A在位平面2 中的区号b5,b3,b2 =字库B在位平面2 中的区号*/EGA b4,b5没用AX=1103h如:BL的b4,b1,b0=1,1,1 则表示字库A将选择7号区的字库。此时,属性字节的B3位用于选择使用到的字符集(A或B,为1是使用字符集A)。若只激活一种字符集(A、B的值相同),属性字节的b3位可用作选择字符的高亮度。现在,若我们将西文字符字库放置于平面2的n区号,中文字符字库放置于平面2的m区号(m<>n),便可以圆满在西文文本方式下显示中西混合字串,而且互不干涉。这种汉字显示的方式的优点就是显示速度很快,缺点就是能显示的汉字太少,在这里我不建议大家使用!相关的程序请在本论坛找qb45写的帖子!三,图形模式下显示汉字 既然是图形界面,只要把汉字当成一幅画,画在显示屏上不就可以了。关键在于如何取得汉字的图形,在这里汉字图形有两种格式,一个是点阵,一个是矢量,一个16*16的点阵字模是记载的16*16的点阵数据。而矢量字库记载的是公式,一个字比如横撇的都是用公式来描述,这样可以很方便的进行无及缩放,这里我主要讲讲点阵字库,因为矢量字库我也没有弄过!那些中文版的DOS显示汉字的方式也就是在图形界面下画出汉字的,它们实际已经提供了现成的点阵字库文件。例如常用的16×16点阵HZK16文件,12×12点阵HZK12文件等等,这些文件包括了GB2312字符集中的所有汉字。现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。 下面以HZK16文件为例,分析取得汉字字模的方法。 HZK16文件是按照GB 2312-80标准,也就是通常所说的国标码或区位码的标准排列的。国标码分为 94个区(Section),每个区 94 个位(Position),所以也称为区位码。其中01~09 区为符号、数字区,16~87 区为汉字区。而10~15 区、88~94 区是空白区域。 如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。 具体算式如下: 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))*一个点阵字模的字节数。 那么一个点阵字模究竟占用多少字节数呢?我们来分析一下汉字字模的具体排列方式。 例如要显示的“汉”字,使用16×16点阵。字模中每一点使用一个二进制位(Bit)表示,如果是1,则说明此处有点,若是0,则说明没有。这样,一个16×16点阵的汉字总共需要16*16/8=32个字节表示。字模的表示顺序为:先从左到右,再从上到下,也就是先画左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,依此类推,画满16×16个点。 4、提取汉字的字模显示汉字是把从文件提取的字模画出来,而需要字模就是把提取的数据输出到文件! 对于其它点阵字库文件,则也是使用类似的方法进行显示。例如HZK12,但是HZK12文件的格式有些特别,如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字模每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,每个字模大小为24字节,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。还有UCDOS下的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体)这些打印字库文件,每个字模占用24*24/8=72字节,不过这类大字模汉字库为了打印的方便,将字模都放倒了,所以在显示时要注意把横纵方向颠倒过来就可以了。 这样我们就完全清楚了如何得到汉字的点阵字模,这样就可以在程序中随意的显示汉字了。 在编程中,汉字的的显示速度的瓶径主要在读取字模和画图语句的效率方面,由于汉字字摸是以文件的方式保存在磁盘上的,那么每次读一个字都会在磁盘上操作,极大的降低了汉字的显示速度!在你程序中使用的汉字数目不多,也可以不必总是在程序里带上几百K的字库文件,也许你的程序才只有几十K。这样可以事先将所需要显示的汉字字模提取出来,一次读入内存,这样速度就能得到极大的提高,当然如果你要用到所有的汉字这个方法就不行了,不过,你可以象UCDOS那样,把字模放到EMS高端内存中,从内存中读总是比磁盘上快几个数量级!在画图语句上,可以自己写,不用语言带的那个画图语句,直接写显存的速度是最快的!详细的自己研究!
OPEN "hzk16" FOR BINARY AS #1IF LOF(1) = 0 THEN PRINT "没有汉字库! ":ENDSCREEN 12hz1$ = "汉字显示的演示"hz 1, 100, hz1$, 11SUB hz (x0, y0, hz.word$, hzcol)REM 显示汉字的子程序savex0 = x0: savey0 = y0FOR now = 1 TO LEN(hz.word$)qu = ASC(MID$(hz.word$, now, 1))IF qu >= 161 THENnow = now + 1IF now > LEN(hz.word$) THEN EXIT FORwei = ASC(MID$(hz.word$, now, 1))ps& = ((qu - 161) * 94& + wei - 161) * 32& + 1SEEK #1, ps&zimo$ = INPUT$(32, 1)num = 1FOR y = 0 TO 15chr1$ = MID$(zimo$, num, 1)num = num + 1chr2$ = MID$(zimo$, num, 1)num = num + 1chr3$ = chr2$ + chr1$LINE (x0, y0 + y)-STEP(15, 0), hzcol, , CVI(chr3$)NEXT yx0 = x0 + 16ELSESEEK #2, qu * 16zimo$ = INPUT$(16, 2)FOR y = 1 TO 16zmchr$ = CHR$(0) + MID$(zimo$, y, 1)LINE (x0, y0 + y)-STEP(15, 0), hzcol, , CVI(zmchr$)NEXT yx0 = x0 + 8END IFNEXT nowx0 = savex0: y0 = savey0END SUB
OPEN "hzk16" FOR BINARY AS #1IF LOF(1) = 0 THEN PRINT "没有汉字库! ":ENDSCREEN 12hz1$ = "汉字显示的演示"hz 1, 100, hz1$, 11SUB hz (x0, y0, hz.word$, hzcol)REM 显示汉字的子程序savex0 = x0: savey0 = y0FOR now = 1 TO LEN(hz.word$)qu = ASC(MID$(hz.word$, now, 1))IF qu >= 161 THENnow = now + 1IF now > LEN(hz.word$) THEN EXIT FORwei = ASC(MID$(hz.word$, now, 1))ps& = ((qu - 161) * 94& + wei - 161) * 32& + 1SEEK #1, ps&zimo$ = INPUT$(32, 1)num = 1FOR y = 0 TO 15chr1$ = MID$(zimo$, num, 1)num = num + 1chr2$ = MID$(zimo$, num, 1)num = num + 1chr3$ = chr2$ + chr1$LINE (x0, y0 + y)-STEP(15, 0), hzcol, , CVI(chr3$)NEXT yx0 = x0 + 16ELSESEEK #2, qu * 16zimo$ = INPUT$(16, 2)FOR y = 1 TO 16zmchr$ = CHR$(0) + MID$(zimo$, y, 1)LINE (x0, y0 + y)-STEP(15, 0), hzcol, , CVI(zmchr$)NEXT yx0 = x0 + 8END IFNEXT nowx0 = savex0: y0 = savey0END SUB
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询