Last updated: 18. 1.1998, 10:23
<* +M2EXTENSIONS *> MODULE SCRAMBLE; (*------------------------------------------------ SCRAMBLE.C -- Scramble (and Unscramble) Screen (c) Charles Petzold, 1996 SCRAMBLE.MOD -- Translation to XDS Modula-2 (c) Peter Stadler, 1997 ------------------------------------------------*) IMPORT Windows; IMPORT SYSTEM; IMPORT Lib; CONST NUM = 200; VAR iKeep : ARRAY[0..NUM-1],[0..3] OF INTEGER; hdc : Windows.HDC; hdcMem : Windows.HDC; cx : INTEGER; cy : INTEGER; hBitmap : Windows.HBITMAP; i : INTEGER; j : INTEGER; x1 : INTEGER; y1 : INTEGER; x2 : INTEGER; y2 : INTEGER; BEGIN IF (Windows.LockWindowUpdate (Windows.GetDesktopWindow ())) THEN hdc := Windows.CreateDC ("DISPLAY", "", "", NIL) ; hdcMem := Windows.CreateCompatibleDC (hdc) ; cx := Windows.GetSystemMetrics (Windows.SM_CXSCREEN) / 10 ; cy := Windows.GetSystemMetrics (Windows.SM_CYSCREEN) / 10 ; hBitmap := Windows.CreateCompatibleBitmap (hdc, cx, cy) ; Windows.SelectObject (hdcMem, SYSTEM.CAST(Windows.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; Windows.BitBlt (hdcMem, 0, 0, cx, cy, hdc, x1, y1, Windows.SRCCOPY) ; Windows.BitBlt (hdc, x1, y1, cx, cy, hdc, x2, y2, Windows.SRCCOPY) ; Windows.BitBlt (hdc, x2, y2, cx, cy, hdcMem, 0, 0, Windows.SRCCOPY) ; Windows.Sleep (10) ; END; END; Windows.DeleteDC (hdcMem) ; Windows.DeleteDC (hdc) ; Windows.DeleteObject (SYSTEM.CAST(Windows.HGDIOBJ,hBitmap)); Windows.LockWindowUpdate (NIL) ; END; END SCRAMBLE.