forked from QB64-Phoenix-Edition/QB64pe
-
Notifications
You must be signed in to change notification settings - Fork 0
$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.
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.
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.
- The above procedure can be used to catch up after INPUT, LINE INPUT or INPUT$ delays when mouse input may accumulate.
{{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.