Tutorial 018 Example BB4W Windows Menu Program -
Get Painting!
The following program ( Separate Listing
for ease of copying), shows you how to use BB4W to write a menu driven program
:
REM: Menu Demo-01
REM: Get Painting!
REM: Richard Weston 30th March 2003
MODE8:OFF
c=1:REM: default colour red (my favourite)
PROCpalette
:
SYS "CreateMenu" TO hmenu%
SYS "SetMenu", @hwnd%, hmenu%
SYS "AppendMenu", hmenu%, 0, 1, "Dab/Paint"
SYS "AppendMenu", hmenu%, 0, 2, "Blob/Splurge"
SYS "AppendMenu", hmenu%, 0, 3, "Box"
SYS "AppendMenu", hmenu%, 0, 4, "Brick"
SYS "AppendMenu", hmenu%, 0, 5, "Big Circle"
SYS "AppendMenu", hmenu%, 0, 6, "Small Circle"
SYS "AppendMenu", hmenu%, 0, 7, "Spray Gun"
SYS "AppendMenu", hmenu%, 0, 8, "Pencil"
SYS "AppendMenu", hmenu%, 0, 9, "Eraser"
SYS "DrawMenuBar", @hwnd%
:
message$ = "Click a MENU ITEM then..RIGHT
CLICK"
message$ +=" on a COLOUR.. LEFT CLICK and
DRAG to PAINT!!!"
caption$ = "******** READ CAREFULLY - then
HAVE FUN ********"
SYS "MessageBox", @hwnd%, message$, caption$,
0
:
ON SYS PROCmenu(@wparam%) : RETURN
REPEAT UNTIL INKEY(10)=0
END
:
DEF PROCmenu(num)
CASE num OF
WHEN 1:PROCpaint
WHEN 2:PROCblob
WHEN 3:PROCbox
WHEN 4:PROCbrick
WHEN 5:PROCbigcircle
WHEN 6:PROCsmallcircle
WHEN 7:PROCspraygun
WHEN 8:PROCpencil
WHEN 9:PROCeraser
ENDCASE
ENDPROC
:
DEF PROCpalette
FOR n=1 TO 15
GCOL0,n
CIRCLE FILL 270 + 50*(n-0.5),1000,30
NEXT
ENDPROC
:
DEF PROCpaint
LOCAL n,b,x,y
PROCpalette
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
ELLIPSE FILL
x+5,y+5,15,25
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCblob
c=1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
ELLIPSE FILL
x+5,y+5,60,50
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCbox
PROCpalette
GCOL0,1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
RECTANGLE x+5,y+5,60,50
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCbrick
PROCpalette
GCOL0,1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
RECTANGLE FILL x+5,y+5,60,50
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCbigcircle
PROCpalette
GCOL0,1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
CIRCLE x+5,y+5,80
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCsmallcircle
PROCpalette
GCOL0,1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
CIRCLE x+5,y+5,30
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCspraygun
PROCpalette
GCOL0,1
LOCAL n,b,x,y,r,t
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
IF RND(10000)<25
THEN
r=RND(30)
t=RND(360)
t=RAD(t)
PLOT69,x+r*COS(t),y+r*SIN(t)
ENDIF
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCpencil
LOCAL n,b,x,y
PROCpalette
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
CIRCLE FILL
x+5,y+5,10
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCeraser
LOCAL n,b,x,y
PROCpalette
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,0
CIRCLE FILL
x+5,y+5,30
ENDIF
REM IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
Annotated Version
REM: Menu Demo-01
REM: Get Painting!
REM: Richard Weston 30th March 2003
MODE8:OFF
c=1: REM: default colour red (my favourite)
PROCpalette *** draws the colour blobs at
the top of the screen ***
:
SYS "CreateMenu" TO hmenu% **** Just reproduce
this lot and put in your own titles to give you the menu bar ***
SYS "SetMenu", @hwnd%, hmenu%
SYS "AppendMenu", hmenu%, 0, 1, "Dab/Paint"
SYS "AppendMenu", hmenu%, 0, 2, "Blob/Splurge"
SYS "AppendMenu", hmenu%, 0, 3, "Box"
SYS "AppendMenu", hmenu%, 0, 4, "Brick"
SYS "AppendMenu", hmenu%, 0, 5, "Big Circle"
SYS "AppendMenu", hmenu%, 0, 6, "Small Circle"
SYS "AppendMenu", hmenu%, 0, 7, "Spray Gun"
SYS "AppendMenu", hmenu%, 0, 8, "Pencil"
SYS "AppendMenu", hmenu%, 0, 9, "Eraser"
*** You can have more or less than 9 menu items ***
SYS "DrawMenuBar", @hwnd%
:
message$ = "Click a MENU ITEM then..RIGHT
CLICK" **** Makes our explanatory Message in a Box ****
message$ +=" on a COLOUR.. LEFT CLICK and
DRAG to PAINT!!!"
caption$ = "******** READ CAREFULLY - then
HAVE FUN ********"
SYS "MessageBox", @hwnd%, message$, caption$,
0
:
ON SYS PROCmenu(@wparam%) : RETURN *******
This line runs the whole shooting match!" *************
REPEAT UNTIL INKEY(10)=0 ***** Stops
the computer overheating *****?
END *** Always declare your procedures
after an END statement ***
:
DEF PROCmenu(num) *** The parameter passed
in the bracket is in this case a number from 1 to 9 which is all we need to
decide the appropriate action to be taken after clicking the menu item ***
CASE num OF
WHEN 1:PROCpaint
WHEN 2:PROCblob
WHEN 3:PROCbox
WHEN 4:PROCbrick
WHEN 5:PROCbigcircle
WHEN 6:PROCsmallcircle
WHEN 7:PROCspraygun
WHEN 8:PROCpencil
WHEN 9:PROCeraser
ENDCASE
ENDPROC
:
DEF PROCpalette *** Draws colour sample blobs
at top of screen ***
FOR n=1 TO 15
GCOL0,n
CIRCLE FILL 270 + 50*(n-0.5),1000,30
NEXT
ENDPROC
:
DEF PROCpaint
LOCAL n,b,x,y *** stops these parameters
being altered for other Procedures ***
PROCpalette *** redraws the palette
incase its been overwritten or erased ***
REPEAT
MOUSE x,y,b *** detects mouse
position and buttons pushed - see earlier tutorial ***
IF b=4 THEN *** a left click
***
GCOL0,c
ELLIPSE FILL
x+5,y+5,15,25
ENDIF
IF b=1 THEN *** a right click
***
c=POINT(x,y) ***
detects colour of screen at these coordinates ***
GCOL0,c *** note
c is a GLOBAL variable (not made LOCAL) so the colour is not necessarily
changed from one menu item to another ***
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCblob
c=1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
ELLIPSE FILL
x+5,y+5,60,50
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCbox
PROCpalette
GCOL0,1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
RECTANGLE x+5,y+5,60,50
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCbrick
PROCpalette
GCOL0,1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
RECTANGLE FILL x+5,y+5,60,50
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCbigcircle
PROCpalette
GCOL0,1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
CIRCLE x+5,y+5,80
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCsmallcircle
PROCpalette
GCOL0,1
LOCAL n,b,x,y
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
CIRCLE x+5,y+5,30
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCspraygun
PROCpalette
GCOL0,1
LOCAL n,b,x,y,r,t
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
IF RND(10000)<25
THEN *** Reduces the amount of spray ***
r=RND(30)
*** Adjust this for smaller or larger spray area ***
t=RND(360)
*** Random angle 1 to 360deg ***
t=RAD(t)
*** Convert degress to radians ***
PLOT69,x+r*COS(t),y+r*SIN(t)
***REM gives a circular patch of spray ***
ENDIF
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCpencil
LOCAL n,b,x,y
PROCpalette
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,c
CIRCLE FILL
x+5,y+5,10
ENDIF
IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
:
DEF PROCeraser
LOCAL n,b,x,y
PROCpalette
REPEAT
MOUSE x,y,b
IF b=4 THEN
GCOL0,0 *** Black
for erasing ***
CIRCLE FILL
x+5,y+5,30
ENDIF
REM IF b=1 THEN
c=POINT(x,y)
GCOL0,c
ENDIF
UNTIL FALSE
ENDPROC
Next
Tutorial
Richard Weston's Homepage