Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Sonstiges

Bildschirm speichern und wiederherstellen (Text)

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Redakteurytwinky 29.03.2012

Gelegentlich soll die Arbeit auf der Befehlszeile dort fortgesetzt werden, wo sie vor einem Programmaufruf unterbrochen wurde. Das kann mit den Routinen im folgenden Programm erledigt werden, die auch eine ggfs. farbige (Text-)Ausgabe wiederherstellen:

#include "crt.bi"
#Define ArgC ((*__p___argc())-1)
#undef GoTo 'Jojo hat Recht, danke ;-))
#ifndef False
    Const False=0, True=Not False
#endif
#define Lines 1
#define Columns 2
#define Letter 0
#define Colour 1
'+-----------------------------------------------------------------------------------+
'|    Header: Bestimmen der Übergabeparameter                                        |
'|    AnzeigeCheck:|Il1 sind:Alt-0124, Großes i, kleines L, Eins „ä”öüáߎę֚Üñ±ø°¸©|
Const Autor="SaveScreen.Bas v0.99 ¸2011 by ytwinky, MD"'                             |
'|           (Tastenkombination: keine)                                              |
'|    Zweck : Umrechner für die verschiedenen Zahlensystem die FreeBASIC beherrscht  |
'|    Getestet mit dem aktuellen fbc und dem aktuellen FBEdit                        |
'+-----------------------------------------------------------------------------------+
'(Anmerkung zu den Sonderzeichen: zuerst steht das DOS-Zeichen, danach das Windowszeichen)
Declare Sub RestoreScreen()
Declare Sub SaveScreen()
Type ScreenRec
    As Integer Char, ForeGround, BackGround
End Type

Var z=HiWord(Width), s=LoWord(Width)
Var ForeGround=Screen(z, s, Colour) And &h0F, BackGround=(Screen(z, s, Colour) And &hF0)\16
Dim Shared StartScreen(0 To z, 0 To s) As ScreenRec
Color 12, 1
Print "Test"
Color 10, 14
Print "Nochn Test vg=" & LoWord(Color) & " hg=" & HiWord(Color)
Color ForeGround, BackGround
SaveScreen()
Print "Die nun folgende Ausgabe ist nachher wieder weg.."
Print "Zeilen:" &z &!"\tSpalten:" &s
Print "Wenn einer, der mit Mhe kaum"
Print "geklettert ist auf einen Baum"
Print "schon meint, daá er ein Vogel w„r',"
Print "so irrt sich der.."
Print "                (Wilhelm Busch)"
GetKey 'is better than Sleep, coz it clears the keyboardbuffer^^
RestoreScreen()

End

Sub SaveScreen()
    Var CurLin=CsrLin, CurCol=Pos(0)
    StartScreen(0, 0).ForeGround=Screen(CurLin, CurCol, Colour) And &h0F
    StartScreen(0, 0).BackGround=(Screen(CurLin, CurCol, Colour) And &hF0)\16
    StartScreen(0, 1).ForeGround=CurLin-1 'current CursorLine
    StartScreen(0, 1).BackGround=CurCol   'current CursorColumn
    For CurLin=1 To UBound(StartScreen, Lines)
        For CurCol=1 To UBound(StartScreen, Columns)
            StartScreen(CurLin, CurCol).Char=Screen(CurLin, CurCol,Letter)
            StartScreen(CurLin, CurCol).ForeGround=Screen(CurLin, CurCol, Colour) And &h0F
            StartScreen(CurLin, CurCol).BackGround=(Screen(CurLin, CurCol, Colour) And &hF0)\16
        Next
    Next
End Sub

Sub RestoreScreen()
    Var NoCursor=0, ShowCursor=1 'only to show what Locate does..
    For CurLin As Integer=1 To UBound(StartScreen, Lines)
        Locate CurLin, 1, NoCursor
        For CurCol As Integer=1 To UBound(StartScreen, Columns)
            Color StartScreen(CurLin, CurCol).ForeGround, StartScreen(CurLin, CurCol).BackGround
            If (CurCol=UBound(StartScreen, Columns))And(CurLin=UBound(StartScreen, Lines)) Then
                Print Chr(StartScreen(CurLin, CurCol).Char); 'ooops, only Print can handle lower right corner correctly..
            Else
                putchar StartScreen(CurLin, CurCol).Char ' wow, speeds up this program dramatically ;-))
            EndIf
        Next
    Next
    Locate StartScreen(0, 1).ForeGround+1, StartScreen(0, 1).BackGround+1, ShowCursor 'Restore the position..
    Color StartScreen(0, 0).ForeGround, StartScreen(0, 0).BackGround '..and the colors
End Sub

Einen kleinen 'Fehler' hat das Programm jedoch, den finden aber nur Kenner der Befehlszeile und die anderen wird er nicht stören ;-))
Für dieses Programm gilt die RTFM-Lizenz^^
[Edit am 29.03.2012]
RestoreScreen() war echt langsam und so habe ich es mir nochmal vorgenommen..
Mit PutChar aus der StdIO.bi(die auch per Crt.Bi eingebunden wird) geht das alles viel schneller(im Test 3x so schnell..)
PutChar kann aber das letzte Zeichen rechtsunten nicht 'befriedigend' ausgeben, doch dafür gibt es ja Print;
[/Edit]
Fröhliches ScreenSaven und -Restoren
Gruß
ytwinky


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 30.01.2011 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 29.03.2012 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen