Skip to content

$RESIZE

github-actions[bot] edited this page Jun 16, 2022 · 5 revisions

The _MOUSEBUTTON function returns the button status of a specified mouse button when read after _MOUSEINPUT.

= _MOUSEBUTTON()
  • INTEGER designates the mouse button to read (See _DEVICES for more than 3).
    • 1 = Left mouse button
    • 2 = Right mouse button
    • 3 = Center or scroll button
  • Returns -1 if the corresponding is pressed or zero when released.
  • 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. d = 1 'number of input devices found
  dev$ = {{Cl|_DEVICE$}}(d)
  {{Cl|IF...THEN|IF}} {{Cl|INSTR}}(dev$, "[MOUSE]") {{Cl|THEN}} buttons = {{Cl|_LASTBUTTON}}(d): {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}

buttons; "mouse buttons available"

Example 2: How to monitor when a button is down or wait until a mouse button is not held down. "Hold down the left mouse button until you want to quit!" DO

    i = {{Cl|_MOUSEINPUT}} ' read #1
    {{Cl|IF...THEN|IF}} {{Cl|_MOUSEBUTTON}}(1) {{Cl|THEN}} {{Cl|PRINT}} "Left button down!": {{Cl|EXIT DO}}

' need to wait

    i = {{Cl|_MOUSEINPUT}} '  read #2                         until the mouse

(1) ' button is released

"DONE!"

Example 3: Checking for a click or a double-click by the user. 'main program loop

  {{Cl|DO...LOOP|DO}} {{Cl|WHILE}} {{Cl|_MOUSEINPUT}}                'check mouse status
    buttondown = {{Cl|_MOUSEBUTTON}}(1)
  {{Cl|LOOP}}
  {{Cl|DO...LOOP|DO}} {{Cl|WHILE}} buttondown                 'check for button release
    i = {{Cl|_MOUSEINPUT}}
    buttondown = {{Cl|_MOUSEBUTTON}}(1)
    Click = 1
  {{Cl|LOOP}}
  {{Cl|IF...THEN|IF}} Click = 1 {{Cl|THEN}}                   'if button was pressed and released
    t = {{Cl|TIMER}} + .3
    {{Cl|DO...LOOP|DO}} {{Cl|WHILE}} {{Cl|TIMER}} < t      'check for a second press within .3 seconds
      i = {{Cl|_MOUSEINPUT}}
      {{Cl|IF...THEN|IF}} {{Cl|_MOUSEBUTTON}}(1) {{Cl|THEN}} Click = 2: {{Cl|EXIT DO}}
    {{Cl|LOOP}}
    {{Cl|IF...THEN|IF}} Click = 2 {{Cl|THEN}} {{Cl|PRINT}} "Double click" {{Cl|ELSE}} {{Cl|PRINT}} "Click"
  {{Cl|END IF}}
  Click = 0: buttondown = 0            'reset where needed

= (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. 12 (250, 250)-(300, 300), 14, BF
  Mouser mx, my, mb
  {{Cl|IF...THEN|IF}} mb {{Cl|THEN}}
    {{Cl|IF...THEN|IF}} mx >= 250 {{Cl|AND (boolean)|AND}} my >= 250 {{Cl|AND (boolean)|AND}} mx <= 300 {{Cl|AND (boolean)|AND}} my <= 300 {{Cl|THEN}} 'button down
      {{Cl|DO...LOOP|DO}} {{Cl|WHILE}} mb 'wait for button release
        Mouser mx, my, mb
      {{Cl|LOOP}}
      'verify mouse still in box area
      {{Cl|IF...THEN|IF}} mx >= 250 {{Cl|AND (boolean)|AND}} my >= 250 {{Cl|AND (boolean)|AND}} mx <= 300 {{Cl|AND (boolean)|AND}} my <= 300 {{Cl|THEN}} {{Cl|PRINT}} "Click verified on yellow box!"
    {{Cl|END IF}}
  {{Cl|END IF}}

Mouser (x, y, b) mi = b = (1) x = y =

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.
Catchup :
The above procedure can be used to catch up after INPUT, LINE INPUT or INPUT$ delays when mouse input may accumulate.
Example 5: Combining mouse button or keyboard selections in a menu or test: 'main program loop in demo only
  {{Cl|LOCATE}} 10, 10: {{Cl|PRINT}} "A" 'position A, B & C in same position on every question
  {{Cl|LOCATE}} 12, 10: {{Cl|PRINT}} "B"
  {{Cl|LOCATE}} 14, 10: {{Cl|PRINT}} "C" 'demo only
  {{Cl|DO...LOOP|DO}}: {{Cl|_LIMIT}} 10 'get user answer loop
    {{Cl|DO...LOOP|DO}} {{Cl|WHILE}} {{Cl|_MOUSEINPUT}}: {{Cl|LOOP}} 'read mouse
    K$ = {{Cl|UCASE$}}({{Cl|INKEY$}}) 'read keypresses also
    x% = {{Cl|_MOUSEX}}
    y% = {{Cl|_MOUSEY}}
    Lclick = {{Cl|_MOUSEBUTTON}}(1)
    {{Cl|LOCATE}} 20, 10: {{Cl|PRINT}} x%, y%, Lclick 'only used to find mouse coordinates
    {{Cl|IF...THEN|IF}} x% = 10 {{Cl|AND (boolean)|AND}} y% = 10 {{Cl|AND (boolean)|AND}} Lclick {{Cl|THEN}} 'position clicked
      DO
        i = {{Cl|_MOUSEINPUT}}
        x% = {{Cl|_MOUSEX}}
        y% = {{Cl|_MOUSEY}}
      {{Cl|LOOP}} {{Cl|WHILE}} {{Cl|_MOUSEBUTTON}}(1)
      {{Cl|IF...THEN|IF}} x% = 10 {{Cl|AND (boolean)|AND}} y% = 10 {{Cl|THEN}} K$ = "A" 'position released
    {{Cl|END IF}}
    {{Cl|IF...THEN|IF}} x% = 10 {{Cl|AND (boolean)|AND}} y% = 12 {{Cl|AND (boolean)|AND}} Lclick {{Cl|THEN}} 'position clicked
      DO
        i = {{Cl|_MOUSEINPUT}}
        x% = {{Cl|_MOUSEX}}
        y% = {{Cl|_MOUSEY}}
      {{Cl|LOOP}} {{Cl|WHILE}} {{Cl|_MOUSEBUTTON}}(1)
      {{Cl|IF...THEN|IF}} x% = 10 {{Cl|AND (boolean)|AND}} y% = 12 {{Cl|THEN}} K$ = "B" 'position released
    {{Cl|END IF}}
    {{Cl|IF...THEN|IF}} x% = 10 {{Cl|AND (boolean)|AND}} y% = 14 {{Cl|AND (boolean)|AND}} Lclick {{Cl|THEN}} 'position clicked
      DO
        i = {{Cl|_MOUSEINPUT}}
        x% = {{Cl|_MOUSEX}}
        y% = {{Cl|_MOUSEY}}
      {{Cl|LOOP}} {{Cl|WHILE}} {{Cl|_MOUSEBUTTON}}(1)
      {{Cl|IF...THEN|IF}} x% = 10 {{Cl|AND (boolean)|AND}} y% = 14 {{Cl|THEN}} K$ = "C" 'position released
    {{Cl|END IF}}
  {{Cl|LOOP}} {{Cl|UNTIL}} K$ = "A" {{Cl|OR (boolean)|OR}} K$ = "B" {{Cl|OR (boolean)|OR}} K$ = "C" '{{Cl|GOTO}} next question
  {{Cl|IF...THEN|IF}} {{Cl|LEN}}(K$) {{Cl|THEN}} 'DEMO ONLY
    {{Cl|LOCATE}} 22, 35: {{Cl|PRINT}} "  Answer = "; K$ 'display user answer at location
    {{Cl|_DELAY}} 2 'allow time for user to view answer
    {{Cl|LOCATE}} 22, 35: {{Cl|PRINT}} "SELECT AGAIN"
    K$ = "" 'reset K$
  {{Cl|END IF}}

'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.

Clone this wiki locally