Mausprogrammierung in Basic
                  ---------------------------

Nun kommt es zur Praxis in der Mausprogrammierung mit Basic. Es
gibt dabei nur ein Problem: Ich hab so gut wie keine Ahnung von
dieser Prospe! Doch ich hoffe, es wird ausreichen.

Da ich kein QuickBasic besitze, beziehen sich alle Angaben in
diesem Text lediglich auf QBasic. Ich weiá nicht, ob QuickBasic
100% kompatibel ist, doch ihr k”nnt es ja mal ausprobieren. So
viel ich weiá, ist es in QuickBasic aber auch m”glich, Interrupts
direkt aufzurufen, daher ist die hier vorgestellte Idee in Quick-
Basic wahrscheinlich anders besser zu l”sen. Wie dem auch sei,
jetzt zum Listing.
Es handelt sich dabei um ein Mini-Prog, daá einige Mausfunktionen
darstellt. Zuerst wird die Maus initalisiert und ein Reset durch-
gefhrt. Nachdem der MausCursor sichtbar gemacht wurde, wird eine
Schleife solange durchlaufen, bis ein Mausknopf bet„tigt wird.
Innerhalb dieser Schleife gibt das Programm immer die aktuelle
Position des MausCursors aus. Das ist alles...
Man sieht, ein nicht gerade aufwendiges Prog, doch ist es als De-
monstration eigentlich ganz gut.

Zur Erl„uterung des Listings:
Im Mittelpunkt steht eigentlich die Prozedur 'Absolute'. Diese
wird mit der Funktionsnummer sowie mit drei weiteren Variablen
aufgerufen, die als 'Schnittstelle' zum Maustreiber dienen.
Die letzte Variable (Adr%) enth„lt die Adresse des Maustreibers.
Wie genau das funktioniert, ist mir selbst noch nicht ganz klar,
doch da diese Prozedur ihren Dienst voll erfllt, ist mir das
eigentlich (zur Zeit) auch ziemlich egal. Irgendwie wird diese
Prozedur halt direkt an den Maustreiber gekoppelt.
In der Prozedur MouseInit wird Segment und Offset des Maustrei-
bers berechnet, die bei H0000:H00CC beginnt und 4 Byte lang ist.
Sollte gar kein Maustreiber installiert sein, so wird der Offset-
Wert -1 in Mouse.Offset% gespeichert.
Die Prozedur MouseReset setzt die Maus wieder auf ihre Normal-
Werte. Sollte dabei irgendein Fehler auftreten, so wird
Mouse.Offset% wiederum auf -1 gesetzt.
Mit MousePointer kann man den MausCursor sichtbar bzw. unsicht-
bar machen, wobei der Wert 1 sichtbar und 0 unsichtbar macht.
DIe Prozedur MouseGet liefert den Status der Kn”pfe(MouseB%)
sowie die Koordinaten (MouseX%,MouseY%) zurck.

Nun zum Listing, daá wie immer auch im Verzeichnis SOURCES zu
finden ist:

   DECLARE SUB MouseInit ()
   DECLARE SUB MouseReset ()
   DECLARE SUB MousePointer (OnOff%)
   DECLARE SUB MouseGet (MouseX%, MouseY%, MouseB%)

   DECLARE SUB Absolute (Funktion%, Par1%, Par2%, Par3%, Adr%)

   DIM SHARED Mouse.Offset%
   DIM SHARED MouseX%, MouseY%, MouseB%

   MouseInit
   MouseReset

   IF Mouse.Offset% = -1 THEN
     PRINT "Achtung: Kein Maustreiber installiert! Abbruch"
     END
   END IF

   CLS

   MousePointer 1

   DO
     MouseGet MouseX%, MouseY%, MouseB%
     LOCATE 1, 2
     PRINT USING "x=### y=###"; MouseX%; MouseY%
   LOOP UNTIL MouseB%

   MousePointer 0

   SUB MouseGet (MouseX%, MouseY%, MouseB%)
     IF Mouse.Offset% = -1 THEN EXIT SUB
     Absolute 3, MouseB%, MouseX%, MouseY%, Mouse.Offset%
     MouseX% = MouseX% / 8 + 1
     MouseY% = MouseY% / 8 + 1
   END SUB

   SUB MouseInit
     DEF SEG = 0
     Mouse.Segment& = 256 * CLNG(PEEK(&HCC + 3)) + PEEK(&HCC + 2)
     Mouse.Offset% = 256 * PEEK(&HCC + 1) + PEEK(&HCC + 0) + 2
     DEF SEG = Mouse.Segment&
     IF Mouse.Offset% + Mouse.Segment& = 0 OR
                   PEEK(Mouse.Offset%) = 88 THEN
       Mouse.Offset% = -1
     END IF
   END SUB

   SUB MousePointer (OnOff%)
     IF Mouse.Offset = -1 THEN EXIT SUB
     IF OnOff% = 0 THEN OnOff% = 2 ELSE OnOff% = 1
     Absolute OnOff%, 0, 0, 0, Mouse.Offset%
   END SUB

   SUB MouseReset
     IF Mouse.Offset% = -1 THEN EXIT SUB
     SHARED Buttons%
     NoMouse% = 0
     Absolute NoMouse%, Buttons%, 0, 0, Mouse.Offset%
     IF NoMouse% = 0 THEN Mouse.Offset% = -1
   END SUB


So, wahrscheinlich kann man es selbst in QBasic leichter machen,
nur ist mir keine andere M”glichkeit bekannt. Sollte irgendjemand
von Euch eine bessere L”sung oder eine L”sung fr einen anderen
Basic-Typen haben oder einfach irgendwelche Anmerkung machen
wollen, dann schreibt einfach (wie immer)!
Und: Wir brauchen noch m„chtig Verst„rkung in der Basic-Rubrik,
wenn Ihr also Lust habt, schreibt ruhig mal einen Artikel!

                                                 Kemil