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