home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
winsys.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-05-18
|
5KB
|
187 lines
(*-------------------------------------------------------------------------*)
(* 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 *)