回 帖 发 新 帖 刷新版面

主题:关于文本方式下的屏幕保存

我很少搞图形的,图形屏幕也就用那两句get,put来保存了,
我只是说说文本方式的保存。
因为以前为自己做程序的时候老是不知道该怎么办,
因为全屏幕需要处理的数据比较少,就先说说全屏幕处理了.

A 我第一次做的程序是用screen语句的
  保存
    dim s(25,80,1)
    for i=1 to 25
      for j=1 to 80
        s(i,j,0)=screen(i,j,0)
        s(i,j,1)=screen(i,j,1)
    next j,i
    恢复
    locate 1,1
    for i=1 to 25
      for j=1 to 80
        color s(i,j,1) mod 16, s(i,j,1)\16
        print chr$(s(i,j,0);
    next j,i

B   后面,我知道了&HB800,我就利用BSAVE,BLOAD了
    sub scrf(f$)
    def seg =&HB800
    if f$="" then
       f$="~"+ltrim$(str$(timer))
       bsave f$,0,4000
    else
       bload f$,0
       if left$(f$,1)="~" then
          kill f$
          f$=""
       endif
    endif
    def seg
    end sub
    为了加快文件的速度,我用了虚拟磁盘.   

C   为了更快更灵活的使用保存和恢复全屏幕(要注意是文本方式)
    我后来算了一下,一页数据也就大概4K,一个字符串可以到32K
    于是我又改用更快更方便的字符串来保存屏幕信息了:
    sub scrc (s$)
    def seg =&HB800
    if s$="" then
       for d%=0 to 3999
           s$=s$+chr$(peek(d%)
       next
    else
       for d%=1 to len(s$)
           poke d%-1,asc(mid$(s$,d%,1)
       next
    endif
    def seg
    end sub

D   也有很多情况下,需要用到一个子窗口,而不是整个屏幕
    特别是在需要移动某个窗口的时候要用到.
    这种情况下,能用数组当然比较方便快捷.只是有点繁琐,
    而且通用起来会有一定困难.我就不举数组的例子了,
    我还是用字符串来做,不过需要增加一些数据的转换来减少一些参数的传递:

SUB Scrs (s$)
DEF SEG = &HB800
IF RTRIM$(s$) = "" THEN s$ = "0 1  1  25 80 1  1  "
  o% = VAL(MID$(s$, 1, 1))
  x% = VAL(MID$(s$, 3, 3))
  y% = VAL(MID$(s$, 6, 3))
  h% = VAL(MID$(s$, 9, 3))
  l% = VAL(MID$(s$, 12, 3))
  x2% = VAL(MID$(s$, 15, 3))
  y2% = VAL(MID$(s$, 18, 3))
IF o% = 0 THEN
   s$ = LEFT$(s$ + SPACE$(20), 20)
   FOR i% = x% TO (x% + h% - 1)
    FOR j% = y% TO (y% + l% - 1)
        d% = ((i% - 1) * 80 + j% - 1) * 2
        s$ = s$ + CHR$(PEEK(d%)) + CHR$(PEEK(d% + 1))
   NEXT j%, i%
   MID$(s$, 1, 1) = "1"
ELSE
   m% = 19
   IF x2% < 0 THEN x2% = x%
   IF y2% < 0 THEN y2% = y%
   FOR i% = x2% TO (x2% + h% - 1)
    FOR j% = y2% TO (y2% + l% - 1)
        d% = ((i% - 1) * 80 + j% - 1) * 2
        m% = m% + 2
        POKE d%, ASC(MID$(s$, m%, 1))
        POKE d% + 1, ASC(MID$(s$, m% + 1, 1))
   NEXT j%, i%
END IF
DEF SEG
END SUB

回复列表 (共2个回复)

沙发

qb 的内存使用实在没有 c 强啊……

板凳

我也碰到要保存恢复文本屏幕,不过没有你研究的透彻
我也发上来凑数

SUB ScreenSave ( x%, y%, W%, h%, s%())
'文本屏幕保存子程序
'调用格式  x%, y%是保存的起点坐标x,y   W%, h%,是要保存窗口的宽,高,s%是保存的数组
DIM a1 AS INTEGER, b1 AS INTEGER, x1 AS INTEGER, y1 AS INTEGER
DIM add AS INTEGER, r AS INTEGER, i AS INTEGER, j AS INTEGER
s%(0, 0) = W%: s%(1, 0) = h%
'Mouse.Hide  '关闭鼠标
DEF SEG = &HB800
FOR i = 0 TO h% - 1
    j = 0
    a1 = (x% + i - 1) * 160 + (y% - 1) * 2
    b1 = (x% + i - 1) * 160 + (y% + W% - 1) * 2
    FOR add = a1 TO b1
    j = j + 1
    r = PEEK(add)
    s%(i, j) = r
    NEXT add
NEXT i
DEF SEG
'Mouse.Show '恢复鼠标
END SUB


SUB ScreenLoad (x%, y%, s%())
'文本屏幕恢复子程序,
'调用格式  x%, y%是保存的起点坐标x,y  s%是保存的数组
DIM a1 AS INTEGER, b1 AS INTEGER, x1 AS INTEGER, y1 AS INTEGER
DIM add AS INTEGER, r AS INTEGER, i AS INTEGER, j AS INTEGER
W% = s%(0, 0): h% = s%(1, 0)
'Mouse.Hide   '关闭鼠标
DEF SEG = &HB800   '定位到文本内存
FOR i = 0 TO h% - 1
    j = 0
    a1 = (x% + i - 1) * 160 + (y% - 1) * 2
    b1 = (x% + i - 1) * 160 + (y% + W% - 1) * 2
    FOR add = a1 TO b1 - 1
     j = j + 1
     POKE add, s%(i, j)
    NEXT add
NEXT i
DEF SEG
'Mouse.Show '显示鼠标
END SUB

数组的计算方法看下面
如:
x%=3
y%=5
W%=10
h% =4

'保存
ScreenSave x%, y%, W% + 2, h% + 2, s%()

A$=INPUT$(1)  '等待

'恢复
ScreenLoad x%, 40,  s%()

我来回复

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