home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* WINSYS.PAS *)
- (* Routinen zum Windowhandling *)
-
- FUNCTION x_WinTrans(x : REAL) : x_Koord;
- (* Windowkoordinaten in Bildschirmkoordinaten transformieren *)
- BEGIN
- WITH Window[AktWin]^ DO
- x_WinTrans := Vxmin + Round((x - xmin) * Pixel_pro_x)
- END;
-
-
-
- FUNCTION y_WinTrans(y : REAL) : y_Koord;
- (* Windowkoordinaten in Bildschirmkoordinaten transformieren *)
- BEGIN
- WITH Window[AktWin]^ DO
- y_WinTrans := Vymin + Round((y - ymin) * Pixel_pro_y)
- END;
-
-
-
- PROCEDURE ClipViewport( VAR x1 : x_Koord; VAR y1 : y_Koord;
- VAR x2 : x_Koord; VAR y2 : y_Koord );
-
- VAR h : INTEGER;
-
- BEGIN
- IF x1 > x2 THEN BEGIN
- h := x1; x1 := x2; x2 := h
- END;
- IF y1 > y2 THEN BEGIN
- h := y1; y1 := y2; y2 := h
- END;
- (* Ueberpruefung ob in 0..ScreenXmax bzw. 0..ScreenYmax kann entfallen, *)
- (* da sie durch die Parametertypen vom Compiler erledigt wird. *)
- END;
-
-
-
-
- PROCEDURE ClipWindow( VAR x1, y1, x2, y2 : REAL );
-
- BEGIN
- IF x1 > x2 THEN RealSwap(x1,x2);
- IF y1 > y2 THEN RealSwap(y1,y2);
- END;
-
-
-
- PROCEDURE WinError( Nr : INTEGER ); (* Fehlerbehandlung des Windowsystems *)
-
- VAR Message : STRING[255];
-
- BEGIN
- CASE Nr OF
- 1 : Message := ' Ungueltige Fensterparameter ! ';
- 2 : Message := ' Geschlossenes Fenster kann nicht selected werden ! ';
- 3 : Message := ' Fenster schon geschlossen ! ';
- 4 : Message := ' Geschlossenes Fenster kann nicht geloescht werden ! ';
- 5 : Message := ' Zum Rahmenzeichnen muss das Fenster offen sein ! ';
- 6 : Message := ' Fuer SelectWorld muss der Viewport selected sein ! ';
- 7 : Message := ' Falsche Parameter fuer SelectWorld ! '
- END;
- WriteLn;
- WriteLn(CHAR(7) (* einmal beepen *), Message);
- Halt (* Ende und Aus *)
- END;
-
-
-
- PROCEDURE InitWindows; (* Fenstersystem initialisieren *)
-
- VAR i : WinNrBereich;
-
- BEGIN
- FOR i := 1 TO MaxWins DO
- Window[i] := NIL
- END;
-
-
-
- PROCEDURE SelectWindow( Handle : WinNrBereich);
- (* Window als Aktuelles auswaehlen *)
- BEGIN
- IF Window[Handle] = NIL THEN
- WinError(2);
- AktWin := Handle; (* Globale Variable setzen *)
- END;
-
-
-
- FUNCTION SelectViewport( x1 : x_Koord; y1 : y_Koord;
- x2 : x_Koord; y2 : y_Koord ) : WinNrBereich;
- (* Viewport definieren, Funktion gibt Handle zurueck *)
- (* Falls kein Platz mehr fuer Window gibt die Funktion NULL zurueck *)
-
- VAR i, Handle : WinNrBereich;
-
- BEGIN
- Handle := NULL;
- FOR i := 1 TO MaxWins DO
- IF Window[i] = NIL THEN
- Handle := i;
- IF Handle <> NULL THEN BEGIN
- New(Window[Handle]);
- WITH Window[Handle]^ DO BEGIN
- ClipViewport(x1,y1,x2,y2);
- IF (x1 = x2) OR (y1 = y2) THEN WinError(1);
- (* Koordinatensystem initilisieren *)
- xmin := 0; xmax := 1; ymin := 0; ymax := 1;
- Vxmin := x1; Vxmax := x2; Vymin := y1; Vymax := y2;
- Pixel_pro_x := 1.0*(Vxmax - Vxmin)/(xmax - xmin);
- Pixel_pro_y := 1.0*(Vymax - Vymin)/(ymax - ymin);
- (* Hintergrund sichern *)
- StoreViewport(x1,y1,x2,y2,Background)
- END;
- SelectWindow(Handle)
- END;
- SelectViewport := Handle;
- END;
-
-
-
- PROCEDURE SelectWorld( Handle : WinNrBereich;
- x1, y1, x2 ,y2 : REAL );
- (* Koordinatensystem fuer Fenster definieren *)
-
- BEGIN
- IF Window[Handle] = NIL THEN WinError(6);
- WITH Window[Handle]^ DO BEGIN
- ClipWindow(x1,y1,x2,y2);
- IF (x1 = x2) OR (y1 = y2) THEN WinError(7);
- xmin := x1; ymin := y1; xmax := x2; ymax := y2;
- Pixel_pro_x := 1.0*(Vxmax - Vxmin)/(xmax - xmin);
- Pixel_pro_y := 1.0*(Vymax - Vymin)/(ymax - ymin)
- END
- END;
-
-
-
- PROCEDURE CloseWindow( Handle : WinNrBereich );
- (* Fenster schliessen , Hintergrund restaurieren. *)
-
- BEGIN
- IF Window[Handle] = NIL THEN WinError(3);
- WITH Window[Handle]^ DO
- RestoreViewport(Background, Vxmin, Vymin);
- Dispose(Window[Handle]);
- Window[Handle] := NIL
- END;
-
-
-
- PROCEDURE ClearWindow( Handle : WinNrBereich );
- (* Fenster mit Hintergrundfarbe fuellen *)
-
- VAR Merk : Sys_Colors;
- i : INTEGER;
-
- BEGIN
- IF Window[Handle] = NIL THEN WinError(4);
- WITH Window[Handle]^ DO BEGIN
- Merk := Pen_Color;
- Set_Pen_Color(First_Color_Value);
- FOR i := Vymin TO Vymax DO
- Line(Vxmin,i,Vxmax,i);
- Set_Pen_Color(Merk)
- END
- END;
-
-
-
- PROCEDURE FrameWindow( Handle : WinNrBereich );
- (* Rahmen um Fenster zeichnen *)
-
- BEGIN
- IF Window[Handle] = NIL THEN WinError(5);
- WITH Window[Handle]^ DO BEGIN
- Line(Vxmin,Vymin,Vxmin,Vymax); Line(Vxmin,Vymax,Vxmax,Vymax);
- Line(Vxmax,Vymax,Vxmax,Vymin); Line(Vxmax,Vymin,Vxmin,Vymin)
- END
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Ende WINSYS.PAS *)
-