Last updated: 10. 1.1998, 17:46
<*/NOWARN:F*>
MODULE SCRAMBLE;
(*------------------------------------------------
SCRAMBLE.C -- Scramble (and Unscramble) Screen
(c) Charles Petzold, 1996
SCRAMBLE.MOD -- Translation to Stony Brook Modula-2
(c) Peter Stadler, 1997
------------------------------------------------*)
IMPORT WINUSER;
IMPORT WIN32;
IMPORT WINX;
IMPORT WINGDI;
IMPORT SYSTEM;
IMPORT Lib;
CONST NUM = 200;
VAR
iKeep : ARRAY[0..NUM-1],[0..3] OF INTEGER;
hdc : WIN32.HDC;
hdcMem : WIN32.HDC;
cx : INTEGER;
cy : INTEGER;
hBitmap : WIN32.HBITMAP;
i : INTEGER;
j : INTEGER;
x1 : INTEGER;
y1 : INTEGER;
x2 : INTEGER;
y2 : INTEGER;
BEGIN
IF (WINUSER.LockWindowUpdate (WINUSER.GetDesktopWindow ())) THEN
hdc := WINGDI.CreateDC ("DISPLAY", "", "", WINX.NIL_DEVMODEA) ;
hdcMem := WINGDI.CreateCompatibleDC (hdc) ;
cx := WINUSER.GetSystemMetrics (WINUSER.SM_CXSCREEN) / 10 ;
cy := WINUSER.GetSystemMetrics (WINUSER.SM_CYSCREEN) / 10 ;
hBitmap := WINGDI.CreateCompatibleBitmap (hdc, cx, cy) ;
WINGDI.SelectObject (hdcMem, SYSTEM.CAST(WIN32.HGDIOBJ,hBitmap)) ;
(*srand ((int) GetCurrentTime ()) ;*)
FOR i := 0 TO 2-1 DO
FOR j := 0 TO NUM-1 DO
IF (i = 0) THEN
x1 := cx * VAL(INTEGER,(Lib.RANDOM (10) MOD 10));
iKeep [j,0] := x1;
y1 := cy * VAL(INTEGER,(Lib.RANDOM (10) MOD 10));
iKeep [j,1] := y1;
x2 := cx * VAL(INTEGER,(Lib.RANDOM (10) MOD 10));
iKeep [j,2] := x2;
y2 := cy * VAL(INTEGER,(Lib.RANDOM (10) MOD 10));
iKeep [j,3] := y2;
ELSE
x1 := iKeep [NUM - 1 - j] [0] ;
y1 := iKeep [NUM - 1 - j] [1] ;
x2 := iKeep [NUM - 1 - j] [2] ;
y2 := iKeep [NUM - 1 - j] [3] ;
END;
WINGDI.BitBlt (hdcMem, 0, 0, cx, cy, hdc, x1, y1, WINGDI.SRCCOPY) ;
WINGDI.BitBlt (hdc, x1, y1, cx, cy, hdc, x2, y2, WINGDI.SRCCOPY) ;
WINGDI.BitBlt (hdc, x2, y2, cx, cy, hdcMem, 0, 0, WINGDI.SRCCOPY) ;
WIN32.Sleep (10) ;
END;
END;
WINGDI.DeleteDC (hdcMem) ;
WINGDI.DeleteDC (hdc) ;
WINGDI.DeleteObject (SYSTEM.CAST(WIN32.HGDIOBJ,hBitmap));
WINUSER.LockWindowUpdate (NIL) ;
END;
END SCRAMBLE.