正文

关于文本方式下屏幕内容的保存2005-08-05 13:38:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/mozo/3452.html

分享到:

我很少搞图形的,图形屏幕也就用那两句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

阅读(7087) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册