栏目搜索
 
 
 
 
 

文本方式下图形提示界面制作

作者:不详  来源:不详  发布人:admin  发布时间:2005-10-16 20:18:31


一、汉
模数据提取
文本方式下显示是通过用汉模改写西文方法实现,所以应首先获得汉模数据。
各种汉操作系统可以提供不同小和模,本文作为一个实例,从金山DOScclibj.dot库中获得所显示楷体汉16×16点阵数据。
读取用C语言实现,具体方法下。
(1)把需显示作为同符同样看待符串赋值于一个内存变量f,汉符串值在WPSN命令下输入,然后转入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中,但当每次初始化文本方式时,EGABIOS会把模表拷贝到显示存储器页面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存入符属性。由页面0ASCII码值索引到页面2符发生器,再结合页面1属性便可在屏幕上显示相应符,图2所示
@@T5S08501.GIF;图2@@
2.汉及图形显示
利用西文显示原理,使得模未修改前应显示西文符显示成修改后模或图模,通过使用被修改过数个西文模,显示汉或图形。
3.显示输出
BIOS INT10子功能13H完成输出。
输入参数:AH=13H
AL=1
BL=符属性
CX=显示符个数
DH=显示行号
DL=显示列号
ES: BP=显示符串首地址
其中,显示符串开始符由用户在页面0ASCII码空间内可以任意取值,符属性可以
设定显示颜色。实现程序见程序2。
程序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:wpscclibj.dot",O-RDWRO-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
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,00
h
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,00
h,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,08
h,10
h,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,4
4h,1
4h,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 

作者:刘文广 董春平

 
 
  信息栏
 
 
 
 
  相关文章