主题:一个简单的问题_开窗口
cailin
[专家分:0] 发布于 2006-01-14 11:22:00
怎样在屏幕上开窗口啊,不回啊,出学者[em1]
回复列表 (共2个回复)
沙发
hm1024 [专家分:220] 发布于 2006-01-14 11:34:00
问题一:在windows是下还是在DOS下实现。
问题二:你说的“开窗口”是什么意思?具体完成什么动作。
板凳
hm1024 [专家分:220] 发布于 2006-01-14 14:25:00
;已试过,能够运行,你试下吧。
left equ 5 ;左上角的:行号
up equ 5 ;左上角的:列号
right equ 20 ;右下角的:行号
down equ 60 ;右下角的:列号
amount equ right - left ;共计相差15行
data segment
assume ds:data
l_u db left,up ;左上角坐标值:行号,列号
r_d db right,down ;右下角坐标值:行号,列号
current db left,up ;当前位置坐标值:行号,列号。初始值和左上角一样
data ends
code segment
assume cs:code
main proc far
mov ax,data
mov ds,ax
mov ax,0003h ;设置显示模式为文本模式
int 10h
scroll: mov ah,06 ;BIOS中断,用来滚动屏幕的,
mov ch,byte ptr l_u ;左上角行号
mov cl,byte ptr l_u + 1 ;左上角列号
mov dh,byte ptr r_d ;右下角行号
mov dl,byte ptr r_d +1 ;右下角列号
mov bh,2 ;新行的属性,可以随值写,我用的绿色。
mov al,amount ;滚动的行数,上下相关15行。(5,5) (20,60)
int 10h
mov byte ptr current,left ;设置光标位置
mov byte ptr current + 1,up
call focus
input: mov ah,00h ;等待输入
int 16h
cmp al,1bh ;输入了Esc键就退出
je exit
cmp al,0dh ;输入了回车键就换行
je isenter
mov dl,byte ptr r_d + 1 ;输入了其它可显字符的话,首先比较一下当前列
cmp byte ptr current +1,dl ;光标位置的列坐标有没有达到最大列坐标60
ja line ;已经到了最大的列坐标,即已经60列了,就去换行
call focus ;如果没有达到的话首先设置光标位置为当前位置
inc byte ptr current + 1 ;列加1
mov ah,09h ;调用Bios中断在当前光标位置显示字符
mov bh,00h
mov bl,02h
mov cx,1
int 10h
jmp input ;跳转到input,等待用户输入。
isenter:mov byte ptr current +1 ,up ;如果输入的是回车键,那么列坐标和初始值左上角坐标一样
inc byte ptr current ;行坐标加一,即增加一行。
cmp byte ptr current,right ;当前行已经达到了最大行20行了吗?
ja scroll ;如果已经达到了20行,那么就向上滚屏。
call focus ;如果没有达到最大行,那么就重新设置光标位置
jmp input
line: mov byte ptr current + 1,up ;如果是需要换行,那么列坐标和初始值左上角坐标一样
inc byte ptr current ;行坐标加一,即增加一行。
cmp byte ptr current,right ;当前行已经达到了最大行20行了吗?
ja scroll ;如果已经达到了20行,那么就向上滚屏。
call focus ;如果没有达到最大行,那么就重新设置光标位置,不同于
mov ah,09h ;回车的地方在于,这里要将输入的字符显示到屏幕上。
mov bh,00h ;调用Bios中断在当前光标位置显示字符
mov bl,02h
mov cx,1
int 10h
jmp input ;跳转到input,等待用户输入。
exit: mov ah,4ch
int 21h
main endp
focus proc near
mov ah,02h
mov bh,00h
mov dh,current
mov dl,current + 1
int 10h
ret
focus endp
code ends
end main
我来回复