中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS汉化世界 & 中文系统 (中文化室) » [转贴]文本方式下图形提示界面制作
作者:
标题: [转贴]文本方式下图形提示界面制作 上一主题 | 下一主题
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『楼 主』:  [转贴]文本方式下图形提示界面制作

标题:文本方式下图形提示界面制作
转自:随机选择百度搜索结果
作者:刘文广 董春平

      在商品化的软件中,有大量的提示信息界面以使用户清楚软件的状态和运行情况,使用汉字提示可以大大方便不懂西文提示的用户。但如果少量的汉字提示在图形方式下实现,将使程序的设计复杂化,而且图形方式比文本方式的实现要慢得多。本文使用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]程序1
#include "stdio.h"
#include "fcntl.h"
unsigned char *f = "天骄";
int fp;
main()
{
    unsigned int i, c1, c2, t = 0;
    int i1, i2, i3;
    long L;
    unsigned char buf[32];
    fp = open("g:\wps\cclibj.dot", O - RDWR | O - BINARY);
    if (fp ==  - 1)
    {
        cputs("error on open cclib !");
        exit(0);
    }
    while ((i =  *f++) != 0)
    {
        if (i > 0xa0)
        if (t == 0)
        {
            c1 = (i - 0xa0) *94;
            t++;
        }
        else
        {
            c2 = i - 0xa0 + c1 - 659;
            t = 0;
            l = c2 * 32L;
            lseek(fp, l, SEEK - SET);
            read(fp, buf, 32);
            printf("hex code:\n");
            for (i = 0; i < 32; i++)
            if (i == 16)
            {
                printf("%\n", buf[i]);
            }
            else
                printf("%x", buf[i]);
            printf("\n");
            getch();
        };
    }
}
[2]程序2
cseg segment para public'code'
assume cs:cseg
org 100h
main proc near
start:  mov ax, cseg
        mov es,ax
        mov ax,0003h
        int 10h
        mov ax,1100h
        mov bh,16
        mov bl,0
        mov cx,3
        mov dx,130
        lea bp,row1-grahh
        int 10h
        mov cx,4
        mov dx,133
        lea bp,row2-graph
        int 10h
        mov cx,5
        mov dx,137
        lea bp,row3-graph
        int 10h
        mov cx,2
        mov dx,142
        lea bp,tian
        int 10h
        mvo cx,2
        mov dx,144
        lea bp,jiao
        int 10h
        mov ax,1103h
        mov bl,00000000b
        int 10h
        mov ax,1301h
        mov bh,0
        mov bl,01h
        mov dl,2
        mov dh,1
        mov cx,1
lop:    lea bp,hd
        int 10h
        inc dl
        cmp dl,24
        jnz lop
        mov dl,2
        inc dh
        cmp dh,7
        jnz lop
        mov bl,17h
        mov cx,3
        mov dh,2
        mov dl,12
        lea bp,str1
        int 10h
        mov cx,4
        mov dh,3
        mov dl,12
        lea bp,str2
        int 10h
        mov cx,5
        mov dh,4
        mov dl,10
        lea bp,str3
        int 10h
        mov cx,2
        mov dh,3
        mov dl,4
        lea bp,ws1
        int 10h
        mov cx,2
        mov dh,3
        mov dl,20
        lea bp,ws2
        int 10h
        mov ax,0003h
        int 10h
main endp
row1-graph  db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,01h
            db 00h,00h,00h,04h,04h,0ch,00h,00h,00h,38h,3eh,71h,00h,00h,00h,0f0h
            db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,0c0h,70h,38h,1ch,0eh
row2-graph  db 01h,03h,00h,00h,00h,07h,0fh,0fh,00h,00h,00h,3fh,7fh,7fh,00h,00h
            db 0f0h,0f0h,00h,00h,00h,0f0h,0f0h,0e0h,00h,00h,00h,0e0h,0e0h,0c0h,00h,00h
            db 0eh,0fh,0fh,07h,07h,03h,03h,03h,07h,07h,0fh,0fh,1fh,1fh,3fh,3fh
            db 00h,00h,00h,00h,80h,80h,80h,80h,0c0h,0c0h,0c0h,0c0h,0c0h,80h,80h,80h
row3-graph  db 00h,00h,00h,00h,00h,00h,00h,01h,01h,03h,00h,00h,00h,00h,00h,00h
            db 00h,7fh,7fh,0ffh,00h,00h,00h,0ffh,0ffh,0ffh,00h,00h,00h,00h,00h,00h
            db 00h,0ffh,0ffh,0ffh,00h,00h,00h,0ffh,0ffh,0ffh,00h,00h,00h,00h,00h,00h
            db 00h,0c3h,0ffh,09fh,0fh,0fh,07h,83h,81h,01h,00h,00h,00h,00h,00h,00h
            db 0ffh,0ffh,0ffh,0feh,0feh,0fch,0f8h,0f0h,0c0h,00h,00h,00h,00h,00h,00h
tian        db 00h,7fh,01h,01h,01h,01h,0ffh,01h,02h,02h,04h,04h,08h,10h,20h,0c0h
            db 00h,0fch,00h,00h,00h,04h,0feh,00h,80h,80h,40h,40h,20h,10h,0eh,04h
jiao        db 08h,0fdh,08h,48h,4bh,48h,48h,49h,7eh,04h,1ch,0e4h,44h,14h,09h,02h
            db 0ch,0f0h,20h,20h,0feh,50h,88h,06h,8ch,88h,88h,88h,88h,88h,08h,08h
str1        db 130,131,132
str2        db 133,134,135,136
str3        db 137,138,139,140,141
ws1         db 142,143
ws2         db 144,145
hddb 219
cseg ends
end start




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-1-10 22:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 2 楼』:  

很好!顶一下!

我以前看1994、95年的某本电脑杂志上也看到过类似的文章,修改BIOS字符的字模是非常高深的技术,通过它可以在纯文本模式下显示单色的小型PCX图片,还可以在纯文本模式下制造箭头鼠标(就像DOSShell、VSafe、MSBackup里面的箭头鼠标那样)。



----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2006-1-10 22:56
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 3 楼』:  



  Quote:
C1=(i-a0H)+94

C1=(i-a0H)*94

有没有16×16的GBK点阵字库啊



欢迎造访DOS的小屋!
http://risky.ik8.com
2006-1-10 23:03
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 4 楼』:  

Re wil:         好!好!好!

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

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

[ Last edited by 本是 on 2006-1-11 at 07:49 ]



my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2006-1-11 07:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 5 楼』:  

找到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 ]



欢迎造访DOS的小屋!
http://risky.ik8.com
2006-1-11 10:44
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
coolboy163
初级用户





积分 176
发帖 74
注册 2005-11-7
状态 离线
『第 6 楼』:  

是学习的好例子!
看上去很有意思.

2006-1-12 20:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: