回 帖 发 新 帖 刷新版面

主题:在屏幕上开窗口,

在DOS下实现啊,在屏幕上开窗口,比如开一个15行.40列的窗口

回复列表 (共3个回复)

沙发

你有代码吗?可以拿出来大家一起考虑啊!

板凳

;我写了个,看看适合你不,已试过了,在我电脑上能够运行。

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        

3 楼


[em1]这个程序编的还可以.

我来回复

您尚未登录,请登录后再回复。点此登录或注册