Microsoft Small Basic

Program Listing: ZSH672
' Extensible Paint - Group Challenge July 2014
' ------------------- MAIN ----------------------
GraphicsWindow.Title = "Ex-Paint | F1=Pen F2=Eraser"
mouseMove = "False"
mouseDown = "False"
keyDown = "False"
key = "F1"
validKeys = "1=F1;2=F2;"
GraphicsWindow.MouseMove = OnMouseMove
GraphicsWindow.MouseDown = OnMouseDown
GraphicsWindow.KeyDown = OnKeyDown
While "True"
If mouseMove Then
x = GraphicsWindow.MouseX
y = GraphicsWindow.MouseY
If (Mouse.IsLeftButtonDown) Then
GraphicsWindow.DrawLine(prevX, prevY, x, y)
EndIf
prevX = x
prevY = y
mouseMove = "False"
ElseIf mouseDown Then
prevX = GraphicsWindow.MouseX
prevY = GraphicsWindow.MouseY
mouseDown = "False"
ElseIf keyDown Then
prevKey = key
key = GraphicsWindow.LastKey
Plug_Ins()
keyDown = "False"
Else
Program.Delay(10)
EndIf
EndWhile

Sub Plug_Ins
If key = "F2" Then
Eraser()
EndIf
EndSub

Sub OnKeyDown
keyDown = "True"
EndSub

Sub OnMouseDown
mouseDown = "True"
EndSub

Sub OnMouseMove
mouseMove = "True"
EndSub
' ------------------- PLUG-INS ----------------------
Sub Eraser
Stack.PushValue("local", GraphicsWindow.PenWidth)
Stack.PushValue("local", GraphicsWindow.PenColor)
Stack.PushValue("local", GraphicsWindow.BrushColor)
GraphicsWindow.PenWidth = 0
GraphicsWindow.BrushColor = "Gray"
erEll = Shapes.AddEllipse(40, 40)
Shapes.SetOpacity(erEll, 50)
Shapes.Move(erEll, prevX - 20, prevY - 20)
GraphicsWindow.PenWidth = 40
GraphicsWindow.PenColor = "White"
While key = "F2"
If mouseMove Then
x = GraphicsWindow.MouseX
y = GraphicsWindow.MouseY
Shapes.Move(erEll, x - 20, y - 20)
If (Mouse.IsLeftButtonDown) Then
GraphicsWindow.DrawLine(prevX, prevY, x, y)
EndIf
prevX = x
prevY = y
mouseMove = "False"
ElseIf mouseDown Then
prevX = GraphicsWindow.MouseX
prevY = GraphicsWindow.MouseY
mouseDown = "False"
ElseIf keyDown Then
_key = GraphicsWindow.LastKey
nKey = Array.GetItemCount(validKeys)
valid = "False"
For i = 1 To nKey
If _key = validKeys[i] Then
valid = "True"
EndIf
EndFor
If valid Then
key = _key
EndIf
keyDown = "False"
EndIf
EndWhile
Shapes.Remove(erEll)
GraphicsWindow.BrushColor = Stack.PopValue("local")
GraphicsWindow.PenColor = Stack.PopValue("local")
GraphicsWindow.PenWidth = Stack.PopValue("local")
EndSub