QB64 Phoenix Edition
Mapping screen for mouse - Printable Version

+- QB64 Phoenix Edition (https://qb64phoenix.com/forum)
+-- Forum: QB64 Rising (https://qb64phoenix.com/forum/forumdisplay.php?fid=1)
+--- Forum: Code and Stuff (https://qb64phoenix.com/forum/forumdisplay.php?fid=3)
+---- Forum: Help Me! (https://qb64phoenix.com/forum/forumdisplay.php?fid=10)
+---- Thread: Mapping screen for mouse (/showthread.php?tid=1882)

Pages: 1 2 3 4


RE: Mapping screen for mouse - CharlieJV - 08-07-2023

(08-07-2023, 10:03 PM)justsomeguy Wrote:
Quote:This is only problematic if a zone has sub-zones.
Sub zones aren't really a problem.

Code: (Select All)
_DEST hiddenScreen
finalColor = _RGBA32(zone, subzone, subsubzone,subsubsubzone)
LINE(10, 10)-(30 ,20), finalcolor, BF
Code: (Select All)
DO WHILE _MOUSEINPUT '      Check the mouse status
  mx = _MOUSEX
  my = _MOUSEY
LOOP

_SOURCE hiddenScreen
pt = POINT(mx,my)
zone = _red(pt)
subzone = _green(pt)
subsubzone = _blue(pt)
subsubsubzone = _alpha(pt)
_SOURCE 0

Oh yeah, rbga components.  I was just thinking "a color".

That's brilliant!


RE: Mapping screen for mouse - bplus - 08-07-2023

(08-07-2023, 09:22 PM)justsomeguy Wrote: Perhaps it would be better to demonstrate.

This is a GUI demo program I was writing for a bigger project. I utilize the technique I talked about earlier.

You can currently resize and move windows. You double-click to add windows and close them.

Sorry, its messy, I never intended to share it until was in a better state.

Hey, really nice start on GUI! I am curious about XML stuff but this is wrong thread to ask.


RE: Mapping screen for mouse - grymmjack - 08-08-2023

(08-07-2023, 07:55 PM)justsomeguy Wrote: A method that I've used, which is relatively simple to implement, is use screen masking.

You draw your menu or whatever on the first screen like normal.

Then you create an image the same size as your target screen. This will be the hidden overlay.
Code: (Select All)
hiddenScreen = _NEWIMAGE(_WIDTH(0), _HEIGHT(0), 32)
 
On the second screen (the hidden screen) you mask off the areas that you want the mouse to be sensitive to, and you assign specific colors to those areas.

Code: (Select All)
myButton_1 = 1 ' Assign Numbers to masked off areas (colors)
myButton_2 = 2

_DEST hiddenScreen
LINE(10, 10) - (30 ,20), myButton_1, BF
LINE(50, 10) - (80 ,20), myButton_2, BF
_DEST 0
And when you want check your mouse.

Code: (Select All)
DO WHILE _MOUSEINPUT '      Check the mouse status
  mx = _MOUSEX
  my = _MOUSEY
LOOP

_SOURCE hiddenScreen
buttonTouched = POINT(mx ,my)
_SOURCE 0


I find this easier than making a large number of conditionals for my mouse position.

(Forgive me, I haven't tested this code, but it conveys the general idea.)
Clever!

Sort of like an HTML Image map. (Map element). That's a good easy way to separate things too. If mouse is over hidden part will POINT() return 0 or ?

Really smart!


RE: Mapping screen for mouse - grymmjack - 08-08-2023

(08-07-2023, 02:36 PM)bplus Wrote: Yeah this is essential functionality, it is core of my GUI stuff and just about any game I've done.

SdlBasic called these MouseZones and had a function for IDing which you were in.

My goodness another basic! This one uses SDL nice! Does it work on Linux?


RE: Mapping screen for mouse - grymmjack - 08-08-2023

(08-07-2023, 03:29 PM)TerryRitchie Wrote:
(08-07-2023, 02:32 PM)grymmjack Wrote:
(08-07-2023, 08:36 AM)TerryRitchie Wrote: Here's a quick and dirty demo I wrote as another possibility of defining screen areas to interact with the mouse.
Your version of quick and dirty is of great quality! Is it OK to use this in our own projects?

This is an awesome example, thank you for sharing it! Heart

Screenshot for others:

[Image: mouse-ritchie.png]
Thank you. Any and all code I post is freely available to everyone to modify and use for their needs. Hack away Smile
Awesome thank you. Your code is easy to understand and follow. I never finished studying the tutorials you made. Now I know I should. Also, have you done any more?

Thanks @TerryRitchie !


RE: Mapping screen for mouse - grymmjack - 08-08-2023

(08-07-2023, 09:37 PM)CharlieJV Wrote:
(08-07-2023, 03:34 PM)TerryRitchie Wrote:
(08-07-2023, 02:36 PM)bplus Wrote: Yeah this is essential functionality, it is core of my GUI stuff and just about any game I've done.

SdlBasic called these MouseZones and had a function for IDing which you were in.
.
Need to test the daylights out of it first, but _mouseZone(x,y,w,h), w and h being optional, as in _mouseZone(x,y) meaning 1 pixel wide and 1 pixel tall, later tonight in a new version of BAM.

No pressure ?

ARG!  Screenshot did not capture the mouse pointer.
This is why the internet is great. Look at all the good stuff happening. You guys are the best. 

This is the spirit of community I remember from the old days. 

Sorry, I am just moved inside to see this good work and altruism and so on. Hope for the world, a light on the hill. Etc. 

A virtuous nerd fam. Heart


RE: Mapping screen for mouse - CharlieJV - 08-08-2023

(08-07-2023, 09:37 PM)CharlieJV Wrote: Need to test the daylights out of it first, but _mouseZone(x,y,w,h), w and h being optional, as in _mouseZone(x,y) meaning 1 pixel wide and 1 pixel tall, later tonight in a new version of BAM.

Done: https://basicanywheremachine-news.blogspot.com/2023/08/mousezone-function.html


RE: Mapping screen for mouse - TerryRitchie - 08-08-2023

I updated my previous code to be more in line to what @Bplus pointed out that SDLBasic used.

@grymmjack you may find this updated version better suited for your needs. Much cleaner and simpler to use.

There's a few more commands available documented within the subroutines and functions as to their use.

This version is much cleaner than the quick and dirty I posted yesterday.

Code: (Select All)
OPTION _EXPLICIT

CONST FALSE = 0, TRUE = NOT FALSE ' truth detectors
CONST SWIDTH = 800, SHEIGHT = 600 ' main screen dimensions

TYPE TYPE_POINT '                   POINT PROPERTIES
    x AS INTEGER '                  x coordinate
    y AS INTEGER '                  y coordinate
END TYPE

TYPE TYPE_AREA '                    AREA PROPERTIES
    min AS TYPE_POINT '             upper left coordinate
    max AS TYPE_POINT '             lower right coordinate
END TYPE

TYPE TYPE_ZONE '                    ZONE PROPERTIES
    Area AS TYPE_AREA '             area within zone
    Active AS INTEGER '             this zone is available to mouse (t/f)
END TYPE

TYPE TYPE_MOUSE '                   MOUSE PROPERTIES
    x AS INTEGER '                  x location
    y AS INTEGER '                  y location
    ZoneTrap AS INTEGER '           zone area mouse trapped in (0 for none)
    Hovering AS INTEGER '           zone area mouse is hovering over (0 for none)
    Area AS TYPE_AREA '             trapped mouse area
END TYPE

REDIM Zone(0) AS TYPE_ZONE '        zone area array
DIM Mouse AS TYPE_MOUSE '           mouse properties
DIM MouseIMG AS LONG '              mouse pointer image
DIM Cursor AS STRING '              pointer creation variables
DIM CursorPos AS INTEGER
DIM x AS INTEGER
DIM y AS INTEGER
DIM Zone1 AS INTEGER '              defined mouse zones
DIM Zone2 AS INTEGER
DIM Zone3 AS INTEGER
DIM Zone4 AS INTEGER
DIM Zone5 AS INTEGER

'+------------------------+
'| Create a mouse pointer |
'+------------------------+

Cursor = Cursor + "0           " ' quick and dirty mouse cursor
Cursor = Cursor + "00          "
Cursor = Cursor + "010         "
Cursor = Cursor + "0110        "
Cursor = Cursor + "01110       "
Cursor = Cursor + "011110      "
Cursor = Cursor + "0111110     "
Cursor = Cursor + "01111110    "
Cursor = Cursor + "011111110   "
Cursor = Cursor + "0111111110  "
Cursor = Cursor + "01111111110 "
Cursor = Cursor + "011111111110"
Cursor = Cursor + "011111100000"
Cursor = Cursor + "01110110    "
Cursor = Cursor + "0110 0110   "
Cursor = Cursor + "010  0110   "
Cursor = Cursor + "00    0110  "
Cursor = Cursor + "      0110  "
Cursor = Cursor + "       0110 "
Cursor = Cursor + "       0110 "
Cursor = Cursor + "        00  "
MouseIMG = _NEWIMAGE(12, 21, 32) ' mouse icon image holder
_DEST MouseIMG '                   draw on icon image
CursorPos = 0
FOR y = 0 TO 20
    FOR x = 0 TO 11
        CursorPos = CursorPos + 1
        SELECT CASE MID$(Cursor, CursorPos, 1)
            CASE "0"
                PSET (x, y), _RGB32(0, 0, 0)
            CASE "1"
                PSET (x, y), _RGB32(255, 255, 255)
        END SELECT
    NEXT x
NEXT y
_DEST 0

'+-------------------+
'| Define zone areas |
'+-------------------+

Zone1 = DefineMouseZone(10, 10, 80, 80, TRUE) '    (x1, y1, width, height, Active)
Zone2 = DefineMouseZone(100, 10, 80, 80, TRUE)
Zone3 = DefineMouseZone(10, 100, 170, 80, TRUE)
Zone4 = DefineMouseZone(190, 10, 170, 170, TRUE)
Zone5 = DefineMouseZone(10, 190, 350, 350, TRUE)

SCREEN _NEWIMAGE(800, 600, 32)
_TITLE "MouseZone"
_MOUSEHIDE
'HideZone Zone3 ' hide zone 3 from the mouse

DO
    _LIMIT 30
    CLS

    '+---------------------------------------+
    '| Supply the user with some information |
    '+---------------------------------------+

    LOCATE 2, 50: PRINT "Move mouse to select zone area."
    LOCATE 4, 50: PRINT "Left mouse button to trap mouse pointer."
    LOCATE 6, 50: PRINT "Right mouse button to release mouse pointer."
    LOCATE 8, 50: PRINT "ESC to exit."
    LOCATE 10, 50:
    IF MouseHovering(0) THEN '                                          check all zones for a hovering mouse
        PRINT "Currently hovering zone area"; MouseHovering(0) '        print returned zone handle value
    ELSE
        PRINT "Mouse not currently hovering over a zone."
    END IF
    LOCATE 12, 50
    IF MouseTrapped(0) THEN '                                           check all zones for a trapped mouse
        PRINT "Currently trapped in zone"; MouseTrapped(0) '            print returned zone handle value
    ELSE
        PRINT "Mouse not currently trapped."
    END IF
    LOCATE 14, 50: PRINT "This zone is defined as ";
    IF MouseZone(Zone1) THEN PRINT CHR$(34); "Zone1"; CHR$(34) '        check each individual zone for mouse interaction
    IF MouseZone(Zone2) THEN PRINT CHR$(34); "Zone2"; CHR$(34)
    IF MouseZone(Zone3) THEN PRINT CHR$(34); "Zone3"; CHR$(34)
    IF MouseZone(Zone4) THEN PRINT CHR$(34); "Zone4"; CHR$(34)
    IF MouseZone(Zone5) THEN PRINT CHR$(34); "Zone5"; CHR$(34)

    '+-----------------------------------------+
    '| Draw border(s) around chosen zone areas |
    '+-----------------------------------------+

    DrawBorder 0 '        draw borders around all zones (optional)

    '+--------------------------------+
    '| Update all defined mouse zones |
    '+--------------------------------+

    UpdateMouseZone '                                                   manage any mouse trapping that is occurring
    _DISPLAY '            update screen with changes
LOOP UNTIL _KEYDOWN(27) ' leave when ESC pressed
SYSTEM '                  return to OS

'---------------------------------------------------------------------------------------------------------------------------------
SUB HideZone (z AS INTEGER)

    '+-----------------------------+
    '| Hides a zone from the mouse |
    '|                             |
    '| z - the zone handle to hide |
    '+-----------------------------+

    SHARED Zone() AS TYPE_ZONE ' need access to mouse zones

    Zone(z).Active = 0 ' hide zone from mouse

END SUB

'---------------------------------------------------------------------------------------------------------------------------------
SUB ShowZone (z AS INTEGER)

    '+------------------------------------+
    '| Reveals a hidden zone to the mouse |
    '|                                    |
    '| z - the zone handle to reveal      |
    '+------------------------------------+

    SHARED Zone() AS TYPE_ZONE ' need access to mouse zones

    Zone(z).Active = -1 ' allow mouse to see zone

END SUB

'---------------------------------------------------------------------------------------------------------------------------------
SUB DrawBorder (z AS INTEGER)

    '+-------------------------------------------------------------------+
    '| Draws a border around a zone area depecting the current state:    |
    '|    Bright white - mouse is trapped in this zone                   |
    '|    White        - mouse is hovering over this zone                |
    '|    Gray         - mouse has no interation with this zone          |
    '|                                                                   |
    '| z - The zone to draw a border around                              |
    '|     Supply the value of 0 to have borders drawn around all zones  |
    '+-------------------------------------------------------------------+

    SHARED Zone() AS TYPE_ZONE '         need access to mouse zones
    SHARED Mouse AS TYPE_MOUSE '         need access to mouse properties
    STATIC Colour(2) AS _UNSIGNED LONG ' border colors
    DIM c AS INTEGER '                   zone counter (start of count)
    DIM Finish AS INTEGER '              end of zone counter
    DIM Border AS INTEGER '              border color

    IF UBOUND(Zone) = 0 OR z > UBOUND(Zone) THEN EXIT SUB ' leave if no defined zone areas
    IF NOT Colour(0) THEN '                                 set border colors if not set yet
        Colour(0) = _RGB32(127, 127, 127) '                 not hovering (gray)
        Colour(1) = _RGB32(192, 192, 192) '                 hovering (white)
        Colour(2) = _RGB32(255, 255, 255) '                 trapped (bright white)
    END IF
    IF z = 0 THEN '                                         draw borders around all zones?
        c = 0 '                                             yes, start at the beginning of zone array
        Finish = UBOUND(Zone) '                             finish at the end of the zone array
    ELSE '                                                  no, just a single zone
        c = z - 1 '                                         start at the individual zone in array
        Finish = z '                                        finish at the individual zone in array
    END IF
    DO '                                                    cycle through chosen zone(s)
        c = c + 1 '                                         increment zone counter
        IF Zone(c).Active THEN '                            is tis zone active?
            Border = 0 '                                    yes, assume no interaction with zone
            IF MouseHovering(c) THEN Border = 1 '           white border if mouse is hovering this zone
            IF MouseTrapped(c) THEN Border = 2 '            bright white border if mouse is trapped in this zone
            LINE (Zone(c).Area.min.x, Zone(c).Area.min.y)-(Zone(c).Area.max.x, Zone(c).Area.max.y), Colour(Border), B ' draw border
        END IF
    LOOP UNTIL c = Finish '                                 leave when zone(s) processed

END SUB

'---------------------------------------------------------------------------------------------------------------------------------
FUNCTION MouseHovering (z AS INTEGER)

    '+--------------------------------------------------------------------------------------------------+
    '| Report mouse hovering status over a zone(s)                                                      |
    '|                                                                                                  |
    '| z - the zone's handle to check for a hovering mouse                                        (>0)  |
    '|     supplying a value of 0 will simply return the zone handle where the mouse is hovering  (0)   |
    '| Returns -1 (TRUE) if the mouse is hovering on the requested zone                           (-1)  |
    '| Returns a zone handle value if the zone requested is 0 and the mouse is hovering somewhere (>=0) |
    '| Returns 0 (FALSE) if the mouse is not hovering in either scenario                          (0)   |
    '+--------------------------------------------------------------------------------------------------+

    SHARED Zone() AS TYPE_ZONE ' need access to mouse zones
    SHARED Mouse AS TYPE_MOUSE ' need access to mouse properties

    MouseHovering = 0 '                      assume mouse is not hovering                           (0 FALSE return)
    IF Mouse.Hovering THEN '                 is the mouse hovering over a zone?
        IF z > 0 THEN '                      yes, was a zone requested?                             (>0)
            IF z = Mouse.Hovering THEN '     yes, is mouse hovering over the zone requested?
                MouseHovering = z '          yes, report that mouse is hovering over requested zone (-1 TRUE return)
            END IF
        ELSE '                               no, a zone was not requested
            MouseHovering = Mouse.Hovering ' report any zone handle the mouse may be hovering over  (>=0 TRUE or FALSE return)
        END IF
    END IF

END FUNCTION

'---------------------------------------------------------------------------------------------------------------------------------
FUNCTION MouseZone (z AS INTEGER)

    '+-------------------------------------------------------+
    '| Report interaction status of mouse and zone area      |
    '|                                                       |
    '| z - the zone's handle                                 |
    '| Returns -1 (TRUE) if interaction, 0 (FALSE) otherwise |
    '+-------------------------------------------------------+

    SHARED Zone() AS TYPE_ZONE ' need access to mouse zones
    SHARED Mouse AS TYPE_MOUSE ' need access to mouse properties
    DIM Trapped AS INTEGER '     mouse trapped status

    IF NOT Zone(z).Active THEN EXIT FUNCTION ' leave is zone is inactive
    MouseZone = 0 '                            assume mouse not interacting with zone           (0 FALSE return)
    Trapped = MouseTrapped(0) '                record zone mouse may be trapped in
    IF Trapped THEN '                          is mouse trapped in a zone?
        IF z = Trapped THEN '                  yes, is it this zone?
            MouseZone = -1 '                   yes, report the only interaction that can happen (-1 TRUE return)
        END IF
    ELSE '                                     no, mouse if currently free
        IF MouseHover(Zone(z).Area) THEN '     is mouse interacting with this zone?
            MouseZone = -1 '                   yes, report that mouse is in this zone           (-1 TRUE return)
        END IF
    END IF

END FUNCTION

'---------------------------------------------------------------------------------------------------------------------------------
SUB TrapMouse (z AS INTEGER)

    '+---------------------------------------------+
    '| Trap mouse within a zone's area             |
    '|                                             |
    '| z - the handle of the zone to trap mouse in |
    '+---------------------------------------------+

    SHARED Zone() AS TYPE_ZONE ' need access to mouse zones
    SHARED Mouse AS TYPE_MOUSE ' need access to mouse properties

    IF NOT Zone(z).Active THEN EXIT SUB ' can't trap mouse in inactive zone
    Mouse.Area = Zone(z).Area '           define trapped area
    Mouse.ZoneTrap = z '                  mouse trapped in this zone  (>0)

END SUB

'---------------------------------------------------------------------------------------------------------------------------------
FUNCTION MouseTrapped (z AS INTEGER)

    '+-------------------------------------------------------------------------------------------------+
    '| Report mouse trapped status                                                                     |
    '|                                                                                                 |
    '| z - the zone's handle to check for a trapped mouse                                        (>0)  |
    '|     supplying a value of 0 will simply return the zone handle where the mouse is trapped  (0)   |
    '| Returns -1 (TRUE) if the mouse is trapped in the requested zone                           (-1)  |
    '| Returns a zone handle value if the zone requested is 0 and the mouse is trapped somewhere (>=0) |
    '| Returns 0 (FALSE) if the mouse is not trapped in either scenario                          (0)   |
    '+-------------------------------------------------------------------------------------------------+

    SHARED Zone() AS TYPE_ZONE ' need access to mouse zones
    SHARED Mouse AS TYPE_MOUSE ' need access to mouse properties

    MouseTrapped = 0 '                              assume mouse is not trapped                         (0 FALSE return)
    IF Mouse.ZoneTrap THEN '                        is the mouse trapped in a zone?
        IF z > 0 THEN '                             yes, was a zone requested?                          (>0)
            IF z = Mouse.ZoneTrap THEN '            yes, is mouse trapped in zone requested?
                MouseTrapped = -1 '                 yes, report that mouse is trapped in requested zone (-1 TRUE return)
            END IF
        ELSE '                                      no, a zone was not requested                        (0)
            MouseTrapped = Mouse.ZoneTrap '         report any zone handle the mouse may be trapped in  (>=0 TRUE or FALSE return)
        END IF
    END IF

END FUNCTION

'---------------------------------------------------------------------------------------------------------------------------------
SUB UpdateMouseZone ()

    SHARED Zone() AS TYPE_ZONE ' need access to mouse zones
    SHARED Mouse AS TYPE_MOUSE ' need access to mouse properties
    SHARED MouseIMG AS LONG '    image of mouse pointer
    DIM z AS INTEGER '           zone counter

    IF UBOUND(Zone) = 0 THEN EXIT SUB '                                 leave if no zones defined
    WHILE _MOUSEINPUT: WEND '                                           get latest mouse update
    Mouse.x = _MOUSEX '                                                 record mouse pointer position
    Mouse.y = _MOUSEY
    IF Mouse.ZoneTrap THEN '                                            is mouse trapped in a zone?     (>0)
        IF Mouse.x < Mouse.Area.min.x THEN Mouse.x = Mouse.Area.min.x ' yes, confine mouse to zone area
        IF Mouse.x > Mouse.Area.max.x THEN Mouse.x = Mouse.Area.max.x
        IF Mouse.y < Mouse.Area.min.y THEN Mouse.y = Mouse.Area.min.y
        IF Mouse.y > Mouse.Area.max.y THEN Mouse.y = Mouse.Area.max.y
        _MOUSEMOVE Mouse.x, Mouse.y '                                   force mouse to any updated coordinates
        IF _MOUSEBUTTON(2) THEN Mouse.ZoneTrap = 0 '                    free mouse from trap if right mouse button pressed
    ELSE '                                                              no, mouse is free
        Mouse.Hovering = 0 '                                            assume mouse is not hovering a zone
        z = 0 '                                                         reset zone counter
        DO '                                                            cycle through zones
            z = z + 1 '                                                 increment zone counter
            IF MouseZone(z) THEN Mouse.Hovering = z '                   if mouse interacting with zone then record it hovering
        LOOP UNTIL z = UBOUND(Zone) '                                   leave when all zones checked
        IF _MOUSEBUTTON(1) AND Mouse.Hovering THEN '                    was left button clicked while hovering?
            TrapMouse Mouse.Hovering '                                  yes, trap the mouse within this zone
        END IF
    END IF
    _PUTIMAGE (Mouse.x, Mouse.y), MouseIMG '                            draw mouse pointer

END SUB

'---------------------------------------------------------------------------------------------------------------------------------
FUNCTION DefineMouseZone (x1 AS INTEGER, y1 AS INTEGER, w AS INTEGER, h AS INTEGER, Active AS INTEGER)

    '+--------------------------------------------+
    '| Defines mouse zones within the main screen |
    '+--------------------------------------------+

    SHARED Zone() AS TYPE_ZONE ' need access to zone areas

    REDIM _PRESERVE Zone(UBOUND(Zone) + 1) AS TYPE_ZONE ' increase array size
    Zone(UBOUND(Zone)).Area.min.x = x1 '                  set new zone area coordinates
    Zone(UBOUND(Zone)).Area.max.x = x1 + w - 1
    Zone(UBOUND(Zone)).Area.min.y = y1
    Zone(UBOUND(Zone)).Area.max.y = y1 + h - 1
    Zone(UBOUND(Zone)).Active = Active '                  set active status
    DefineMouseZone = UBOUND(Zone) '                      return handle of zone area

END FUNCTION

'---------------------------------------------------------------------------------------------------------------------------------
FUNCTION MouseHover (Area AS TYPE_AREA)

    '+--------------------------------------------------------------------------------+
    '| Returns a value of 1 if the mouse is hovering over the given area, 0 otherwise |
    '+--------------------------------------------------------------------------------+

    MouseHover = 0 '                            assume mouse not hovering over area
    WHILE _MOUSEINPUT: WEND '                   get latest mouse updates
    IF _MOUSEX >= Area.min.x THEN '             is mouse pointer currently within area limits?
        IF _MOUSEX <= Area.max.x THEN
            IF _MOUSEY >= Area.min.y THEN
                IF _MOUSEY <= Area.max.y THEN
                    MouseHover = 1 '            yes, report that mouse is hovering this area
                END IF
            END IF
        END IF
    END IF

END FUNCTION



RE: Mapping screen for mouse - PhilOfPerth - 08-08-2023

(08-07-2023, 07:25 AM)SMcNeill Wrote:
(08-07-2023, 01:52 AM)PhilOfPerth Wrote: How can I map several sections of the screen so that a (left) mouse click selects the one it's in, and allows actions based on this?

Easiest way is just to make an array to store your segment coordinates for the mouse.  

Code: (Select All)
TYPE Box 'a type to hold the mouse section information
    x AS INTEGER
    y AS INTEGER
    x2 AS INTEGER
    y2 AS INTEGER
END TYPE


DIM MouseSection(9) AS Box 'our mouse sections

SCREEN _NEWIMAGE(640, 480, 32)
FOR x = 0 TO 2
    FOR y = 0 TO 2
        i = i + 1
        MouseSection(i).x = x * 213
        MouseSection(i).x2 = x * 213 + 213
        MouseSection(i).y = y * 160
        MouseSection(i).y2 = y * 160 + 160
    NEXT
NEXT
'color the segments just to be pretty
FOR i = 1 TO 9
    LINE (MouseSection(i).x, MouseSection(i).y)-(MouseSection(i).x2, MouseSection(i).y2), _RGB32(RND * 255, RND * 255, RND * 255), BF
NEXT
PCOPY 0, 1


DO
    PCOPY 1, 0
    WHILE _MOUSEINPUT: WEND
    mx = _MOUSEX: my = _MOUSEY
    IF _MOUSEBUTTON(1) THEN
        FOR i = 0 TO 9 'check the 9 segments
            IF mx >= MouseSection(i).x AND mx <= MouseSection(i).x2 THEN
                IF my >= MouseSection(i).y AND my <= MouseSection(i).y2 THEN
                    LOCATE 1, 1: PRINT "Mouse last down in segment #"; i
                    EXIT FOR
                END IF
            END IF
        NEXT
    END IF
    IF _MOUSEBUTTON(2) THEN SYSTEM
    _LIMIT 30
    _DISPLAY
LOOP



RE: Mapping screen for mouse - PhilOfPerth - 08-08-2023

@SMcNeill
Your method actually does all that I needed, and I appreciate your making it simple enough for me to understand. Thank you.
I don't need the colours, so Ill reduce the Line() dimensions  one or two pixels, and remove the Fill. 
I also need quite a few more cells, and that was easy to adjust too. Big Grin