mirror of
https://github.com/QB64Official/qb64.git
synced 2024-08-22 07:55:07 +00:00
173 lines
No EOL
7.9 KiB
Text
173 lines
No EOL
7.9 KiB
Text
{{DISPLAYTITLE:_MOUSEBUTTON}}
|
|
The [[_MOUSEBUTTON]] function returns the button status of a specified mouse button when read after [[_MOUSEINPUT]].
|
|
|
|
|
|
{{PageSyntax}}
|
|
: {{Parameter|buttonStatus%%}} = [[_MOUSEBUTTON]]({{Parameter|buttoNumber}})
|
|
|
|
|
|
{{Parameters}}
|
|
* [[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}} < 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 <= 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}}
|
|
{{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 & 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}} |