mirror of
https://github.com/QB64Official/qb64.git
synced 2024-08-22 11:25:08 +00:00
188 lines
5.9 KiB
Markdown
188 lines
5.9 KiB
Markdown
The [_MOUSEBUTTON](_MOUSEBUTTON) function returns the button status of a specified mouse button when read after [_MOUSEINPUT](_MOUSEINPUT).
|
|
|
|
## Syntax
|
|
|
|
> buttonStatus%% = [_MOUSEBUTTON](_MOUSEBUTTON)(buttoNumber)
|
|
|
|
## Parameter(s)
|
|
|
|
* [INTEGER](INTEGER) buttoNumber designates the mouse button to read (See [_DEVICES](_DEVICES) for more than 3).
|
|
* 1 = Left mouse button
|
|
* 2 = Right mouse button
|
|
* 3 = Center or scroll button
|
|
|
|
## Description
|
|
|
|
* Returns -1 if the corresponding buttoNumber is pressed or zero when released.
|
|
* Read [_MOUSEINPUT](_MOUSEINPUT) first to return the current button up or down status. (See Example 2)
|
|
* Button clicks and mouse movements will be remembered and should be cleared after an [INPUT](INPUT) statement or other interruption.
|
|
* To clear unread mouse input, use a [_MOUSEINPUT](_MOUSEINPUT) loop that loops until it returns 0.
|
|
* Use [_DEVICE$](_DEVICE$) to find the "[MOUSE]" [_DEVICES](_DEVICES) number to find the number of buttons available using [_LASTBUTTON](_LASTBUTTON).
|
|
* **Note:** The center mouse button can also be read as [_BUTTON](_BUTTON)(2) on [_DEVICEINPUT](_DEVICEINPUT)(2) when a mouse is present.
|
|
|
|
## Example(s)
|
|
|
|
Finding the number of mouse buttons available in QB64. This could also be used for other controller devices.
|
|
|
|
```vb
|
|
|
|
FOR d = 1 TO _DEVICES 'number of input devices found
|
|
dev$ = _DEVICE$(d)
|
|
IF INSTR(dev$, "[MOUSE]") THEN buttons = _LASTBUTTON(d): EXIT FOR
|
|
NEXT
|
|
PRINT buttons; "mouse buttons available"
|
|
|
|
```
|
|
|
|
How to monitor when a button is down or wait until a mouse button is not held down.
|
|
|
|
```vb
|
|
|
|
PRINT "Hold down the left mouse button until you want to quit!"
|
|
DO
|
|
i = _MOUSEINPUT ' read #1
|
|
IF _MOUSEBUTTON(1) THEN PRINT "Left button down!": EXIT DO
|
|
LOOP
|
|
DO ' need to wait
|
|
i = _MOUSEINPUT ' read #2 until the mouse
|
|
LOOP UNTIL NOT _MOUSEBUTTON(1) ' button is released
|
|
|
|
PRINT "DONE!"
|
|
|
|
```
|
|
|
|
Checking for a click or a double-click by the user.
|
|
|
|
```vb
|
|
|
|
DO 'main program loop
|
|
|
|
DO WHILE _MOUSEINPUT 'check mouse status
|
|
buttondown = _MOUSEBUTTON(1)
|
|
LOOP
|
|
DO WHILE buttondown 'check for button release
|
|
i = _MOUSEINPUT
|
|
buttondown = _MOUSEBUTTON(1)
|
|
Click = 1
|
|
LOOP
|
|
|
|
IF Click = 1 THEN 'if button was pressed and released
|
|
t = TIMER + .3
|
|
DO WHILE TIMER < t 'check for a second press within .3 seconds
|
|
i = _MOUSEINPUT
|
|
IF _MOUSEBUTTON(1) THEN Click = 2: EXIT DO
|
|
LOOP
|
|
IF Click = 2 THEN PRINT "Double click" ELSE PRINT "Click"
|
|
END IF
|
|
Click = 0: buttondown = 0 'reset where needed
|
|
LOOP UNTIL INKEY$ = CHR$(27)
|
|
|
|
```
|
|
|
|
> *Explanation:* To find the current button status read [_MOUSEINPUT](_MOUSEINPUT) repeatedly. The [TIMER](TIMER) loop looks for a second click.
|
|
|
|
Verifying that a user clicked and released a mouse button on a program button.
|
|
|
|
```vb
|
|
|
|
SCREEN 12
|
|
LINE (250, 250)-(300, 300), 14, BF
|
|
|
|
DO
|
|
Mouser mx, my, mb
|
|
IF mb THEN
|
|
IF mx >= 250 AND my >= 250 AND mx <= 300 AND my <= 300 THEN 'button down
|
|
DO WHILE mb 'wait for button release
|
|
Mouser mx, my, mb
|
|
LOOP
|
|
'verify mouse still in box area
|
|
IF mx >= 250 AND my >= 250 AND mx <= 300 AND my <= 300 THEN PRINT "Click verified on yellow box!"
|
|
END IF
|
|
END IF
|
|
LOOP
|
|
|
|
SUB Mouser (x, y, b)
|
|
mi = _MOUSEINPUT
|
|
b = _MOUSEBUTTON(1)
|
|
x = _MOUSEX
|
|
y = _MOUSEY
|
|
END SUB
|
|
|
|
```
|
|
|
|
> *Explanation:* The mouse SUB has no internal [_MOUSEINPUT](_MOUSEINPUT) loop so that no button presses, releases or moves are missed.
|
|
> If the above read procedure goes to another one, it may be advisable to skip over unread input in a [_MOUSEINPUT](_MOUSEINPUT) only loop.
|
|
|
|
```text
|
|
|
|
SUB Catchup
|
|
DO WHILE _MOUSEINPUT: LOOP
|
|
END SUB
|
|
|
|
```
|
|
|
|
> The above procedure can be used to catch up after [INPUT](INPUT), [LINE INPUT](LINE-INPUT) or [INPUT$](INPUT$) delays when mouse input may accumulate.
|
|
|
|
Combining mouse button or keyboard selections in a menu or test:
|
|
|
|
```vb
|
|
|
|
DO 'main program loop in demo only
|
|
LOCATE 10, 10: PRINT "A" 'position A, B & C in same position on every question
|
|
LOCATE 12, 10: PRINT "B"
|
|
LOCATE 14, 10: PRINT "C" 'demo only
|
|
|
|
DO: _LIMIT 10 'get user answer loop
|
|
DO WHILE _MOUSEINPUT: LOOP 'read mouse
|
|
K$ = UCASE$(INKEY$) 'read keypresses also
|
|
x% = _MOUSEX
|
|
y% = _MOUSEY
|
|
Lclick = _MOUSEBUTTON(1)
|
|
|
|
LOCATE 20, 10: PRINT x%, y%, Lclick 'only used to find mouse coordinates
|
|
IF x% = 10 AND y% = 10 AND Lclick THEN 'position clicked
|
|
DO
|
|
i = _MOUSEINPUT
|
|
x% = _MOUSEX
|
|
y% = _MOUSEY
|
|
LOOP WHILE _MOUSEBUTTON(1)
|
|
IF x% = 10 AND y% = 10 THEN K$ = "A" 'position released
|
|
END IF
|
|
IF x% = 10 AND y% = 12 AND Lclick THEN 'position clicked
|
|
DO
|
|
i = _MOUSEINPUT
|
|
x% = _MOUSEX
|
|
y% = _MOUSEY
|
|
LOOP WHILE _MOUSEBUTTON(1)
|
|
IF x% = 10 AND y% = 12 THEN K$ = "B" 'position released
|
|
END IF
|
|
IF x% = 10 AND y% = 14 AND Lclick THEN 'position clicked
|
|
DO
|
|
i = _MOUSEINPUT
|
|
x% = _MOUSEX
|
|
y% = _MOUSEY
|
|
LOOP WHILE _MOUSEBUTTON(1)
|
|
IF x% = 10 AND y% = 14 THEN K$ = "C" 'position released
|
|
END IF
|
|
LOOP UNTIL K$ = "A" OR K$ = "B" OR K$ = "C" 'GOTO next question
|
|
|
|
IF LEN(K$) THEN 'DEMO ONLY
|
|
LOCATE 22, 35: PRINT " Answer = "; K$ 'display user answer at location
|
|
_DELAY 2 'allow time for user to view answer
|
|
LOCATE 22, 35: PRINT "SELECT AGAIN"
|
|
K$ = "" 'reset K$
|
|
END IF
|
|
LOOP 'DEMO only loop use red X box to quit
|
|
|
|
```
|
|
|
|
> *Explanation:* User can cancel letter selection by moving pointer off letter before releasing the left mouse button.
|
|
|
|
## See Also
|
|
|
|
* [_MOUSEX](_MOUSEX), [_MOUSEY](_MOUSEY), [_MOUSEWHEEL](_MOUSEWHEEL)
|
|
* [_MOUSEINPUT](_MOUSEINPUT), [_MOUSEMOVE](_MOUSEMOVE)
|
|
* [_MOUSESHOW](_MOUSESHOW), [_MOUSEHIDE](_MOUSEHIDE)
|
|
* [_DEVICES](_DEVICES), [_DEVICE$](_DEVICE$), [_LASTBUTTON](_LASTBUTTON)
|
|
* [_BUTTON](_BUTTON), [_BUTTONCHANGE](_BUTTONCHANGE) ([_DEVICES](_DEVICES))
|
|
* [Controller Devices](Controller-Devices)
|