BBS: Inland Empire Archive Date: 06-02-92 (23:33) Number: 172 From: MATT PRITCHARD @ 930/21 Refer#: NONE To: MIKE THAYER Recvd: NO Subj: Vga pull down menus 1/2 Conf: (2) Quik_Bas
MT> I'm writing an Icon based program for EGA/VGA. In order to get
MT>my mouse to work with it I've been forced to write something like the
MT>following:
MT> (Given: X1Cord, Y1Cord represent the upper left corner and
MT> X2Cord, Y2Cord represent the lower right corner and last but
MT> not least MouseValx, MouseValy represent the coordinates
MT> returned by the mouse.)
MT>IF MouseValx>=X1Cord and MouseValx<=X2Cord and MouseValy>=Y1Cord and
MT>MouseValy<=Y1Cord THEN CALL SomeRoutine (MouseValx, MouseValy)
Oh lordy; you are about where I was 2 years ago...
MT> The subroutine further divides the box defined in the above
MT> IF THEN statement into Icon sized blocks which in turn call
MT> the intended routine.
Aiiiiiiiiiiieeeeeeeeee!!!!!!
MT> There has got to be an easier way! The way I'm doing it, it
MT> sucks up a lot of room! Is there a way to use arrays in doing
MT> this, or am I totally off base in my concept with this method?
yes, yes, yes, use arrays, and generic routines......
(Dropping into improvizational mode)
Make a type:
TYPE MouseRegion
Left AS INTEGER
Top AS INTEGER
Right AS INTEGER
Bottom AS INTEGER
RegionType AS INTEGER
RegionItem AS INTEGER
Used AS INTEGER
END TYPE
The RegionType is used to identify the type of object in
the region; I.e a Button, an icon, a text String, etc...
The RegionItem is used to tell 2 or more items of the same type apart.
Now for some constants:
CONST r.Icon = 1, r.Button = 2, r.TextWindow = 3, etc...
CONST True = -1, False = 0 , MaxRegions = 100, MaxIcons =
8 CONST IconWidth = 16, IconHeight = 16
and make an array:
DIM MouseRegions(MaxRegions) AS MouseRegion COMMON SHARED MouseRegions()
Now, whenever you draw anything that can be clicked upon,
make a routine to add it to the array:
' Draw all of the icons on the screen
FOR X = 1 TO MaxIcons
Xpos = XBase = X * IconWidth
Ypos = YBase
CALL DRAW.ICON ( GraphicImage(X), Xpos, Ypos )
CALL ADD.MOUSE.REGION (r.Icon, X, Xpos, Ypos, Xpos + IconWidth -1,_
Ypos + IconHeight -1)
NEXT X
....
'Add a global mouse region
SUB ADD.MOUSE.REGION( rType, rItem, Top, Left, Right, Bottom ) STATIC
Region = 0
FOR X = 1 TO MaxRegions
IF MouseRegions(X).Used = False THEN Region = X: EXIT FOR
NEXT X
IF NOT Region THEN STOP ' Error, out of free regions
MouseRegion(Region).RegionType = rType
MouseRegion(Region).RegionItem = rItem
MouseRegion(Region).Top = Top
MouseRegion(Region).Left = Left
MouseRegion(Region).Right = Right
MouseRegion(Region).Bottom = Bottom
MouseRegion(Region).Used = True
END SUB
Now... In your main Program, you have an event loop.
GET.NEXT.EVENT:
xKey$=INKEY$
IF LEN(xKey$) THEN GOTO PROCESS.KEYSTROKE
CALL GET.MOUSE.COORS (MouseX, MouseY, MouseButton)
IF MouseButton THEN
CALL WHAT.REGION.IS.MOUSE.IN ( MouseX, MouseY, rType, rItem )
IF rType = r.Icon THEN GOTO ICON.EVENT
IF rType = r.Button THEN GOTO BUTTON.EVENT
...
END IF
GOTO GET.NEXT.EVENT
.....
'The Mouse event has been isolated down to clicking on an icon...
ICON.EVENT:
IconNumPressed = rItem
CALL PRINT.MESSAGE ("You pressed Icon # ", IconNumPressed)
IF IconNumPressed = IconDoThis THEN ........
...
...
'Figgure out what the mouse clicked on...
SUB WHAT.REGION.IS.MOUSE.IN (MouseX, MouseY, rType, rItem) STATIC
rType = 0 : rItem = 0
FOR X = 1 TO MaxRegions
IF MouseRegion(X).Used THEN
IF (MouseX >= MouseRegion(X).Left) AND _
(MouseX <= MouseRegion(X).Right) THEN
IF (MouseY >= MouseRegion(X).Top) AND _
(MouseY <= MouseRegion(X).Bottom) THEN
rType = MouseRegion(X).RegionType
rItem = MouseRegion(X).RegionItem
EDIT FOR
END IF
END IF
END IF
NEXT X
END SUB
>>> Continued to next message
===
* SLMR 2.1a * Corporations don't care about you
--- InterPCB 1.50
# Origin: CENTRAL BBS -Texas' BEST BBS! 214-393-7090 HST 3+GIGs (8:930/21)
* Origin: Gateway System to/from RBBS-NET (RBBS-PC 1:10/8)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET