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