{{DISPLAYTITLE:_MOUSEBUTTON}}
The [[_MOUSEBUTTON]] function returns the button status of a specified mouse button when read after [[_MOUSEINPUT]].


{{PageSyntax}}
: {{Parameter|buttonStatus%%}} = [[_MOUSEBUTTON]]({{Parameter|buttoNumber}})


{{PageParameters}}
* [[INTEGER]] {{Parameter|buttoNumber}} 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 


{{PageDescription}}
* Returns -1 if the corresponding {{Parameter|buttoNumber}} 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.


{{PageExamples}}
''Example 1:'' Finding the number of mouse buttons available in QB64. This could also be used for other controller devices.
{{CodeStart}} '' ''
{{Cl|FOR...NEXT|FOR}} d = 1 {{Cl|TO}} {{Cl|_DEVICES}}  '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}}
{{Cl|NEXT}}
{{Cl|PRINT}} buttons; "mouse buttons available" '' ''
{{CodeEnd}}


''Example 2:'' How to monitor when a button is down or wait until a mouse button is not held down.
{{CodeStart}} '' ''
{{Cl|PRINT}} "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}}
{{Cl|LOOP}}
{{Cl|DO...LOOP|DO}} '                                                      need to wait
    i = {{Cl|_MOUSEINPUT}} '  read #2                         until the mouse
{{Cl|LOOP}} {{Cl|UNTIL}} {{Cl|NOT}} {{Cl|_MOUSEBUTTON}}(1) '                       button is released

{{Cl|PRINT}} "DONE!" '' ''
{{CodeEnd}}


''Example 3:'' Checking for a click or a double-click by the user.
{{CodeStart}} '' ''
{{Cl|DO...LOOP|DO}}  '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}} &lt; 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
{{Cl|LOOP}} {{Cl|UNTIL}} {{Cl|INKEY$}} = {{Cl|CHR$}}(27) '' ''
{{CodeEnd}}
: ''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.
{{CodeStart}} '' ''
{{Cl|SCREEN}} 12
{{Cl|LINE}} (250, 250)-(300, 300), 14, BF

{{Cl|DO...LOOP|DO}}
  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 &lt;= 300 {{Cl|AND (boolean)|AND}} my &lt;= 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 &lt;= 300 {{Cl|AND (boolean)|AND}} my &lt;= 300 {{Cl|THEN}} {{Cl|PRINT}} "Click verified on yellow box!"
    {{Cl|END IF}}
  {{Cl|END IF}}
{{Cl|LOOP}}

{{Cl|SUB}} Mouser (x, y, b)
mi = {{Cl|_MOUSEINPUT}}
b = {{Cl|_MOUSEBUTTON}}(1)
x = {{Cl|_MOUSEX}}
y = {{Cl|_MOUSEY}}
{{Cl|END SUB}} '' ''
{{CodeEnd}}
: ''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.
{{TextStart}}{{Cb|SUB}} Catchup
{{Cb|DO...LOOP|DO}} {{Cb|WHILE}} {{Cb|_MOUSEINPUT}}: {{Cb|LOOP }}
{{Cb|END SUB}} '' ''
{{TextEnd}}
: 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:
{{CodeStart}} '' ''
{{Cl|DO...LOOP|DO}} 'main program loop in demo only
  {{Cl|LOCATE}} 10, 10: {{Cl|PRINT}} "A" 'position A, B &amp; 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}}
{{Cl|LOOP}} 'DEMO only loop use red X box to quit '' ''
{{CodeEnd}} {{small|Code by Ted Weissgerber}}
: ''Explanation:'' User can cancel letter selection by moving pointer off letter before releasing the left mouse button.


{{PageSeeAlso}}
* [[_MOUSEX]], [[_MOUSEY]], [[_MOUSEWHEEL]]
* [[_MOUSEINPUT]], [[_MOUSEMOVE]]
* [[_MOUSESHOW]], [[_MOUSEHIDE]]
* [[_DEVICES]], [[_DEVICE$]], [[_LASTBUTTON]]
* [[_BUTTON]], [[_BUTTONCHANGE]] {{text|([[DEVICES|devices]])}}
* [[Controller Devices]]


{{PageNavigation}}
