主题:关于文本方式下的屏幕保存
我很少搞图形的,图形屏幕也就用那两句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
我只是说说文本方式的保存。
因为以前为自己做程序的时候老是不知道该怎么办,
因为全屏幕需要处理的数据比较少,就先说说全屏幕处理了.
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