home *** CD-ROM | disk | FTP | other *** search
/ HOT Scene Stuff / hotscenestuffzyklop1996.iso / diskmags / deutsch / microcod / stod1 / text / text016.txt < prev    next >
Text File  |  1994-09-07  |  5KB  |  184 lines

  1.  
  2.  
  3.                   Mausprogrammierung in Pascal
  4.                   ----------------------------
  5.  
  6. Ah, da seit ihr ja endlich... sicherlich habt ihr gerade den
  7. Artikel über die Mausprogrammierung 'Allgemein' gelesen und
  8. wollt nun wissen, wie man das in Pascal macht, stimmt's? Nein!?!
  9. Na dann eben nicht! (Schmoll...:-))
  10.  
  11. Nun ja, dann wollen wir mal:
  12.  
  13. Da sich in Pascal die überall beliebte UNIT-Form so schön macht,
  14. werde auch ich hier eine Unit zum Besten geben.
  15.  
  16. Unterscheiden muß ich hier am Anfang mal direkt in der Program-
  17. mierungsart: Alle, die noch kein Turbo Pascal 6 besitzen, müssen
  18. weiterhin mit der Unit DOS arbeiten, um so Zugriff auf die Regis-
  19. ter zu erhalten. Alle anderen (> TP6) können und sollten den in-
  20. tegrierten Assembler benutzen.
  21.  
  22. Zum Programmieren:
  23.   TP5 und kleiner:
  24.  
  25.  
  26.    USES DOS;
  27.  
  28.    VAR Regs : Registers;
  29.  
  30.    PROCEDURE ResetMouse;
  31.    BEGIN
  32.     WITH Regs DO BEGIN
  33.      AX := 0;      {AX mit 0 laden --> MouseTreiber zurücksetzen}
  34.      INTR($33,Regs); {Interrupt 33h aufrufen}
  35.     END;
  36.    END;
  37.  
  38.   TP6 und höher:
  39.  
  40.  
  41.    PROCEDURE ResetMouse; ASSEMBLER;
  42.    ASM
  43.     MOV AX,0       {AX mit 0 laden --> MouseTreiber zurücksetzen}
  44.     INT 33h        {Interrupt 33h aufrufen}
  45.    END;
  46.  
  47. Das sei hier zum Anfang ersteinmal gesagt. Im folgenden Text wer-
  48. de ich mich nur auf TP6 beziehen (also Assembler-Code), doch soll-
  49. te die Anpassung an TP5 nicht allzu schwer sein (siehe oben).
  50.  
  51.  
  52. UNIT Maus;
  53.  
  54. INTERFACE
  55.  
  56.  PROCEDURE InitMouse;
  57.  PROCEDURE ShowCursor;
  58.  PROCEDURE HideCursor;
  59.  PROCEDURE SetMousePos(x,y:WORD);
  60.  FUNCTION XPos : WORD;
  61.  FUNCTION YPos : WORD;
  62.  FUNCTION LeftButtonPressed : BOOLEAN;
  63.  FUNCTION RightButtonPressed : BOOLEAN;
  64.  PROCEDURE WaitForLeftButtonRelease;
  65.  PROCEDURE WaitForRightButtonRelease;
  66.  PROCEDURE SetXYRange(MinX,MaxX,MinY,MaxY : WORD);
  67.  
  68. IMPLEMENTATION
  69.  
  70. PROCEDURE InitMouse; ASSEMBLER;
  71. ASM
  72.  XOR AX,AX                   {AX auf 0}
  73.  INT 33h                     {Aufruf: Interrupt 33h}
  74. END;
  75.  
  76. PROCEDURE ShowCursor; ASSEMBLER;
  77. ASM
  78.  MOV AX,1
  79.  INT 33h
  80. END;
  81.  
  82. PROCEDURE HideCursor; ASSEMBLER;
  83. ASM
  84.  MOV AX,2
  85.  INT 33h
  86. END;
  87.  
  88. PROCEDURE SetMousePos(x,y:WORD); ASSEMBLER;
  89. ASM
  90.  MOV AX,4
  91.  MOV CX,x                    {X-Koordinate nach CX}
  92.  MOV DX,y                    {Y-Koordinate nach DX}
  93.  INT 33h
  94. END;
  95.  
  96. FUNCTION XPos : WORD; ASSEMBLER;
  97. ASM
  98.  MOV AX,3
  99.  INT 33h
  100.  MOV AX,CX     {FUNCTION-Wert geht durch's AX-Register zurück!}
  101. END;
  102.  
  103. FUNCTION YPos : WORD; ASSEMBLER;
  104. ASM
  105.  MOV AX,3
  106.  INT 33h
  107.  MOV AX,DX     {FUNCTION-Wert geht durch's AX-Register zurück!}
  108. END;
  109.  
  110. FUNCTION LeftButtonPressed : BOOLEAN; ASSEMBLER;
  111. ASM
  112.  MOV AX,3
  113.  INT 33h
  114.  MOV AX,BX     {Zustand der Maustasten nach AX}
  115.  AND AX,1      {Prüfe, ob Bit 0 (Linke Maustaste) gesetzt ist}
  116.                {FUNCTION-Wert geht durch's AX-Register zurück!}
  117. END;
  118.  
  119. FUNCTION RightButtonPressed : BOOLEAN; ASSEMBLER;
  120. ASM
  121.  MOV AX,3
  122.  INT 33h
  123.  MOV AX,BX     {Zustand der Maustasten nach AX}
  124.  AND AX,2      {Prüfe, ob Bit 1 (Rechte Maustaste) gesetzt ist}
  125.                {FUNCTION-Wert geht durch's AX-Register zurück!}
  126. END;
  127.  
  128. PROCEDURE WaitForLeftButtonRelease; ASSEMBLER;
  129. ASM
  130.  @Warte:
  131.   Call LeftButtonPressed  {Ruft LeftButtonPressed auf}
  132.   JNZ @Warte              {Schleife solange, bis linker Knopf
  133.                            nicht gedrückt ist}
  134. END;
  135.  
  136. PROCEDURE WaitForRightButtonRelease; ASSEMBLER;
  137. ASM
  138.  @Warte:
  139.   Call RightButtonPressed  {Ruft RightButtonPressed auf}
  140.   JNZ @Warte               {Schleife solange, bis rechter Knopf
  141.                             nicht gedrückt ist}
  142. END;
  143.  
  144. PROCEDURE SetXYRange(MinX,MaxX,MinY,MaxY : WORD); ASSEMBLER;
  145. ASM
  146.  MOV AX,7
  147.  MOV CX,MinX
  148.  MOV DX,MaxX
  149.  INT 33h           {Legt X-Bereich fest}
  150.  MOV AX,8;
  151.  MOV CX,MinY
  152.  MOV DX,MaxY
  153.  INT 33h           {Legt Y-Bereich fest}
  154. END;
  155.  
  156. BEGIN
  157. END.
  158.  
  159.  
  160. Wie man sieht, habe ich gar nicht alle Funktionen benutzt, die
  161. ich zuvor ('Mausprogrammierung') vorgestellt habe.
  162. In dieser Unit habe ich nur die Funktionen implementiert, die
  163. ich auch schon manchmal benutzt habe. Die Abfrage des mittleren
  164. Knopfes habe ich mir zum Beispiel gespart, da dieser eigentlich
  165. nie (nicht nur eigentlich nie, sondern überhaupt nie...) benutzt
  166. wird. Die Funktionen 07h und 08h habe ich in eine Prozedur ge-
  167. packt, da zumindest ich eigentlich immer beide gleichzeitige ver-
  168. ändere. Sollte man aber z.B. nur den horizontalen Bereich ändern
  169. wollen, so kann man die Prozedur immer noch trennen (SetXRange/
  170. SetYRange).
  171.  
  172. So, zum Abschluß sei noch gesagt, daß Ihr den ganzen Driß da oben
  173. zum Glück nicht abschreiben braucht!
  174. Der QuellCode der Unit, sowie ein kleines Beispielprog befindet
  175. sich (wie auch alle anderen Beispiele und QuellCode-Veröffentlich-
  176. ungen) im Verzeichnis 'Sources'.
  177.  
  178. So weit, So gut...  Das war's dann (für's erste) mit der Maus in
  179. Pascal/Assembler. Sollten noch irgendwelche Fragen dazu bestehen:
  180. Schreibt ruhig! Es wird alles beantwortet.
  181.  
  182.                                                  Kemil
  183.  
  184.