home *** CD-ROM | disk | FTP | other *** search
- /* MOUSE.C - Modul für die Maus-Funktionen. Um die Funktionen zu
- * benutzen, fügen Sie die Datei MOUSE.H in Ihr Programm ein.
- * Die nachfolgenden Funktion sind global aufrufbar:
- *
- * MouseInit - Initialisiert Maus
- * GetMouseEvent - Gibt Informationen über das zuletzt ausgeführte
- * Mausereignis aus
- * SetZgrSicht - Setzt die Sichtbarkeit des Zeigers auf HIDE oder SHOW
- * SetZgrPos - Setzt die Positions des Zeigers
- * SetZgrForm - Setzt die Form des Zeigers im Grafik-Modus, oder
- * das Zeichen und die Farbe im Textmodus
- * GetZgrPos - Gibt Position des Zeigers und den Status der Taste
- *
- * Die folgende Struktur ist definiert:
- *
- * EVENT - Definiert x,y und den Status der Maus bei einem Ereignis
- */
-
- #include <graph.h>
- #include "mouse.h"
-
- /* Interne Information, die von den Maus-Funktionen benötigt wird. */
- struct MOUINFO
- {
- int fExist, fInit, fGraph;
- short xVirtual, yVirtual;
- short xActual, yActual;
- short xLast, yLast;
- unsigned fsBtnLast, cBtn;
- } static mi =
- {
- 1, 0, 0,
- 0, 0,
- 0, 0,
- 0, 0,
- 0, 0
- };
-
- /* MouseInit - Initialisiert die Maus und schaltet den Maus-Zeiger ein.
- * Initialisiert alle Variablen, die von anderen Mausfunktionen
- * benötigt werden. Diese Funktion sollte aufgerufen werden, wenn ein neue
- * Grafikbetriebsart gesetzt wird, da alle internen Variablen vom Modus
- * abhängig sind.
- *
- * Parameter: keine
- *
- * Rückgabewert: 0, falls keine Maus angeschlossen ist; ansonsten die
- * Anzahl der verfügbaren Maustasten
- */
- int MouseInit()
- {
- struct videoconfig vc;
- char _far *pMode = (char _far *)0x00000449; /* Address for mode */
-
- /* Abfrage der Grafikkonfiguration. */
- _getvideoconfig( &vc );
-
- /* Zur Behandlung spezieller Fälle der Hercules-Grafik. Um die Maus mit
- * der Video-Seite 0 zu verwenden, wird Modus 6 voraussgesetzt. Um
- * die Maus mit der Seite 1 zu verwenden, wird Modus 5 voraussgesetzt. Da
- * die Maus-Funktionen nicht so einfach für Seitenwechsel
- * erkannt und initialisiert werden können, wird hier die Seite 0 als
- * Standardwert angenommen. Beachten Sie auch, daß die Maus bei der
- * Hercules-Grafik im Text-Modus eingestellt sein muß.
-
- */
- if( vc.mode == _HERCMONO )
- {
- _setvideomode( _TEXTMONO );
- *pMode = 6;
- }
-
- mi.fInit = 1;
- _asm
- {
- sub ax, ax ; Mouse Funktion 0, reset Maus
- int 33h
- mov mi.fExist, ax ; Setze Existenz-Flag für weitere Aufrufe
- or ax, ax ; Falls AX = 0 ist, ist keine Maus vorhanden
- jnz exist
- ret ; So abbrechen
- exist:
- mov mi.cBtn, bx ; Speichern der Maus-Tasten für Rückgabewert
- }
-
- /* Setzte Grafik-Flags. */
- if( vc.numxpixels )
- {
- mi.fGraph = 1;
- mi.yActual = vc.numypixels - 1;
- mi.xActual = vc.numxpixels - 1;
- }
- else
- mi.fGraph = 0;
-
- /* Die Maus arbeitet auf einem virtuellen Bildschirm mit 640 x Pixel auf
- * (8 * Textreihen) vertikaler Pixel. Als Standard wird 640 x 200 für den
- * 25 Zeilen-Modus angenommen. Sie müssen die den Funktionsaufruf 8 für
- * andere Bilschirmgrößen verwenden.
- */
- mi.xVirtual = 639;
- if( mi.fGraph )
- mi.yVirtual = vc.numypixels - 1;
- else
- mi.yVirtual = (vc.numtextrows << 3) - 1;
-
- /* Hercules Grafikmodus neu initialisieren und die Höhe neu einrichten. */
- if( vc.mode == _HERCMONO )
- {
- _setvideomode( _HERCMONO );
- mi.xVirtual = 719;
- }
-
- _asm
- {
- mov ax, 8 ; Setzen der minimalen und maximalen Höhe
- sub cx, cx ; Minimum ist 0
- mov dx, mi.yVirtual ; Maximum ist 8 * Reihen (oder Reihen SHL 3)
- int 33h ; Einrichten für 25, 30, 43, 50, oder 60 Zeilen
-
- mov ax, 1 ; Anschalten des Maus-Zeiger
- int 33h
-
- mov ax, 3 ; Startposition und Tastenstatus erhalten
- int 33h
- mov mi.xLast, cx ; Internes Speichern
- mov mi.yLast, dx
- mov mi.fsBtnLast, bx
- }
- return mi.cBtn; /* Gibt die Anzahl der Maustasten zurück */
- }
-
- /* GetMouseEvent - Überprüft das Auftreten eines Maus-Ereignisses.
- * Falls ein Ereignis aufgetreten ist, wird die Struktur Event auf
- * den neuesten Stand gebracht.
- *
- * Parameter: pEvent - Zeiger auf Struktur Event
- *
- * Rückgabewert: 1 falls Ereignis, 0 falls kein Ereignis aufgetreten
- */
- int GetMouseEvent( EVENT _far *pEvent )
- {
- int rtn;
-
- /* Überprüfe, ob Maus existiert und initialisiert ist. */
- if( !mi.fInit )
- MouseInit();
- if( !mi.fExist )
- return 0;
-
- _asm
- {
- mov ax, 3 ; Erhalte Mausposition und -status
- int 33h
- sub ax, ax ; Annahm, daß kein Ergeignis aufgetreten ist
-
- cmp cx, mi.xLast ; Hat sich die Spalte geändert?
- jne event
- cmp dx, mi.yLast ; Hat sich die Reihe geändert?
- jne event
- cmp bx, mi.fsBtnLast ; Hat sich die Taste geändert?
- je noevent
- event:
- mov ax, 1 ; Falls sich etwas geändert hat, ist ein Ereignis aufgetreten
- mov mi.xLast, cx ; Bringt interne Variable auf den neuesten Stand
- mov mi.yLast, dx
- mov mi.fsBtnLast, bx
- noevent:
- mov rtn, ax ; Setzt Rückgabewert
- }
-
- /* Falls Ereignis aufgetreten, Werte in Struktur berichtigen. */
- if( rtn )
- {
- /* Falls Grafikmodus, berichtige virtuelle Mausposition zu
- * aktuellen Bildschirmkoordinaten.
- */
- if( mi.fGraph )
- {
- pEvent->x = ((long)mi.xLast * mi.xActual) / mi.xVirtual;
- pEvent->y = ((long)mi.yLast * mi.yActual) / mi.yVirtual;
- }
- /* Falls Textmodus, berichtige virtuelle Mausposition auf
- * 1-Basis Reihe/Spalte
- */
- else
- {
- pEvent->x = (mi.xLast >> 3) + 1;
- pEvent->y = (mi.yLast >> 3) + 1;
- }
- pEvent->fsBtn = mi.fsBtnLast;
- }
- return rtn;
- }
-
- /* GetZgrPos - Abrage der Zeigerpostion und des Tastenstatus; auch
- * wenn kein Ereigniss aufgetreten ist.
- *
- * Parameter: pEvent - Zeiger zur Struktur event
- *
- * Rückgabewert: 0 falls keine Maus, ansonten 1
- */
- int GetZgrPos( EVENT _far *pEvent )
- {
- /* Überprüfe, ob Maus existiert und initialisiert ist. */
- if( !mi.fInit )
- MouseInit();
- if( !mi.fExist )
- return 0;
-
- _asm
- {
- mov ax, 3 ; Erhalte Mausposition und Tastenstatus
- int 33h
- les di, pEvent
- mov es:[di].x, cx
- mov es:[di].y, dx
- mov es:[di].fsBtn, bx
- }
-
- /* Falls Grafikmodus, berichtige virtuelle Mausposition zu
- * aktuellen Bildschirmkoordinaten.
- */
- if( mi.fGraph )
- {
- pEvent->x = ((long)pEvent->x * mi.xActual) / mi.xVirtual;
- pEvent->y = ((long)pEvent->y * mi.yActual) / mi.yVirtual;
- }
- /* Falls Textmodus, berichtige virtuelle Mausposition auf
- * 1-Basis Reihe/Spalte
- */
- else
- {
- pEvent->x >>= 3;
- pEvent->y >>= 3;
- pEvent->x++;
- pEvent->y++;
- }
- return 1;
- }
-
- /* SetZgrSicht - Setzt Zeiger-Sichtbarkeit.
- *
- * Parameter: Status - SHOW oder HIDE
- *
- * Rückgabewert: 0 falls keine Maus vorhanden, ansonsten 1
- */
- int SetZgrSicht( enum ZGRSICHT pv )
- {
- /* Überprüfe, ob Maus existiert und initialisiert ist. */
- if( !mi.fInit )
- MouseInit();
- if( !mi.fExist )
- return 0;
-
- _asm
- {
- mov ax, pv ; Zeige oder verstecke Mauszeiger
- int 33h
- }
- }
-
- /* SetZgrPos - Setzt die Position des Mauszeigers.
- *
- * Parameter: x - Spaltenposition im Textmodus, akutelle x-Koordinate im
- * Grafikmodus
- * y - Reihenposition im Textmodus, aktuelle y- Koordinate im
- * Grafikmodus
- *
- * Rückgabewert: 0 falls keine Maus vorhanden, ansonsten 1
- */
- int SetZgrPos( short x, short y )
- {
- /* Überprüfe, ob Maus existiert und initialisiert ist. */
- if( !mi.fInit )
- MouseInit();
- if( !mi.fExist )
- return 0;
-
- /* Falls Grafikmodus, berichtige virtuelle Mausposition zu
- * aktuellen Bildschirmkoordinaten. */
- if( mi.fGraph )
- {
- x = ((long)x * mi.xActual) / mi.xVirtual;
- y = ((long)y * mi.yActual) / mi.yVirtual;
- }
- /* Falls Textmodus, berichtige virtuelle Mausposition auf
- * 1-Basis Reihe/Spalte. */
- else
- {
- x--;
- y--;
- x <<= 3;
- y <<= 3;
- }
-
- _asm
- {
- mov ax, 4 ; Setzt Mausposition
- mov cx, x
- mov dx, y
- int 33h
- }
- return 1;
- }
-
- /* SetZgrForm - Setzt Form des Mauspointers.
- *
- * Parameter: x - Spaltenposition im Textmodus, akutelle x-Koordinate im
- * Grafikmodus
- * y - Reihenposition im Textmodus, aktuelle y- Koordinate im
- * Grafikmodus
- *
- * Rückgabewert: 0 falls keine Maus vorhanden, ansonsten 1
- */
- int SetZgrForm( ZGRFORM _far *ps )
- {
- /* Überprüfe, ob Maus existiert und initialisiert ist. */
- if( !mi.fInit )
- MouseInit();
- if( !mi.fExist )
- return 0;
-
- /* Falls Grafik: benützte für die Form des Mauszeigers
- * ein Bitmasken-Datenfeld.
- */
- if( mi.fGraph )
- {
- _asm
- {
- les di, ps
- mov bx, es:[di].g.xHot ; Lade Offsets der "Hot Spots"
- mov cx, es:[di].g.yHot
- mov dx, di
- add dx, 4
-
- mov ax, 9 ; Setzt Grafik-Zeiger
- int 33h
- }
- }
- /* Falls Text, benutze Farb/Zeichen Zeigerwerte. */
- else
- {
- _asm
- {
- les di, ps
- mov bx, 0 ; Benuzte Software-Cursor
- mov cl, es:[di].t.chScreen
- mov ch, es:[di].t.atScreen
- mov dl, es:[di].t.chCursor
- mov dh, es:[di].t.atCursor
-
- mov ax, 10 ; Setzt Text-Zeiger
- int 33h
- }
- }
- return 1;
- }
-