home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / mouse / mousetp / turbo55 / mousebox.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1993-07-29  |  16.6 KB  |  595 lines

  1. {──────────────────────────────}
  2. {                              }
  3. {    Mousebox,  Version 1.1    }
  4. {  Copyright (c) 1988, 89, 90  }
  5. {             by               }
  6. {                              }
  7. {         Ralf Krause          }
  8. {                              }
  9. {    Leuchtenberger Str. 7a    }
  10. {   D-8480 Weiden i. d. Opf.   }
  11. {──────────────────────────────}
  12.  
  13. {$D-}    { Debug information off }
  14. {$S-}    { Stack checking    off }
  15. {$I-}    { I/O checking      off }
  16. {$F+}    { Force far calls   on  }
  17. {$O+}    { Overlays allowed  on  }
  18.  
  19. UNIT Mousebox;
  20.  
  21. INTERFACE
  22.  
  23. USES Dos;
  24.  
  25.  
  26. TYPE
  27.   MouseCursor    = RECORD
  28.                      ScreenMask,
  29.                      CursorMask  : ARRAY[0..15] OF WORD;
  30.                      XHotSpot,
  31.                      YHotSpot    : WORD;
  32.                    END;
  33.  
  34.   TextCursorType = RECORD
  35.                      HardWareCursor : BOOLEAN;
  36.                      ScreenMask,
  37.                      CursorMask     : WORD;
  38.                    END;
  39.  
  40. CONST
  41.   MouseIntr = $33;      { Mouse-Interrupt }
  42.  
  43.   Clock : MouseCursor = (ScreenMask : ($0000,$0000,$0000,$0000,
  44.                                        $8001,$C003,$E007,$F00F,
  45.                                        $E007,$C003,$8001,$0000,
  46.                                        $0000,$0000,$0000,$FFFF);
  47.                          CursorMask : ($0000,$7FFE,$6006,$300C,
  48.                                        $1818,$0C30,$0660,$1FF0,
  49.                                        $0660,$0C30,$1818,$300C,
  50.                                        $6006,$7FFE,$0000,$0000);
  51.                          XHotSpot   :  7;
  52.                          YHotSpot   :  7);
  53.  
  54.   Arrow : MouseCursor = (ScreenMask : ($3FFF,$1FFF,$0FFF,$07FF,
  55.                                        $03FF,$01FF,$00FF,$007F,
  56.                                        $003F,$001F,$00FF,$10FF,
  57.                                        $30FF,$F87F,$F87F,$FC3F);
  58.                          CursorMask : ($0000,$4000,$6000,$7000,
  59.                                        $7800,$7C00,$7E00,$7F00,
  60.                                        $7F80,$7FC0,$7C00,$4600,
  61.                                        $0600,$0300,$0300,$0180);
  62.                          XHotSpot   :  7;
  63.                          YHotSpot   :  7);
  64.  
  65.   Hand : MouseCursor = (ScreenMask : ($F3FF,$E1FF,$E1FF,$E1FF,
  66.                                       $E1FF,$E001,$E000,$E000,
  67.                                       $0000,$0000,$0000,$0000,
  68.                                       $0000,$0000,$0000,$0000);
  69.                         CursorMask : ($0C00,$1200,$1200,$1200,
  70.                                       $1200,$13B6,$1249,$1249,
  71.                                       $7249,$9249,$9249,$9249,
  72.                                       $8001,$8001,$8001,$FFFF);
  73.                         XHotSpot   :  7;
  74.                         YHotSpot   :  7);
  75.  
  76.   Plus : MouseCursor = (ScreenMask : ($FC3F,$FC3F,$FC3F,$0000,
  77.                                       $0000,$0000,$FC3F,$FC3F,
  78.                                       $FC3F,$FFFF,$FFFF,$FFFF,
  79.                                       $FFFF,$FFFF,$FFFF,$FFFF);
  80.                         CursorMask : ($0000,$0180,$0180,$0180,
  81.                                       $7FFE,$0180,$0180,$0180,
  82.                                       $0000,$0000,$0000,$0000,
  83.                                       $0000,$0000,$0000,$0000);
  84.                         XHotSpot   :  7;
  85.                         YHotSpot   :  7);
  86.  
  87.   UpArrow : MouseCursor = (ScreenMask : ($F9FF,$F0FF,$E07F,$E07F,
  88.                                          $C03F,$C03F,$801F,$801F,
  89.                                          $000F,$000F,$F0FF,$F0FF,
  90.                                          $F0FF,$F0FF,$F0FF,$F0FF);
  91.                            CursorMask : ($0000,$0600,$0F00,$0F00,
  92.                                          $1F80,$1F80,$3FC0,$3FC0,
  93.                                          $7FE0,$0600,$0600,$0600,
  94.                                          $0600,$0600,$0600,$0000);
  95.                            XHotSpot   :  7;
  96.                            YHotSpot   :  7);
  97.  
  98.   SmallArrow : MouseCursor = (ScreenMask : ($FFFF,$FFFF,$FFFF,$FFFF,
  99.                                             $FFFF,$FFFF,$FFFF,$FFFF,
  100.                                             $FFFF,$FFFF,$FFFF,$FFFF,
  101.                                             $FFFF,$FFFF,$FFFF,$FFFF);
  102.                               CursorMask : ($4000,$7000,$7C00,$7F00,
  103.                                             $6C00,$0600,$0300,$0180,
  104.                                             $0000,$0000,$0000,$0000,
  105.                                             $0000,$0000,$0000,$0000);
  106.                               XHotSpot   :  7;
  107.                               YHotSpot   :  7);
  108.  
  109.  
  110.   FUNCTION InitMouse : BOOLEAN;
  111.   PROCEDURE ResetMouse;
  112.   PROCEDURE ShowCursor;
  113.   PROCEDURE HideCursor;
  114.   FUNCTION GetXPosition : WORD;
  115.   FUNCTION GetYPosition : WORD;
  116.   FUNCTION GetXTextPosition : WORD;
  117.   FUNCTION GetYTextPosition : WORD;
  118.   FUNCTION LeftButton : BOOLEAN;
  119.   FUNCTION RightButton : BOOLEAN;
  120.   FUNCTION MiddleButton : BOOLEAN;
  121.   FUNCTION MouseMoved : BOOLEAN;
  122.   FUNCTION MouseLeftMoved : BOOLEAN;
  123.   FUNCTION MouseRightMoved : BOOLEAN;
  124.   FUNCTION MouseUpMoved : BOOLEAN;
  125.   FUNCTION MouseDownMoved : BOOLEAN;
  126.   FUNCTION LeftButtonPressed : WORD;
  127.   FUNCTION RightButtonPressed : WORD;
  128.   FUNCTION MiddleButtonPressed : WORD;
  129.   FUNCTION LeftButtonReleased : WORD;
  130.   FUNCTION RightButtonReleased : WORD;
  131.   FUNCTION MiddleButtonReleased : WORD;
  132.   PROCEDURE SetXYMouse(VAR x, y : WORD);
  133.   PROCEDURE SetXRange(VAR XMin, XMax : WORD);
  134.   PROCEDURE SetYRange(VAR YMin, YMax : WORD);
  135.   PROCEDURE SetGraphicCursor(VAR GraphicCursor : MouseCursor);
  136.   PROCEDURE SetTextCursor(VAR TextCursor : TextCursorType);
  137.   FUNCTION GetXMickey : WORD;
  138.   FUNCTION GetYMickey : WORD;
  139.   PROCEDURE SetXYMickey(VAR XMickey, YMickey : WORD);
  140.   PROCEDURE SetMouseSpeed(VAR MouseSpeed : WORD);
  141.  
  142. IMPLEMENTATION
  143.  
  144.  
  145. FUNCTION InitMouse : BOOLEAN;          { Mouse-Treiber initialisieren     }
  146.  
  147. VAR
  148.   MouseRegister : Registers;
  149.  
  150. BEGIN
  151.   MouseRegister.AX := 0;
  152.   Intr(MouseIntr, MouseRegister);
  153.   InitMouse := ODD(MouseRegister.AX);
  154. END;
  155.  
  156.  
  157. PROCEDURE ResetMouse;                  { Mouse-Treiber zurücksetzen       }
  158.  
  159. VAR
  160.   MouseRegister : Registers;
  161.  
  162. BEGIN
  163.   MouseRegister.AX := 0;
  164.   Intr(MouseIntr, MouseRegister);
  165. END;
  166.  
  167.  
  168. PROCEDURE ShowCursor;                  { Mousecursor einschalten          }
  169.  
  170. VAR
  171.   MouseRegister : Registers;
  172.  
  173. BEGIN
  174.   MouseRegister.AX := 1;
  175.   Intr(MouseIntr, MouseRegister);
  176. END;
  177.  
  178.  
  179. PROCEDURE HideCursor;                  { Mousecursor abschalten           }
  180.  
  181. VAR
  182.   MouseRegister : Registers;
  183.  
  184. BEGIN
  185.   MouseRegister.AX := 2;
  186.   Intr(MouseIntr, MouseRegister);
  187. END;
  188.  
  189.  
  190. FUNCTION GetXPosition : WORD;          { Horizontale Mouse-Position er-   }
  191.                                        { mitteln                          }
  192.  
  193. VAR
  194.   MouseRegister : Registers;
  195.  
  196. BEGIN
  197.   MouseRegister.AX := 3;
  198.   Intr(MouseIntr, MouseRegister);
  199.   GetXPosition := MouseRegister.CX;
  200. END;
  201.  
  202.  
  203. FUNCTION GetYPosition : WORD;          { Vertikale Mouse-Position er-     }
  204.                                        { mitteln                          }
  205.  
  206. VAR
  207.   MouseRegister : Registers;
  208.  
  209. BEGIN
  210.   MouseRegister.AX := 3;
  211.   Intr(MouseIntr, MouseRegister);
  212.   GetYPosition := MouseRegister.DX;
  213. END;
  214.  
  215.  
  216. FUNCTION GetXTextPosition : WORD;      { Horizontale Mouse-Position in    }
  217.                                        { Textkoordinaten ermitteln        }
  218.  
  219. VAR
  220.   MouseRegister : Registers;
  221.  
  222. BEGIN
  223.   MouseRegister.AX := 3;
  224.   Intr(MouseIntr, MouseRegister);
  225.   GetXTextPosition := (MouseRegister.CX + 8) DIV 8
  226. END;
  227.  
  228. FUNCTION GetYTextPosition : WORD;      { Vertikale Mouse-Position in      }
  229.                                        { Textkoordinaten ermitteln        }
  230.  
  231.  
  232. VAR
  233.   MouseRegister : Registers;
  234.  
  235. BEGIN
  236.   MouseRegister.AX := 3;
  237.   Intr(MouseIntr, MouseRegister);
  238.   GetYTextPosition := (MouseRegister.DX + 8) DIV 8
  239. END;
  240.  
  241.  
  242. FUNCTION LeftButton : BOOLEAN;         { Linke Mouse-Taste gedrückt ?     }
  243.  
  244. VAR
  245.   MouseRegister : Registers;
  246.  
  247. BEGIN
  248.   MouseRegister.AX := 5;
  249.   MouseRegister.BX := 0;
  250.   Intr(MouseIntr, MouseRegister);
  251.   LeftButton := ODD(MouseRegister.AX);
  252. END;
  253.  
  254.  
  255. FUNCTION RightButton : BOOLEAN;        { Rechte Mouse-Taste gedrückt ?    }
  256.  
  257. VAR
  258.   MouseRegister : Registers;
  259.  
  260. BEGIN
  261.   MouseRegister.AX := 5;
  262.   MouseRegister.BX := 1;
  263.   Intr(MouseIntr, MouseRegister);
  264.   RightButton := ODD(MouseRegister.AX SHR 1);
  265. END;
  266.  
  267.  
  268. FUNCTION MiddleButton : BOOLEAN;      { Mittlere Mouse-Taste gedrückt ?  }
  269.  
  270. VAR
  271.   MouseRegister : Registers;
  272.  
  273. BEGIN
  274.   MouseRegister.AX := 5;
  275.   MouseRegister.BX := 2;
  276.   Intr(MouseIntr, MouseRegister);
  277.   MiddleButton := ODD(MouseRegister.AX SHR 2);
  278. END;
  279.  
  280.  
  281. FUNCTION MouseMoved : BOOLEAN;         { Testet ob die Mouse bewegt wurde }
  282.                                        { wenn ja ist das Ergebnis TRUE    }
  283.  
  284. VAR
  285.   MouseRegister : Registers;
  286.  
  287. BEGIN
  288.   MouseRegister.AX := 11;
  289.   Intr(MouseIntr, MouseRegister);
  290.   IF (MouseRegister.CX <> 0) AND (MouseRegister.DX <> 0) THEN
  291.     MouseMoved := TRUE
  292.   ELSE
  293.     MouseMoved := FALSE;
  294. END;
  295.  
  296.  
  297. FUNCTION MouseLeftMoved : BOOLEAN;     { Testet ob die Mouse nach links   }
  298.                                        { bewegt wurde, wenn ja ist das    }
  299.                                        { Ergebnis TRUE                    }
  300.  
  301. VAR
  302.   MouseRegister : Registers;
  303.   Word2Int      : INTEGER;
  304.  
  305. BEGIN
  306.   MouseRegister.AX := 11;
  307.   Intr(MouseIntr, MouseRegister);
  308.   Word2Int := MouseRegister.CX;
  309.   IF (Word2Int < 0) THEN
  310.     MouseLeftMoved := TRUE
  311.   ELSE
  312.     MouseLeftMoved := FALSE;
  313. END;
  314.  
  315.  
  316. FUNCTION MouseRightMoved : BOOLEAN;    { Testet ob die Mouse nach rechts  }
  317.                                        { bewegt wurde, wenn ja ist das    }
  318.                                        { Ergebnis TRUE                    }
  319.  
  320. VAR
  321.   MouseRegister : Registers;
  322.   Word2Int      : INTEGER;
  323.  
  324. BEGIN
  325.   MouseRegister.AX := 11;
  326.   Intr(MouseIntr, MouseRegister);
  327.   Word2Int := MouseRegister.CX;
  328.   IF (Word2Int > 0) THEN
  329.     MouseRightMoved := TRUE
  330.   ELSE
  331.     MouseRightMoved := FALSE;
  332. END;
  333.  
  334.  
  335. FUNCTION MouseUpMoved : BOOLEAN;       { Testet ob die Mouse nach oben    }
  336.                                        { bewegt wurde, wenn ja ist das    }
  337.                                        { Ergebnis TRUE                    }
  338.  
  339. VAR
  340.   MouseRegister : Registers;
  341.   Word2Int      : INTEGER;
  342.  
  343. BEGIN
  344.   MouseRegister.AX := 11;
  345.   Intr(MouseIntr, MouseRegister);
  346.   Word2Int := MouseRegister.DX;
  347.   IF (Word2Int < 0) THEN
  348.     MouseUpMoved := TRUE
  349.   ELSE
  350.     MouseUpMoved := FALSE;
  351. END;
  352.  
  353.  
  354. FUNCTION MouseDownMoved : BOOLEAN;     { Testet ob die Mouse nach unten   }
  355.                                        { bewegt wurde, wenn ja ist das    }
  356.                                        { Ergebnis TRUE                    }
  357.  
  358. VAR
  359.   MouseRegister : Registers;
  360.   Word2Int      : INTEGER;
  361.  
  362. BEGIN
  363.   MouseRegister.AX := 11;
  364.   Intr(MouseIntr, MouseRegister);
  365.   Word2Int := MouseRegister.DX;
  366.   IF (Word2Int > 0) THEN
  367.     MouseDownMoved := TRUE
  368.   ELSE
  369.     MouseDownMoved := FALSE;
  370. END;
  371.  
  372.  
  373. FUNCTION LeftButtonPressed : WORD;     { wie oft wurde die linke Mouse-   }
  374.                                        { Taste seit der letzten Abfrage   }
  375.                                        { gedrückt ?                       }
  376.  
  377. VAR
  378.   MouseRegister : Registers;
  379.  
  380. BEGIN
  381.   MouseRegister.AX := 5;
  382.   MouseRegister.BX := 0;
  383.   Intr(MouseIntr, MouseRegister);
  384.   LeftButtonPressed := MouseRegister.BX;
  385. END;
  386.  
  387.  
  388. FUNCTION RightButtonPressed : WORD;    { wie oft wurde die rechte Mouse-  }
  389.                                        { Taste seit der letzten Abfrage   }
  390.                                        { gedrückt ?                       }
  391.  
  392. VAR
  393.   MouseRegister : Registers;
  394.  
  395. BEGIN
  396.   MouseRegister.AX := 5;
  397.   MouseRegister.BX := 1;
  398.   Intr(MouseIntr, MouseRegister);
  399.   RightButtonPressed := MouseRegister.BX;
  400. END;
  401.  
  402.  
  403. FUNCTION MiddleButtonPressed : WORD;   { wie oft wurde die mittlere       }
  404.                                        { Mouse-Taste seit der letzten     }
  405.                                        { Abfrage gedrückt ?               }
  406.  
  407.  
  408. VAR
  409.   MouseRegister : Registers;
  410.  
  411. BEGIN
  412.   MouseRegister.AX := 5;
  413.   MouseRegister.BX := 2;
  414.   Intr(MouseIntr, MouseRegister);
  415.   MiddleButtonPressed := MouseRegister.BX;
  416. END;
  417.  
  418.  
  419. FUNCTION LeftButtonReleased : WORD;    { wie oft wurde die linke Mouse-   }
  420.                                        { Taste seit der letzten Abfrage   }
  421.                                        { losgelassen ?                    }
  422.  
  423. VAR
  424.   MouseRegister : Registers;
  425.  
  426. BEGIN
  427.   MouseRegister.AX := 6;
  428.   MouseRegister.BX := 0;
  429.   Intr(MouseIntr, MouseRegister);
  430.   LeftButtonReleased := MouseRegister.BX;
  431. END;
  432.  
  433.  
  434. FUNCTION RightButtonReleased : WORD;   { wie oft wurde die rechte Mouse-  }
  435.                                        { Taste seit der letzten Abfrage   }
  436.                                        { losgelassen ?                    }
  437.  
  438. VAR
  439.   MouseRegister : Registers;
  440.  
  441. BEGIN
  442.   MouseRegister.AX := 6;
  443.   MouseRegister.BX := 1;
  444.   Intr(MouseIntr, MouseRegister);
  445.   RightButtonReleased := MouseRegister.BX;
  446. END;
  447.  
  448.  
  449. FUNCTION MiddleButtonReleased : WORD;  { wie oft wurde die mittlere       }
  450.                                        { Mouse-Taste seit der letzten     }
  451.                                        { Abfrage losgelassen ?            }
  452.  
  453. VAR
  454.   MouseRegister : Registers;
  455.  
  456. BEGIN
  457.   MouseRegister.AX := 6;
  458.   MouseRegister.BX := 2;
  459.   Intr(MouseIntr, MouseRegister);
  460.   MiddleButtonReleased := MouseRegister.BX;
  461. END;
  462.  
  463.  
  464. PROCEDURE SetXYMouse(VAR x,y : WORD);  { Mouse-Cursor positionieren       }
  465.  
  466. VAR
  467.   MouseRegister : Registers;
  468.  
  469. BEGIN
  470.   MouseRegister.AX := 4;
  471.   MouseRegister.CX := x;
  472.   MouseRegister.DX := y;
  473.   Intr(MouseIntr, MouseRegister);
  474. END;
  475.  
  476.  
  477. PROCEDURE SetXRange(VAR XMin,XMax : WORD); { minimale und maximale hori-  }
  478.                                            { zontale Position setzen      }
  479.  
  480. VAR
  481.   MouseRegister : Registers;
  482.  
  483. BEGIN
  484.   MouseRegister.AX := 7;
  485.   MouseRegister.CX := XMin;
  486.   MouseRegister.DX := XMax;
  487.   Intr(MouseIntr, MouseRegister);
  488. END;
  489.  
  490.  
  491. PROCEDURE SetYRange(VAR YMin,YMax : WORD); { minimale und maximale verti- }
  492.                                            { kale Position setzen         }
  493.  
  494.  
  495. VAR
  496.   MouseRegister : Registers;
  497.  
  498. BEGIN
  499.   MouseRegister.AX := 8;
  500.   MouseRegister.CX := YMin;
  501.   MouseRegister.DX := YMax;
  502.   Intr(MouseIntr, MouseRegister);
  503. END;
  504.  
  505.  
  506. PROCEDURE SetGraphicCursor                   { Mouse-Cursor für Grafik-    }
  507.           (VAR GraphicCursor : MouseCursor); { modus definieren            }
  508.  
  509. VAR
  510.   MouseRegister : Registers;
  511.  
  512. BEGIN
  513.   MouseRegister.AX := 9;
  514.   MouseRegister.BX := GraphicCursor.XHotSpot;
  515.   MouseRegister.CX := GraphicCursor.YHotSpot;
  516.   MouseRegister.DX := OFS(GraphicCursor);
  517.   MouseRegister.ES := SEG(GraphicCursor);
  518.   Intr(MouseIntr, MouseRegister);
  519. END;
  520.  
  521.  
  522.   PROCEDURE SetTextCursor                       { Mouse-Cursor für Text- }
  523.             (VAR TextCursor : TextCursorType);  { modus definieren       }
  524.  
  525. VAR
  526.   MouseRegister : Registers;
  527.  
  528. BEGIN
  529.   MouseRegister.AX := 10;
  530.   IF TextCursor.HardWareCursor = TRUE THEN
  531.     MouseRegister.BX := 1
  532.   ELSE
  533.     MouseRegister.BX := 0;
  534.  
  535.   MouseRegister.CX := TextCursor.ScreenMask;
  536.   MouseRegister.DX := TextCursor.CursorMask;
  537.   Intr(MouseIntr, MouseRegister);
  538. END;
  539.  
  540.  
  541. FUNCTION GetXMickey : WORD;            { horizontalen Mausbewegungs-      }
  542.                                        { (Mickey-)Zähler lesen            }
  543.  
  544. VAR
  545.   MouseRegister : Registers;
  546.  
  547. BEGIN
  548.   MouseRegister.AX := 11;
  549.   Intr(MouseIntr, MouseRegister);
  550.   GetXMickey := MouseRegister.CX;
  551. END;
  552.  
  553.  
  554. FUNCTION GetYMickey : WORD;            { vertikalen Mausbewegungs-        }
  555.                                        { (Mickey-)Zähler lesen            }
  556.  
  557. VAR
  558.   MouseRegister : Registers;
  559.  
  560. BEGIN
  561.   MouseRegister.AX := 11;
  562.   Intr(MouseIntr, MouseRegister);
  563.   GetYMickey := MouseRegister.DX;
  564. END;
  565.  
  566.  
  567. PROCEDURE SetXYMickey                    { horizontale und vertikale      }
  568.           (VAR XMickey, YMickey : WORD); { Mickey-Einheit setzen          }
  569.  
  570. VAR
  571.   MouseRegister : Registers;
  572.  
  573. BEGIN
  574.   MouseRegister.AX := 15;
  575.   MouseRegister.CX := XMickey;
  576.   MouseRegister.DX := YMickey;
  577.   Intr(MouseIntr, MouseRegister);
  578. END;
  579.  
  580.  
  581. PROCEDURE SetMouseSpeed(VAR MouseSpeed : WORD);  { Schwellenwert für die  }
  582.                                                  { doppelte Cursor-Ge-    }
  583.                                                  { schwindigkeit in       }
  584.                                                  { Mickey/Sekunde         }
  585. VAR
  586.   MouseRegister : Registers;
  587.  
  588. BEGIN
  589.   MouseRegister.AX := 19;
  590.   MouseRegister.DX := MouseSpeed;
  591.   Intr(MouseIntr, MouseRegister);
  592. END;
  593.  
  594. END.
  595.