标题: 显示汉字的源程序
[打印本页]
作者: qb45
时间: 2003-9-23 00:00
标题: 显示汉字的源程序
本程序需要UCDOS的汉字库,文件名:HZK16
如果要在自己的程序中使用,可以提取部分字模在程序中使用!
以下是程序代码:
OPEN "asc16" FOR BINARY AS #2
OPEN "hzk16" FOR BINARY AS #1
IF LOF(1) = 0 THEN PRINT "没有汉字库! ":END
SCREEN 12
hz1$ = "微软专用操作系统安装工具"
hz 1, 100, hz1$, 11
SUB hz (x0, y0, hz.word$, hzcol)
REM 显示汉字的子程序
savex0 = x0: savey0 = y0
FOR now = 1 TO LEN(hz.word$)
qu = ASC(MID$(hz.word$, now, 1))
IF qu >= 161 THEN
now = now + 1
IF now > LEN(hz.word$) THEN EXIT FOR
wei = ASC(MID$(hz.word$, now, 1))
ps& = ((qu - 161) * 94& + wei - 161) * 32& + 1
SEEK #1, ps&
zimo$ = INPUT$(32, 1)
num = 1
FOR y = 0 TO 15
chr1$ = MID$(zimo$, num, 1)
num = num + 1
chr2$ = MID$(zimo$, num, 1)
num = num + 1
chr3$ = chr2$ + chr1$
LINE (x0, y0 + y)-STEP(15, 0), hzcol, , CVI(chr3$)
NEXT y
x0 = x0 + 16
ELSE
SEEK #2, qu * 16
zimo$ = INPUT$(16, 2)
FOR y = 1 TO 16
zmchr$ = CHR$(0) + MID$(zimo$, y, 1)
LINE (x0, y0 + y)-STEP(15, 0), hzcol, , CVI(zmchr$)
NEXT y
x0 = x0 + 8
END IF
NEXT now
x0 = savex0: y0 = savey0
END SUB
作者: QB45
时间: 2003-9-30 00:00
UCDOS 的HZK16字库是一个16*16的点阵,每个字模32个字节,如果把他化成二进制排成16行,你会看到一个汉字的雏形。
算了,不写了。。。。。。。。。。。。。搞原创真累!!!!!!!!!!
又没人回铁
!
作者: pfox
时间: 2003-9-30 00:00
以下是引用QB45在2003-9-30 0:42:59的发言:
UCDOS 的HZK16字库是一个16*16的点阵,每个字模32个字节,如果把他化成二进制排成16行,你会看到一个汉字的雏形。
算了,不写了。。。。。。。。。。。。。搞原创真累!!!!!!!!!!
又没人回铁
!
简体字库有部分是16*15的点阵字库,能否制作一个提取16*15点阵字库的16进制点阵信息的程序?最好能够提供16进制及2进制两种提取方法。
作者: lemonhall
时间: 2003-10-2 00:00
支持原创,可是这些源程序在DOS下都有源程序代码,而且
QB45啊,我明白你喜欢BASIC的心情。但是,将很多C源码
翻译成QB码好象有些。。。。。。
毕竟用QB45直接去显示汉字是超超超慢的。。。。。
特别是在我的4M486上跑你的程序。
这些低级的调用还是建议写C代码,改进原来代码的可移植性
和可靠性,封装成LIB或者使用C++增加它的复用性都是不错
的方向。
作者: lemonhall
时间: 2003-10-2 00:00
另外表示支持的是:
好象你写的这些程序是可以用来开发安装程序的,对吧?
如果真的那么喜欢QB45也无妨,毕竟今天像我还使用486的人不多了。
那么请在源程序上加些注释吧,将函数封装起来,写上INCLUDE文件,
以后当你没有耐心再开发这个安装系统的时候,其他人可以轻松接手啊!
另外的一个建议就是,尽早使用RCS类似的版本控制工具,为明天的工作
打下基础。加油啊!!!!!!!!!!!!!!!!!!!!!!!!!
作者: cn_archer
时间: 2003-10-2 00:00
支持支持!老兄如果有原创发表,偶一定回帖。:)
作者: iceboy
时间: 2003-10-3 00:00
标题: 我把它简单地封装了一下...
我把它简单地封装了一下,加入了自动换行,自动改变当前 POS... 可以和 PRINT 语句混用而不会导致字符重叠... 语句名称 PRINTH,直接调用,不过不能用分号...
文件为 QBASIC 程序,扩展名是 BAS,不过是两个 SUB
调用语法:
PRINTH "要输入的汉字"
打开附件
作者: lemonhall
时间: 2003-10-4 00:00
支持,如果是安装用的PRINTH,,如果能有几个常用的
颜色宏定义,那么就可以进入单元测试了,最后封成LIB,
供所有BASIC开发者使用(不清楚UCDOS的DK里有没有现成的??)
作者: QB45
时间: 2003-10-8 00:00
以下是引用lemonhall在2003-10-2 18:17:46的发言:
支持原创,可是这些源程序在DOS下都有源程序代码,而且
QB45啊,我明白你喜欢BASIC的心情。但是,将很多C源码
翻译成QB码好象有些。。。。。。
C语言我根本不会啊,不过我很想学阿。我只会BASIC。
在486的电脑上要提高显示速度可以采取一些技术手段,如:直接写显存,或者将字模读入内存,加载磁盘缓冲。
作者: xy_god
时间: 2003-10-8 00:00
我以前看过一个QB的显示汉字的程序的,不过我还是希望QB45赶快学会C,不用多长时间的
,我就是从QB转向C的,但是最重要的是明白微机原理,其实我觉得明白微机原理后,用BASIC开发操作系统也是可行的,呵呵!真的,不是危言耸听哦!
作者: QB45
时间: 2003-10-13 00:00
以下是引用pfox在2003-9-30 10:01:51的发言:
简体字库有部分是16*15的点阵字库,能否制作一个提取16*15点阵字库的16进制点阵信息的程序?最好能够提供16进制及2进制两种提取方法。
我这里没有16*15的点阵字库,有的话,我可以试试,你能提供这个字库吗??
作者: pfox
时间: 2003-10-14 00:00
以下是引用QB45在2003-10-13 19:22:14的发言:
我这里没有16*15的点阵字库,有的话,我可以试试,你能提供这个字库吗??
打开附件打开附件
这个就是16*15的点阵字库,麻烦你试一试。
作者: QB45
时间: 2003-10-14 00:00
pfox, 你发的字库文件我已经分析过了,源程序如下所示,实际上这不是一个16*15 的点阵字库,而是14*14的点阵字库。由于你的误导,让我走了不少弯路!不知你从那里弄来的这个字库文件!他的顺序是按偏旁部首排列的!
下面是源程序
input "请输入16*15点阵字库的完整的路径与文件名_ ",file$
OPEN file$ FOR BINARY AS #1
SCREEN 12
FOR i1 = 0 TO 28
x0 = 0
FOR i = 1 TO 42
SEEK #1, 24709 + (i + i1 * 42) * 28
zimo$ = INPUT$(28, 1)
num = 1
y0 = i1 * 16
FOR y = 0 TO 13
chr1$ = MID$(zimo$, num, 1)
num = num + 1
chr2$ = MID$(zimo$, num, 1)
num = num + 1
chr3$ = chr2$ + chr1$
LINE (x0, y0 + y)-STEP(14, 0), 7, , CVI(chr3$)
NEXT y
x0 = x0 + 15
NEXT i
NEXT i1
close
end
作者: Roy
时间: 2003-10-14 00:00
以下是引用QB45在2003-10-13 19:22:14的发言:
我这里没有16*15的点阵字库,有的话,我可以试试,你能提供这个字库吗??
這個是et3中文系統的16*15(還是14*14呢?...)的点阵字库
打开附件
作者: Roy
时间: 2003-10-14 00:00
這個是震漢中文系統的16*15字型
打开附件
這個是錄進中文系統的16*16字型
打开附件
作者: pfox
时间: 2003-10-14 00:00
以下是引用QB45在2003-10-14 19:13:07的发言:
pfox, 你发的字库文件我已经分析过了,源程序如下所示,实际上这不是一个16*15 的点阵字库,而是14*14的点阵字库。由于你的误导,让我走了不少弯路!不知你从那里弄来的这个字库文件!他的顺序是按偏旁部首排列的!
谢谢你。在是台湾国乔的一个字库。
作者: QB45
时间: 2003-10-14 00:00
你发的et3中文系統的16*15(還是14*14呢?...)的点阵字库文件
我已经分析过了,源程序如下所示,实际上这不是一个16*15 的点阵字库,而是15*15的点阵字库。不知你从那里弄来的这个字库文件!字库的顺序与Pfox发的点阵字库文件一样是按偏旁部首排列的,不过Pfox发的点阵字库文件里面包含拼音、数学等特殊符号而你的这个没有!源程序与上面一个差不多,你的另外的两个字库我没有分析,估计也是差不多的,你自己把我的这个源程序改写一下分析分析试试看吧!
下面是源程序
input "请输入16*15点阵字库的完整的路径与文件名_ ",file$
OPEN file$ FOR BINARY AS #1
SCREEN 12
FOR i1 = 0 TO 30
x0 = 0
FOR i = 1 TO 42
SEEK #1, (i - 1 + i1 * 42) * 30 + 1
zimo$ = INPUT$(30, 1)
num = 1
y0 = i1 * 15
FOR y = 0 TO 14
chr1$ = MID$(zimo$, num, 1)
num = num + 1
chr2$ = MID$(zimo$, num, 1)
num = num + 1
chr3$ = chr2$ + chr1$
LINE (x0, y0 + y)-STEP(14, 0), 7, , CVI(chr3$)
NEXT y
x0 = x0 + 15
NEXT i
NEXT i1
end
作者: Roy
时间: 2003-10-15 00:00
以下是引用QB45在2003-10-14 21:38:15的发言:
你发的et3中文系統的16*15(還是14*14呢?...)的点阵字库文件
我已经分析过了,源程序如下所示,实际上这不是一个16*15 的点阵字库,而是15*15的点阵字库。不知你从那里弄来的这个字库文件!字库的顺序与Pfox发的点阵字库文件一样是按偏旁部首排列的,不过Pfox发的点阵字库文件里面包含拼音、数学等特殊符号而你的这个没有!源程序与上面一个差不多,你的另外的两个字库我没有分析,估计也是差不多的,你自己把我的这个源程序改写一下分析分析试试看吧!
下面是源程序
input "请输入16*15点阵字库的完整的路径与文件名_ ",file$
OPEN file$ FOR BINARY AS #1
SCREEN 12
FOR i1 = 0 TO 30
x0 = 0
FOR i = 1 TO 42
SEEK #1, (i - 1 + i1 * 42) * 30 + 1
zimo$ = INPUT$(30, 1)
num = 1
y0 = i1 * 15
FOR y = 0 TO 14
chr1$ = MID$(zimo$, num, 1)
num = num + 1
chr2$ = MID$(zimo$, num, 1)
num = num + 1
chr3$ = chr2$ + chr1$
LINE (x0, y0 + y)-STEP(14, 0), 7, , CVI(chr3$)
NEXT y
x0 = x0 + 15
NEXT i
NEXT i1
end
這個是震漢的字型...好像真的是16*15呢...

這個是錄進的16*16字型...可以用16*16.bas再顯示字形.....可是不對字...

作者: QB45
时间: 2003-10-15 00:00
你说的:“這個是震漢的字型...好像真的是16*15呢...”
如果你用的是我上面的那个程序没作改动的话,应该是15*15的点阵而不是16*15的点阵字库,因为16*15无需单独做一个字库,除非是游戏字库!在读取16*16的点阵字库的BAS程序中改一下算法少划一条线,不就是16*15的汉字了吗?当然说说容易!但是关键是要判断那条线对汉字的影响不大,从而去掉它!可以用判断大小的方式!你试试看阿!
请问,你怎么对这个东西有兴趣阿?
作者: sunny1979
时间: 2003-10-16 00:00
支持你!写的不错。只是好象这些汉字显示复杂了点,可以直接调用字库中的字象HZK16、HZK24打印模式,好象比这简单一些!我这样认为,也许各有所见吧!
作者: QB45
时间: 2003-10-16 00:00
一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕.
在 UCDOS 的点阵字库 HZK16 中,字符点阵是按照汉字内码排列的,汉字的内码从一些图形字符开始,起始编码为 A1A1H,汉字内码第一位为区码,每区为 94 个汉字,第二位为每区内的编码,每个汉字的点阵为 16点*16点 共32字节,数据按第一行 1-8点,9-16点,第二行 1-8点,9-16点...排列,每位数据 1 为要显示点,0 为不显示点。所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以16*16点阵字库为例,通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一2*16数组再用for循环一位位地显示.
而Roy和Pfox两位网友提供的字库是不能用这个计算公式来计算的,所以显示与你期望的结果不相符,要解决这个问题,就要知道它是怎么得到要显示汉字在字库中的位置的,我想应该有一份字库索引表这样的一个文件,你们找找看!如果没有就应该找找看台湾的汉字库结构是不是有自己的排列方式!
作者: 凌晨一点
时间: 2003-10-25 00:00
呵呵,早在70年代BASIC可风光呢,当时的一些小机器(非PC机,长的挺象90年代的小霸的那种)的操作系统就有用BASIC写的。许多应用程序譬如Lotus报表处理程序的“草稿”就是用它实现的。大名鼎鼎的暴雪创始人在那时就是靠BASIC给一些电脑公司写小游戏赚大学生活费的。直到现在,BASIC都是使用者最多的语言之一,没别的,就因为它简单,好上手,且功能不弱。
当然,我也不是叫你抱住它不放,我也是从QB走向C的啊,现在我有时都会用它做些小程序回味回味^_^ 我也觉得你应该去学C,玩编程的就是得拿的起放的下,说实话,当初我从B走向C都踌躇了许久呢^_^ 但现在觉得没白干。
加油吧!!
作者: warm
时间: 2003-10-25 00:00
请问你当时为什么要从basic到c呢?是因为速度的问题吗?
作者: 凌晨一点
时间: 2003-10-27 00:00
原因比较多吧,速度是一方面,另外还有功能,灵活性等方面啦,当然,功能强是较大的咯^_^
作者: spirit
时间: 2004-1-8 00:00
kk
作者: qb45
时间: 2004-1-8 00:00
谢谢大家的鼓励和建议,我不想学C,要学就学汇编!
学C了对计算机也只是一知半解,都是用别人写好了的函数,没劲!!!!
作者: iceboy
时间: 2004-1-11 00:00
希望你做一个 800*600@75Hz 显示汉字 & 图片的 LIB
刷新率低, 看着实在难受。(除非是黑底白字)
作者: qb45
时间: 2004-1-12 00:00
你如果有资料我就可以做!
我没有这方面的资料!
作者: pizigao
时间: 2004-1-13 00:00
顶啊!我也想学C语言啊