Microsoft Small Basic

Program Listing: PMT747-5
' Ruler 0.61
' Copyright (c) 2012-2013 Nonki Takahashi. All rights reserved.
'
' History :
' 0.61 2013-12-13 Drawn markers on two corners. (PMT747-4)
' 0.5 2013-12-13 Supported arrow keys and changed width and height. (PMT747-3)
' 0.4 2013-12-13 Fixed for remote. (PMT747-2)
' 0.3 2013-12-13 600px version. (PMT747-1)
' 0.2 2012-06-29 Ruler image version. (PMT747)
' 0.1 2012-06-29 Created.
'
GraphicsWindow.Title = "Ruler 0.61"
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
DrawMarkers()
GraphicsWindow.BackgroundColor = "White"
GraphicsWindow.BrushColor = "Green"
x = 20
For i = 1 To 6
s = i * 20
GraphicsWindow.FillEllipse(x, 20, s, s)
x = x + s + 20
EndFor
Ruler_Add()
Ruler_Loop()
Sub DrawMarkers
' draw markers on left top corner
GraphicsWindow.SetPixel(-3, -3, "Black")
GraphicsWindow.SetPixel(-2, -2, "Red")
GraphicsWindow.SetPixel(-1, -1, "Green")
GraphicsWindow.SetPixel(0, 0, "Blue")
' draw markers on right bottom corner
GraphicsWindow.SetPixel(gw - 4, gh - 4, "Black")
GraphicsWindow.SetPixel(gw - 3, gh - 3, "Red")
GraphicsWindow.SetPixel(gw - 2, gh - 2, "Green")
GraphicsWindow.SetPixel(gw - 1, gh - 1, "Blue")
EndSub
Sub Ruler_Add
uImage = "http://www.nonkit.com/smallbasic.files/ruler600.png"
oImage = ImageList.LoadImage(uImage)
ruler["angle"] = 0
ruler["moved"] = "False"
ruler["clicked"] = "False"
ruler["left"] = 0
ruler["top"] = 0
ruler["width"] = ImageList.GetWidthOfImage(oImage)
ruler["height"] = ImageList.GetHeightOfImage(oImage)
If ruler["width"] = 0 Then ' for remote
ruler["width"] = 620
ruler["height"] = 50
EndIf
ruler["cx"] = ruler["left"] + ruler["width"] / 2
ruler["cy"] = ruler["top"] + ruler["height"] / 2
ruler["right"] = ruler["left"] + ruler["width"]
ruler["bottom"] = ruler["top"] + ruler["height"]
ruler["oRuler"] = Shapes.AddImage(uImage)
Shapes.SetOpacity(ruler["oRuler"], 70)
Shapes.Move(ruler["oRuler"], ruler["px"], ruler["py"])
EndSub
Sub Ruler_Loop
GraphicsWindow.MouseUp = Ruler_OnMouseUp
GraphicsWindow.MouseDown = Ruler_OnMouseDown
GraphicsWindow.KeyDown = Ruler_OnKeyDown
While "True"
Program.Delay(100)
If ruler["moved"] Then
ruler["moved"] = "False"
x = ruler["movex"] - ruler["mousex"]
y = ruler["movey"] - ruler["mousey"]
Ruler_Move()
EndIf
If ruler["clicked"] Then
ruler["clicked"] = "False"
an = 90 - ruler["angle"]
Ruler_Rotate()
EndIf
EndWhile
EndSub
Sub Ruler_OnKeyDown
key = GraphicsWindow.LastKey
If key = "Up" Then
ruler["movex"] = ruler["cx"] + ruler["mousex"]
ruler["movey"] = ruler["cy"] + ruler["mousey"] - 1
ruler["moved"] = "True"
ElseIf key = "Down" Then
ruler["movex"] = ruler["cx"] + ruler["mousex"]
ruler["movey"] = ruler["cy"] + ruler["mousey"] + 1
ruler["moved"] = "True"
ElseIf key = "Left" Then
ruler["movex"] = ruler["cx"] + ruler["mousex"] - 1
ruler["movey"] = ruler["cy"] + ruler["mousey"]
ruler["moved"] = "True"
ElseIf key = "Right" Then
ruler["movex"] = ruler["cx"] + ruler["mousex"] + 1
ruler["movey"] = ruler["cy"] + ruler["mousey"]
ruler["moved"] = "True"
EndIf
EndSub
Sub Ruler_OnMouseDown
ruler["clicked"] = "N/A"
x = GraphicsWindow.MouseX
y = GraphicsWindow.MouseY
If ruler["left"] <= x And x <= ruler["right"] And ruler["top"] <= y And y <= ruler["bottom"] Then
ruler["mousex"] = x - ruler["cx"]
ruler["mousey"] = y - ruler["cy"]
ruler["moved"] = "False"
GraphicsWindow.MouseMove = Ruler_OnMouseMove
EndIf
EndSub
Sub Ruler_OnMouseUp
GraphicsWindow.MouseMove = Ruler_DoNothing
If ruler["clicked"] = "N/A" Then
ruler["clicked"] = "True"
EndIf
EndSub
Ruler_OnMouseMove=""
Sub Ruler_OnMouseMove
GraphicsWindow.MouseMove = Ruler_DoNothing
ruler["clicked"] = "False"
ruler["moved"] = "True"
ruler["movex"] = GraphicsWindow.MouseX
ruler["movey"] = GraphicsWindow.MouseY
GraphicsWindow.MouseMove = Ruler_OnMouseMove
EndSub
Sub Ruler_DoNothing
EndSub
Sub Ruler_Move
' param x, y - center of ruler
ruler["cx"] = x
ruler["cy"] = y
ruler["left"] = x - ruler["width"] / 2
ruler["right"] = x + ruler["width"] / 2
ruler["top"] = y - ruler["height"] / 2
ruler["bottom"] = y + ruler["height"] / 2
If ruler["angle"] = 0 Then
px = ruler["left"]
py = ruler["top"]
ElseIf ruler["angle"] = 90 Then
px = x - ruler["height"] / 2
py = y - ruler["width"] / 2
EndIf
Shapes.Move(ruler["oRuler"], px, py)
EndSub
Sub Ruler_Rotate
' param an - angle 0 or 90
If (an = 0 Or an = 90) And an <> ruler["angle"] Then
ruler["angle"] = an
Shapes.Rotate(ruler["oRuler"], an)
height = ruler["width"]
width = ruler["height"]
ruler["width"] = width
ruler["left"] = ruler["cx"] - width / 2
ruler["right"] = ruler["cx"] + width / 2
ruler["height"] = height
ruler["top"] = ruler["cy"] - height / 2
ruler["bottom"] = ruler["cy"] + height / 2
EndIf
EndSub