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

  1. (*-------------------------------------------------------------------------*)
  2. (*                              WINSYS.PAS                                 *)
  3. (*                       Routinen zum Windowhandling                       *)
  4.  
  5. FUNCTION x_WinTrans(x : REAL) : x_Koord;
  6.     (* Windowkoordinaten in Bildschirmkoordinaten transformieren *)
  7. BEGIN
  8.   WITH Window[AktWin]^ DO
  9.     x_WinTrans := Vxmin + Round((x - xmin) * Pixel_pro_x)
  10. END;
  11.  
  12.  
  13.  
  14. FUNCTION y_WinTrans(y : REAL) : y_Koord;
  15.     (* Windowkoordinaten in Bildschirmkoordinaten transformieren *)
  16. BEGIN
  17.   WITH Window[AktWin]^ DO
  18.     y_WinTrans := Vymin + Round((y - ymin) * Pixel_pro_y)
  19. END;
  20.  
  21.  
  22.  
  23. PROCEDURE ClipViewport( VAR x1 : x_Koord; VAR y1 : y_Koord;
  24.                         VAR x2 : x_Koord; VAR y2 : y_Koord );
  25.  
  26. VAR h : INTEGER;
  27.  
  28. BEGIN
  29.   IF x1 > x2 THEN BEGIN
  30.     h := x1;  x1 := x2;  x2 := h
  31.   END;
  32.   IF y1 > y2 THEN BEGIN
  33.     h := y1;  y1 := y2;  y2 := h
  34.   END;
  35.   (* Ueberpruefung ob in 0..ScreenXmax bzw. 0..ScreenYmax kann entfallen, *)
  36.   (* da sie durch die Parametertypen vom Compiler erledigt wird.          *)
  37. END;
  38.  
  39.  
  40.  
  41.  
  42. PROCEDURE ClipWindow( VAR x1, y1, x2, y2 : REAL );
  43.  
  44. BEGIN
  45.   IF x1 > x2 THEN RealSwap(x1,x2);
  46.   IF y1 > y2 THEN RealSwap(y1,y2);
  47. END;
  48.  
  49.  
  50.  
  51. PROCEDURE WinError( Nr : INTEGER ); (* Fehlerbehandlung des Windowsystems *)
  52.  
  53. VAR Message : STRING[255];
  54.  
  55. BEGIN
  56.   CASE Nr OF
  57.     1 : Message := ' Ungueltige Fensterparameter ! ';
  58.     2 : Message := ' Geschlossenes Fenster kann nicht selected werden ! ';
  59.     3 : Message := ' Fenster schon geschlossen ! ';
  60.     4 : Message := ' Geschlossenes Fenster kann nicht geloescht werden ! ';
  61.     5 : Message := ' Zum Rahmenzeichnen muss das Fenster offen sein ! ';
  62.     6 : Message := ' Fuer SelectWorld muss der Viewport selected sein ! ';
  63.     7 : Message := ' Falsche Parameter fuer SelectWorld ! '
  64.   END;
  65.   WriteLn;
  66.   WriteLn(CHAR(7) (* einmal beepen *), Message);
  67.   Halt            (* Ende und Aus *)
  68. END;
  69.  
  70.  
  71.  
  72. PROCEDURE InitWindows;  (* Fenstersystem initialisieren *)
  73.  
  74. VAR i : WinNrBereich;
  75.  
  76. BEGIN
  77.   FOR i := 1 TO MaxWins DO
  78.     Window[i] := NIL
  79. END;
  80.  
  81.  
  82.  
  83. PROCEDURE SelectWindow( Handle : WinNrBereich);
  84.               (* Window als Aktuelles auswaehlen *)
  85. BEGIN
  86.   IF Window[Handle] = NIL THEN
  87.      WinError(2);
  88.   AktWin := Handle; (* Globale Variable setzen *)
  89. END;
  90.  
  91.  
  92.  
  93. FUNCTION SelectViewport( x1 : x_Koord;  y1 : y_Koord;
  94.                          x2 : x_Koord;  y2 : y_Koord ) : WinNrBereich;
  95.         (* Viewport definieren, Funktion gibt Handle zurueck *)
  96.         (* Falls kein Platz mehr fuer Window gibt die Funktion NULL zurueck *)
  97.  
  98. VAR i, Handle : WinNrBereich;
  99.  
  100. BEGIN
  101.   Handle := NULL;
  102.   FOR i := 1 TO MaxWins DO
  103.     IF Window[i] = NIL THEN
  104.       Handle := i;
  105.   IF Handle <> NULL THEN BEGIN
  106.     New(Window[Handle]);
  107.     WITH Window[Handle]^ DO BEGIN
  108.       ClipViewport(x1,y1,x2,y2);
  109.       IF (x1 = x2) OR (y1 = y2) THEN WinError(1);
  110.       (* Koordinatensystem initilisieren *)
  111.       xmin := 0; xmax := 1; ymin := 0; ymax := 1;
  112.       Vxmin := x1;  Vxmax := x2;  Vymin := y1;  Vymax := y2;
  113.       Pixel_pro_x := 1.0*(Vxmax - Vxmin)/(xmax - xmin);
  114.       Pixel_pro_y := 1.0*(Vymax - Vymin)/(ymax - ymin);
  115.       (* Hintergrund sichern *)
  116.       StoreViewport(x1,y1,x2,y2,Background)
  117.     END;
  118.     SelectWindow(Handle)
  119.   END;
  120.   SelectViewport := Handle;
  121. END;
  122.  
  123.  
  124.  
  125. PROCEDURE SelectWorld( Handle : WinNrBereich;
  126.                        x1, y1, x2 ,y2 : REAL );
  127.      (* Koordinatensystem fuer Fenster definieren *)
  128.  
  129. BEGIN
  130.   IF Window[Handle] = NIL THEN WinError(6);
  131.   WITH Window[Handle]^ DO BEGIN
  132.     ClipWindow(x1,y1,x2,y2);
  133.     IF (x1 = x2) OR (y1 = y2) THEN WinError(7);
  134.     xmin := x1;  ymin := y1;  xmax := x2;  ymax := y2;
  135.     Pixel_pro_x := 1.0*(Vxmax - Vxmin)/(xmax - xmin);
  136.     Pixel_pro_y := 1.0*(Vymax - Vymin)/(ymax - ymin)
  137.   END
  138. END;
  139.  
  140.  
  141.  
  142. PROCEDURE CloseWindow( Handle : WinNrBereich );
  143.       (* Fenster schliessen , Hintergrund restaurieren. *)
  144.  
  145. BEGIN
  146.   IF Window[Handle] = NIL THEN WinError(3);
  147.   WITH Window[Handle]^ DO
  148.     RestoreViewport(Background, Vxmin, Vymin);
  149.   Dispose(Window[Handle]);
  150.   Window[Handle] := NIL
  151. END;
  152.  
  153.  
  154.  
  155. PROCEDURE ClearWindow( Handle : WinNrBereich );
  156.       (* Fenster mit Hintergrundfarbe fuellen *)
  157.  
  158. VAR Merk : Sys_Colors;
  159.     i : INTEGER;
  160.  
  161. BEGIN
  162.   IF Window[Handle] = NIL THEN WinError(4);
  163.   WITH Window[Handle]^ DO BEGIN
  164.     Merk := Pen_Color;
  165.     Set_Pen_Color(First_Color_Value);
  166.     FOR i := Vymin TO Vymax DO
  167.       Line(Vxmin,i,Vxmax,i);
  168.     Set_Pen_Color(Merk)
  169.   END
  170. END;
  171.  
  172.  
  173.  
  174. PROCEDURE FrameWindow( Handle : WinNrBereich );
  175.       (* Rahmen um Fenster zeichnen *)
  176.  
  177. BEGIN
  178.   IF Window[Handle] = NIL THEN WinError(5);
  179.   WITH Window[Handle]^ DO BEGIN
  180.     Line(Vxmin,Vymin,Vxmin,Vymax);  Line(Vxmin,Vymax,Vxmax,Vymax);
  181.     Line(Vxmax,Vymax,Vxmax,Vymin);  Line(Vxmax,Vymin,Vxmin,Vymin)
  182.   END
  183. END;
  184.  
  185. (*-------------------------------------------------------------------------*)
  186. (*                          Ende WINSYS.PAS                                *)
  187.