home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* FENSTER.PAS *)
- (* (c) 1990 Simon Kröger & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT Fenster;
-
- INTERFACE
-
- USES Crt, Dos;
-
- PROCEDURE Open_Window(x1, y1, x2, y2 : BYTE;
- Rahmen : INTEGER);
-
- PROCEDURE Close_Window;
-
- TYPE
- Screen_Line = ARRAY [1..80] OF INTEGER;
- Screen_Array = ARRAY [1..25] OF Screen_Line;
-
- VAR
- Screen : ^Screen_Array;
- Mono : BOOLEAN;
-
- IMPLEMENTATION
-
- TYPE
- Fenster_Feld = ARRAY [0..2000] OF INTEGER;
- Fenster_Rec = RECORD
- x1, x2, y1, y2 : BYTE;
- F : Fenster_Feld;
- END;
-
- VAR
- Feld : ARRAY [1..20] OF ^Fenster_Rec;
- Fenster_Anz : BYTE;
-
- PROCEDURE Kasten(x, y, x1, y1 : INTEGER;
- doppel : BOOLEAN);
- VAR
- i : INTEGER;
-
- PROCEDURE Print(c1, c2 : BYTE);
- BEGIN
- IF doppel THEN Write(Chr(c1))
- ELSE Write(Chr(c2));
- END;
-
- BEGIN
- GotoXY(x, y);
- Print(201, 218);
- FOR i := 1 TO x1 - x - 1 DO Print(205, 196);
- Print(187, 191);
- FOR i := 1 TO y1 - y - 2 DO BEGIN
- GotoXY(x, i + y);
- Print(186, 179);
- GotoXY(x1, i + y);
- Print(186, 179);
- END;
- GotoXY(x, y1 - 1);
- Print(200, 192);
- FOR i := 1 TO x1 - x - 1 DO Print (205, 196);
- Print(188, 217);
- END;
-
- PROCEDURE Init;
- VAR
- Regs : Registers;
- BEGIN
- Intr($11, Regs);
- Mono := (Lo(Regs.ax) AND $30) = $30;
- IF Mono THEN Screen := Ptr($B000, $0000)
- ELSE Screen := Ptr($B800, $0000);
- Fenster_Anz := 0;
- END;
-
- PROCEDURE Open_Window(x1, y1, x2, y2 : BYTE;
- Rahmen : INTEGER);
- VAR
- w, Fenster_Size, Z, i : INTEGER;
- BEGIN
- Fenster_Anz := Fenster_Anz + 1;
- w := Fenster_Anz;
- Fenster_Size := (x2 - x1 + 1) * (y2 - y1 + 1) * 2 + 4;
- GetMem(Feld[W], Fenster_Size);
- z := 0;
- FOR i := y1 TO y2 DO BEGIN
- Move(Screen^[i, x1], Feld[W]^.F[Z], (x2-x1+1) * 2);
- Z := Z + (x2 - x1 + 1);
- END;
- Feld[w]^.x1 := x1;
- Feld[w]^.y1 := y1;
- Feld[w]^.x2 := x2;
- Feld[w]^.y2 := y2;
- Window(1, 1, 80, 25);
- IF Rahmen <> 0 THEN BEGIN
- IF Rahmen = 1 THEN Kasten(x1, y1, x2, y2+1, FALSE);
- IF Rahmen = 2 THEN Kasten(x1, y1, x2, y2+1, TRUE);
- Window(x1+1, y1+1, x2-1, y2-1);
- ClrScr;
- END ELSE
- Window(x1, y1, x2, y2);
- ClrScr;
- END;
-
- PROCEDURE Close_Window;
- VAR
- w, Fenster_Size, Z, i : INTEGER;
- Spalten, Zeilen,
- x, y, x1, y1, x2, y2 : BYTE;
- BEGIN
- w := Fenster_Anz;
- IF w = 0 THEN Exit;
- x1 := Feld[w]^.x1;
- y1 := Feld[w]^.y1;
- x2 := Feld[w]^.x2;
- y2 := Feld[w]^.y2;
- Fenster_Size := (x2 - x1 + 1) * (y2 - y1 + 1) * 2 + 4;
- z := 0;
- Spalten := (x2 - x1 + 1);
- Zeilen := (y2 - y1 +1);
- FOR i := y1 TO y2 DO BEGIN
- Move(Feld[w]^.F[z], Screen^[i, x1], Spalten * 2);
- Z := Z + Spalten;
- END;
- FreeMem(Feld[w], Fenster_Size);
- Fenster_Anz := Fenster_Anz - 1;
- w := w - 1;
- IF w = 0 THEN
- Window(1, 1, 80, 25)
- ELSE
- Window(Feld[w]^.x1, Feld[w]^.y1,
- Feld[w]^.x2, Feld[w]^.y2);
- END;
-
-
- BEGIN
- Init;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von FENSTER.PAS *)