MOUSEBUTTON
From QB64 Wiki
_MOUSEBUTTON Function returns the button status of a specified mouse button when read after _MOUSEINPUT.
- buttonstatus% = _MOUSEBUTTON(button_number)
- INTEGER button number designates the mouse button to read (currently just the top 3).
- 1 = Left mouse button
- 2 = Right mouse button
- 3 = Center or scroll button
Usage:
- Returns -1 if the corresponding numbered button is pressed and zero when released.
- The button parameter is 1 for the Left button, 2 for the right and 3 for the center button. Other buttons are currently not available.
- Read _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 statement or other interruption.
- To clear unread mouse input, use a _MOUSEINPUT loop that loops until it returns 0.
- Use _DEVICE$ to find the "[MOUSE]" _DEVICES number to find the number of buttons available using _LASTBUTTON.
- Note: The center mouse button can also be read as _BUTTON(2) on _DEVICEINPUT(2) when a mouse is present.
Example 1: Finding the number of mouse buttons available in QB64. This could also be used for other controller devices.
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"
Example 2: How to monitor when a button is down or wait until a mouse button is not held down.
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!"
Example 3: Checking for a click or a double-click by the user.
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 repeatedly. The TIMER loop looks for a second click.
Example 4: Verifying that a user clicked and released a mouse button on a program button.
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 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 only loop.
SUB Catchup DO WHILE _MOUSEINPUT: LOOP END SUB
- The above procedure can be used to catch up after INPUT, LINE INPUT or INPUT$ delays when mouse input may accumulate.
See also:
- _MOUSEX, _MOUSEY, _MOUSEWHEEL
- _MOUSEINPUT, _MOUSEMOVE
- _MOUSESHOW, _MOUSEHIDE
- _DEVICES, _DEVICE$, _LASTBUTTON
- _BUTTON, _BUTTONCHANGE (devices)
- Controller_Devices
- SDL Mouse Button Down Library