home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / qc25 / beispiel / mouse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-25  |  10.6 KB  |  359 lines

  1. /* MOUSE.C  - Modul für die Maus-Funktionen. Um die Funktionen zu 
  2.  * benutzen, fügen Sie die Datei MOUSE.H in Ihr Programm ein.
  3.  * Die nachfolgenden Funktion sind global aufrufbar:
  4.  *
  5.  *   MouseInit        - Initialisiert Maus
  6.  *   GetMouseEvent    - Gibt Informationen über das zuletzt ausgeführte 
  7.  *                      Mausereignis aus
  8.  *   SetZgrSicht      - Setzt die Sichtbarkeit des Zeigers auf  HIDE oder SHOW
  9.  *   SetZgrPos        - Setzt die Positions des Zeigers
  10.  *   SetZgrForm       - Setzt die Form des Zeigers im Grafik-Modus, oder 
  11.  *                      das Zeichen und die Farbe im Textmodus
  12.  *   GetZgrPos        - Gibt Position des Zeigers und den Status der Taste
  13.  *
  14.  *   Die folgende Struktur ist definiert:
  15.  *
  16.  *   EVENT      -   Definiert x,y und den Status der Maus bei einem Ereignis
  17.  */
  18.  
  19. #include <graph.h>
  20. #include "mouse.h"
  21.  
  22. /* Interne Information, die von den Maus-Funktionen benötigt wird. */
  23. struct MOUINFO
  24. {
  25.     int      fExist, fInit, fGraph;
  26.     short    xVirtual,  yVirtual;
  27.     short    xActual,   yActual;
  28.     short    xLast,     yLast;
  29.     unsigned fsBtnLast, cBtn;
  30. } static mi =
  31. {
  32.     1, 0, 0,
  33.     0, 0,
  34.     0, 0,
  35.     0, 0,
  36.     0, 0
  37. };
  38.  
  39. /* MouseInit - Initialisiert die Maus und schaltet den Maus-Zeiger ein. 
  40.  * Initialisiert alle Variablen, die von anderen Mausfunktionen 
  41.  * benötigt werden. Diese Funktion sollte aufgerufen werden, wenn ein neue 
  42.  * Grafikbetriebsart gesetzt wird, da alle internen Variablen vom Modus 
  43.  * abhängig sind.
  44.  *
  45.  * Parameter: keine
  46.  *
  47.  * Rückgabewert: 0, falls keine Maus angeschlossen ist; ansonsten die 
  48.  * Anzahl der verfügbaren Maustasten
  49.  */
  50. int MouseInit()
  51. {
  52.      struct videoconfig vc;
  53.     char _far *pMode = (char _far *)0x00000449; /* Address for mode */
  54.  
  55.     /* Abfrage der Grafikkonfiguration. */
  56.     _getvideoconfig( &vc );
  57.  
  58.     /* Zur Behandlung spezieller Fälle der Hercules-Grafik. Um die Maus mit 
  59.      * der Video-Seite 0 zu verwenden, wird Modus 6 voraussgesetzt. Um 
  60.      * die Maus mit der Seite 1 zu verwenden, wird Modus 5 voraussgesetzt. Da 
  61.      * die Maus-Funktionen nicht so einfach für Seitenwechsel 
  62.      * erkannt und initialisiert werden können, wird hier die Seite 0 als 
  63.      * Standardwert angenommen. Beachten Sie auch, daß die Maus bei der 
  64.      * Hercules-Grafik im Text-Modus eingestellt sein muß.
  65.  
  66.      */
  67.     if( vc.mode == _HERCMONO )
  68.     {
  69.         _setvideomode( _TEXTMONO );
  70.         *pMode = 6;
  71.     }
  72.  
  73.     mi.fInit = 1;
  74.     _asm
  75.     {
  76.         sub     ax, ax              ; Mouse Funktion 0, reset Maus
  77.         int     33h
  78.         mov     mi.fExist, ax       ; Setze Existenz-Flag für weitere Aufrufe
  79.         or      ax, ax              ; Falls AX = 0 ist, ist keine Maus vorhanden
  80.         jnz     exist
  81.         ret                         ; So abbrechen
  82. exist:
  83.         mov     mi.cBtn, bx         ; Speichern der Maus-Tasten für Rückgabewert
  84.     }
  85.  
  86.     /* Setzte Grafik-Flags. */
  87.     if( vc.numxpixels )
  88.     {
  89.         mi.fGraph = 1;
  90.         mi.yActual = vc.numypixels - 1;
  91.         mi.xActual = vc.numxpixels - 1;
  92.     }
  93.     else
  94.         mi.fGraph = 0;
  95.  
  96.     /* Die Maus arbeitet auf einem virtuellen Bildschirm mit 640 x Pixel auf 
  97.      * (8 * Textreihen) vertikaler Pixel. Als Standard wird 640 x 200 für den 
  98.      * 25 Zeilen-Modus angenommen. Sie müssen die den Funktionsaufruf 8 für 
  99.      * andere Bilschirmgrößen verwenden.
  100.      */
  101.     mi.xVirtual = 639;
  102.     if( mi.fGraph )
  103.         mi.yVirtual = vc.numypixels - 1;
  104.     else
  105.         mi.yVirtual = (vc.numtextrows << 3) - 1;
  106.  
  107.     /* Hercules Grafikmodus neu initialisieren und die Höhe neu einrichten. */
  108.     if( vc.mode == _HERCMONO )
  109.     {
  110.         _setvideomode( _HERCMONO );
  111.         mi.xVirtual = 719;
  112.     }
  113.  
  114.     _asm
  115.     {
  116.         mov     ax, 8               ; Setzen der minimalen und maximalen Höhe
  117.         sub     cx, cx              ; Minimum ist 0
  118.         mov     dx, mi.yVirtual     ; Maximum ist 8 * Reihen (oder Reihen SHL 3)
  119.         int     33h                 ; Einrichten für 25, 30, 43, 50, oder 60 Zeilen
  120.  
  121.         mov     ax, 1               ; Anschalten des Maus-Zeiger
  122.         int     33h
  123.  
  124.         mov     ax, 3               ; Startposition und Tastenstatus erhalten
  125.         int     33h
  126.         mov     mi.xLast, cx        ; Internes Speichern
  127.         mov     mi.yLast, dx
  128.         mov     mi.fsBtnLast, bx
  129.     }
  130.     return mi.cBtn;                 /* Gibt die Anzahl der Maustasten zurück */
  131. }
  132.  
  133. /* GetMouseEvent - Überprüft das Auftreten eines Maus-Ereignisses. 
  134.  * Falls ein Ereignis aufgetreten ist, wird die Struktur Event auf 
  135.  * den neuesten Stand gebracht. 
  136.  *
  137.  * Parameter: pEvent - Zeiger auf Struktur Event
  138.  *
  139.  * Rückgabewert: 1 falls Ereignis, 0 falls kein Ereignis aufgetreten
  140.  */
  141. int GetMouseEvent( EVENT _far *pEvent )
  142. {
  143.     int rtn;
  144.  
  145.     /* Überprüfe, ob Maus existiert und initialisiert ist. */
  146.     if( !mi.fInit )
  147.         MouseInit();
  148.     if( !mi.fExist )
  149.         return 0;
  150.  
  151.     _asm
  152.     {
  153.         mov     ax, 3               ; Erhalte Mausposition und -status
  154.         int     33h
  155.         sub     ax, ax              ; Annahm, daß kein Ergeignis aufgetreten ist
  156.  
  157.         cmp     cx, mi.xLast        ; Hat sich die Spalte geändert?
  158.         jne     event
  159.         cmp     dx, mi.yLast        ; Hat sich die Reihe geändert?
  160.         jne     event
  161.         cmp     bx, mi.fsBtnLast    ; Hat sich die Taste geändert?
  162.         je      noevent
  163. event:
  164.         mov     ax, 1               ; Falls sich etwas geändert hat, ist ein Ereignis aufgetreten
  165.         mov     mi.xLast, cx        ; Bringt interne Variable auf den neuesten Stand
  166.         mov     mi.yLast, dx
  167.         mov     mi.fsBtnLast, bx
  168. noevent:
  169.         mov     rtn, ax             ; Setzt Rückgabewert 
  170.     }
  171.  
  172.     /* Falls Ereignis aufgetreten, Werte in Struktur berichtigen. */
  173.     if( rtn )
  174.     {
  175.         /* Falls Grafikmodus, berichtige virtuelle Mausposition zu 
  176.          * aktuellen Bildschirmkoordinaten.
  177.          */
  178.         if( mi.fGraph )
  179.         {
  180.             pEvent->x = ((long)mi.xLast * mi.xActual) / mi.xVirtual;
  181.             pEvent->y = ((long)mi.yLast * mi.yActual) / mi.yVirtual;
  182.         }
  183.         /* Falls Textmodus, berichtige virtuelle Mausposition auf 
  184.          * 1-Basis Reihe/Spalte
  185.          */
  186.         else
  187.         {
  188.             pEvent->x = (mi.xLast >> 3) + 1;
  189.             pEvent->y = (mi.yLast >> 3) + 1;
  190.         }
  191.         pEvent->fsBtn = mi.fsBtnLast;
  192.     }
  193.     return rtn;
  194. }
  195.  
  196. /* GetZgrPos - Abrage der Zeigerpostion und des Tastenstatus; auch 
  197.  * wenn kein Ereigniss aufgetreten ist.
  198.  *
  199.  * Parameter: pEvent - Zeiger zur Struktur event
  200.  *
  201.  * Rückgabewert: 0 falls keine Maus, ansonten 1
  202.  */
  203. int GetZgrPos( EVENT _far *pEvent )
  204. {
  205.     /* Überprüfe, ob Maus existiert und initialisiert ist. */
  206.     if( !mi.fInit )
  207.         MouseInit();
  208.     if( !mi.fExist )
  209.         return 0;
  210.  
  211.     _asm
  212.     {
  213.         mov     ax, 3               ; Erhalte Mausposition und Tastenstatus
  214.         int     33h
  215.         les     di, pEvent
  216.         mov     es:[di].x, cx
  217.         mov     es:[di].y, dx
  218.         mov     es:[di].fsBtn, bx
  219.     }
  220.  
  221.     /* Falls Grafikmodus, berichtige virtuelle Mausposition zu 
  222.      * aktuellen Bildschirmkoordinaten.
  223.      */
  224.     if( mi.fGraph )
  225.     {
  226.         pEvent->x = ((long)pEvent->x * mi.xActual) / mi.xVirtual;
  227.         pEvent->y = ((long)pEvent->y * mi.yActual) / mi.yVirtual;
  228.     }
  229.     /* Falls Textmodus, berichtige virtuelle Mausposition auf 
  230.      * 1-Basis Reihe/Spalte
  231.      */
  232.     else
  233.     {
  234.         pEvent->x >>= 3;
  235.         pEvent->y >>= 3;
  236.         pEvent->x++;
  237.         pEvent->y++;
  238.     }
  239.     return 1;
  240. }
  241.  
  242. /* SetZgrSicht - Setzt Zeiger-Sichtbarkeit.
  243.  *
  244.  * Parameter: Status - SHOW oder HIDE
  245.  *
  246.  * Rückgabewert: 0 falls keine Maus vorhanden, ansonsten 1
  247.  */
  248. int SetZgrSicht( enum ZGRSICHT pv )
  249. {
  250.     /* Überprüfe, ob Maus existiert und initialisiert ist. */
  251.     if( !mi.fInit )
  252.         MouseInit();
  253.     if( !mi.fExist )
  254.         return 0;
  255.  
  256.     _asm
  257.     {
  258.         mov ax, pv                  ; Zeige oder verstecke Mauszeiger
  259.         int 33h
  260.     }
  261. }
  262.  
  263. /* SetZgrPos - Setzt die Position des Mauszeigers.
  264.  *
  265.  * Parameter: x - Spaltenposition im Textmodus, akutelle x-Koordinate im 
  266.  *                Grafikmodus
  267.  *            y - Reihenposition im Textmodus, aktuelle y- Koordinate im 
  268.  *                Grafikmodus
  269.  *
  270.  * Rückgabewert: 0 falls keine Maus vorhanden, ansonsten 1
  271.  */
  272. int SetZgrPos( short x, short y )
  273. {
  274.     /* Überprüfe, ob Maus existiert und initialisiert ist. */
  275.     if( !mi.fInit )
  276.         MouseInit();
  277.     if( !mi.fExist )
  278.         return 0;
  279.  
  280.     /* Falls Grafikmodus, berichtige virtuelle Mausposition zu 
  281.      * aktuellen Bildschirmkoordinaten. */
  282.     if( mi.fGraph )
  283.     {
  284.         x = ((long)x * mi.xActual) / mi.xVirtual;
  285.         y = ((long)y * mi.yActual) / mi.yVirtual;
  286.     }
  287.     /* Falls Textmodus, berichtige virtuelle Mausposition auf 
  288.      * 1-Basis Reihe/Spalte. */
  289.     else
  290.     {
  291.         x--;
  292.         y--;
  293.         x <<= 3;
  294.         y <<= 3;
  295.     }
  296.  
  297.     _asm
  298.     {
  299.         mov     ax, 4               ; Setzt Mausposition
  300.         mov     cx, x
  301.         mov     dx, y
  302.         int     33h
  303.     }
  304.     return 1;
  305. }
  306.  
  307. /* SetZgrForm - Setzt Form des Mauspointers.
  308.  *
  309.  * Parameter: x - Spaltenposition im Textmodus, akutelle x-Koordinate im 
  310.  *                Grafikmodus
  311.  *            y - Reihenposition im Textmodus, aktuelle y- Koordinate im 
  312.  *                Grafikmodus
  313.  *
  314.  * Rückgabewert: 0 falls keine Maus vorhanden, ansonsten 1
  315.  */
  316. int SetZgrForm( ZGRFORM _far *ps )
  317. {
  318.     /* Überprüfe, ob Maus existiert und initialisiert ist. */
  319.     if( !mi.fInit )
  320.         MouseInit();
  321.     if( !mi.fExist )
  322.         return 0;
  323.  
  324.     /* Falls Grafik: benützte für die Form des Mauszeigers
  325.      * ein Bitmasken-Datenfeld. 
  326.      */
  327.     if( mi.fGraph )
  328.     {
  329.         _asm
  330.         {
  331.             les     di, ps
  332.             mov     bx, es:[di].g.xHot      ; Lade Offsets der "Hot Spots"
  333.             mov     cx, es:[di].g.yHot
  334.             mov     dx, di
  335.             add     dx, 4
  336.  
  337.             mov     ax, 9                   ; Setzt Grafik-Zeiger
  338.             int     33h
  339.         }
  340.     }
  341.     /* Falls Text, benutze Farb/Zeichen Zeigerwerte. */
  342.     else
  343.     {
  344.         _asm
  345.         {
  346.             les     di, ps
  347.             mov     bx, 0                   ; Benuzte Software-Cursor
  348.             mov     cl, es:[di].t.chScreen
  349.             mov     ch, es:[di].t.atScreen
  350.             mov     dl, es:[di].t.chCursor
  351.             mov     dh, es:[di].t.atCursor
  352.  
  353.             mov     ax, 10                  ; Setzt Text-Zeiger
  354.             int     33h
  355.         }
  356.     }
  357.     return 1;
  358. }
  359.