中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-26 18:27
47,812 主题排行 / 349,912 发帖 / 今日 2 篇 / 48,264 会员排行
DOS汉化世界 & 中文系统 (中文化室) » [转贴]文本方式下图形提示界面制作
可打印版本  1,954 / 5
第1楼 willsort 发表于 2006-01-10 22:34
元老会员 发帖 1,512 积分 4,432
[转贴]文本方式下图形提示界面制作
标题:文本方式下图形提示界面制作
转自:随机选择百度搜索结果
作者:刘文广 董春平

在商品化的软件中,有大量的提示信息界面以使用户清楚软件的状态和运行情况,使用汉字提示可以大大方便不懂西文提示的用户。但如果少量的汉字提示在图形方式下实现,将使程序的设计复杂化,而且图形方式比文本方式的实现要慢得多。本文使用EGA文本方式下汉字显示原理,设计制做了一个微机驻留报警系统的封面提示信息,提示制做人、版权、公司徽标等信息,实现了汉字,图形,字符的彩色提示界面。下面讨论实现的具体方法及原理。

一、汉字字模数据的提取

文本方式下的汉字显示是通过用汉字字模改写西文字符字模的方法实现的,所以应首先获得汉字字模数据。

各种汉字操作系统可以提供不同大小和字体的汉字字模,本文作为一个实例,从金山DOS的cclibj.dot的字库中获得所要显示的楷体汉字字模的16×16点阵数据。

字库的读取用C语言实现,具体方法如下。

(1)把需要显示的汉字作为同字符同样看待的字符串赋值于一个内存变量f,汉字字符串的值在WPS的N命令下输入,然后转入C语言进行编程。

(2)在C语言的环境中汉字字符串的值是国标码,字模的读取,就是利用所要显示的汉字国标码计算此汉字在字库中对应的字模的位置,然后读取字库中的32字节的字模数据至内存缓冲区buf中。

C语言中汉字串的国标码与cclibj.dot字库中一条字符记录具有如下的对应关系: C1,C2是整型数辅助变量,ihi、ilo表示国标码的高两位和低两位整型数。l为长整型数,用于字模查找定位。

C1=(i-a0H)+94

C2=i-a0H+c1-659

l=C2*32L

利用函数:

lseek(fp, l, seek-set); read (fp, buf,32);找到字模开始位置,并读入32字节字模数据到内存缓冲区buf中。

(3)使用输出函数的16进制输出格式,把缓冲区buf的内容输出并记录下来。本例中获得的“天骄”字模数据如下:

天:087ffc 1 010 1014fffe 10 280 280440 4 40820 101020 e o4

骄:8cfdfo 8 2048 204bfe 48 5048 887e8c4 8 81c 88e48844 88 148898 2 8

实现程序见附录程序1。

二、图形字模的设计

由于图示没有统一的标准,所以显示图形的图模数据,用手工设计完成。本例中的图形是公司的徽标,使用11个8×16的西文字符点阵表示图形。11个西文字符点阵表示的图模数据见程序中的row1-graph, row2-graph, row3-graph, 分别表示图1中的第一行,第二行和第三行的图模数据。

@@T5S08500.GIF;图1@@

三、字模和图模数据的写入

1.可修改的字模表EGA配有的显示存储器分成4个独立区段,称为4个页面。在文本方式下页面0和页面1分放屏幕字符的ASCII码和属性字节,而页面2则用来存放字模表。EGA的字模表本来是存储在ROM中的,但当每次初始化文本方式时,EGA的BIOS会把字模表拷贝到显示存储器的页面2中,由于字模表已移到RAM中,用户程序就能够对字模进行存取和修改了。

2.字模表的结构EGA的字符宽度固定为8个像素,字符高度允许从1到32范围取值,字模表是根据不间的字符集分块存储的,每个字符集内则按字符的ASCII码值从小到大的顺序排列。每个字符固定占有32B,分别对应字模从上到下的32个扫描行。但并非所有的扫描行全部使用,视不同的显示模式使用其中一部分扫描行。

因此,16×16点阵的汉字字模占用2个西文字符,而图形实现则视情况占用若干个西文字符。

3.字模的装入字模和图模数据的写入可通过BIOS INT 10H子功能11h来实现。

输入参数:AH=11H

AL=0

ES: BP=字模数据地址

CX=装入字符个数(1~256)

DX=起始字符(0~255)

BL=字符集序号(0~3)

BH=字符高度(1~32)

其中,字模数据地址是程序中的字模数据区的首地址。而起始字符是字模数据写入显示缓冲区开始的位置。

四、汉字及图形的彩色显示

1.西文字符的显示原理输出文本时,页面0存入要输出字符的ASCII码值,页面1存入字符属性。由页面0的ASCII码值索引到页面2的字符发生器,再结合页面1的属性便可在屏幕上显示相应的字符,如图2所示@@T5S08501.GIF;图2@@ 2.汉字及图形的显示利用西文字符的显示原理,使得字模未修改前应显示的西文字符显示成修改后的汉字字模或图模,通过使用被修改过的数个西文字符字模,显示汉字或图形。

3.显示输出BIOS INT10的子功能13H完成字符的输出。

输入参数:AH=13H

AL=1

BL=字符属性

CX=显示字符个数

DH=显示字符的行号

DL=显示字符的列号

ES: BP=显示字符串的首地址

其中,显示字符串的开始字符由用户在页面0的ASCII码空间内可以任意取值,字符属性可以设定显示的颜色。实现程序见程序2。

程序1


程序2
第2楼 JonePeng 发表于 2006-01-10 22:56
金牌会员 发帖 1,883 积分 4,562 来自 广东广州
很好!顶一下!

我以前看1994、95年的某本电脑杂志上也看到过类似的文章,修改BIOS字符的字模是非常高深的技术,通过它可以在纯文本模式下显示单色的小型PCX图片,还可以在纯文本模式下制造箭头鼠标(就像DOSShell、VSafe、MSBackup里面的箭头鼠标那样)。
第3楼 fdsiuha 发表于 2006-01-10 23:03
高级用户 发帖 302 积分 587
C1=(i-a0H)+94


C1=(i-a0H)*94

有没有16×16的GBK点阵字库啊
第4楼 本是 发表于 2006-01-11 07:41
银牌会员 发帖 790 积分 2,227
Re wil: 好!好!好!

Re fdsiuha: UCWIN gold 1.0中带的HZK16.GBK就是了!

另外: 我对常用图形的格式不懂,否则就可以让VTmagic支持文本图形的显示|生成了!!!

[ Last edited by 本是 on 2006-1-11 at 07:49 ]
第5楼 fdsiuha 发表于 2006-01-11 10:44
高级用户 发帖 302 积分 587
找到UCWIN GOLD了,好象还带了一个12×12的点阵GBK字库

发个网址先
http://www.ibiblio.org/pub/packages/ccic/software/ms-win/c-sys/
里面有好多有用的东西,需要自己探索

[ Last edited by fdsiuha on 2006-1-11 at 10:51 ]
第6楼 coolboy163 发表于 2006-01-12 20:52
初级用户 发帖 74 积分 176
是学习的好例子!
看上去很有意思.
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023