Урок 17 - Събития и интерактивност
Събитията представляват важен елемент и стоят в основата на интерактивното програмиране със Small Basic. За да взаимoдействате с вашата програма трябва да използвате събитията. Потребителят взаимодейства с нея като извършва действия с мишката или натиска определени клавиши.
Нека разгледаме една проста програма:
Пример:
GraphicsWindow.MouseDown = OnMouseDown
Sub OnMouseDown
GraphicsWindow.ShowMessage("Вие щракнахте с лев бутон на мишката.", "Здравейте!")
EndSub
Програмата се състои от един ред, в който викаме процедура. Самата процедура извежда със съобщение с име „Здравейте“ при положение, че потребителя е щракнал с бутон на мишката. Съобщението е Вие щракнахте с бутон на мишката. Програмата проверява събитието натискане на бутон с мишката и ако то е изпълнено се появява съобщението.
Нека разгледаме друга програма:
GraphicsWindow.BrushColor = "Blue"
GraphicsWindow.MouseDown = OnMouseDown
Sub OnMouseDown
x = GraphicsWindow.MouseX - 10
y = GraphicsWindow.MouseY - 10
GraphicsWindow.FillEllipse(x, y, 20, 20)
EndSub
В нея също използваме събитието за натиснат бутон с мишката, но то ще възпроизведе извеждане на окръжност с диаметър 20 пиксела. С MouseX и MouseY определяме координатите на точката, за да начертаем окръжност.
Процедурата се изпълнява винаги, когато потребителя натисне с лев или десен бутон върху графичния прозорец.
Какви събития са възможни в графичния прозорец:
Събитие Описание
MouseDown Натиснат бутон на мишката
MouseUp Пускане на бутон на мишката
MouseMove Преместване показалеца на мишката
KyeDown Натиснат клавиш от клавиатурата
KeyUp Пускане на клавиша от клавиатурата
Освойставата в графичния прозорец са свързани със събитията
Ако желаем да нарисуваме окръжности с различен цвят, трябва да използваме и втора процедура, която да обработва събитие за промяна на цвета при натиснат клавиш от клавиатурата
Решение:
GraphicsWindow.BrushColor = "Blue"
GraphicsWindow.MouseDown = OnMouseDown
GraphicsWindow.KeyDown = OnKeyDown
Sub OnKeyDown
GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor()
EndSub
Sub OnMouseDown
x = GraphicsWindow.MouseX - 10
y = GraphicsWindow.MouseY - 10
GraphicsWindow.FillEllipse(x, y, 20, 20)
EndSub
При тестване на програмата, ако потребителят натиска на определено място бутон на мишката се появява кръгче със син цвят. Ако той натисне произволен клавиш от клавиатурата и отново натисне бутон на мишката – цветът с който се извежда кръгчето е друг. Двете процедури се задействат само ако е натиснат бутон на мишката или клавиш от клавиатурата.
Нека използваме операцията MouseMove това за да направим възможно рисуването с мишката в графичния прозорец.
GraphicsWindow.MouseMove = OnMouseMove
Sub OnMouseMove
x = GraphicsWindow.MouseX
y = GraphicsWindow.MouseY
GraphicsWindow.DrawLine(prevX, prevY, x, y)
prevX = x
prevY = y
EndSub
Тествайки програмния код, виждаме че рисуваме непрекъснато по графичния прозорец само като движим мишката. Рисуването не може да се спре.
Ще се опитаме да решим проблема като си припомним свойствата на обекта Mouse:
Mouse.IsLeftButtonDown натиснат или не лев бутон на мишката
Mouse.IsRightButtonDown натиснат или не десен бутон на мишката
Mouse.MouseX задава стойност за Х координатата на показалеца на мишката
Mouse.MouseY задава стойност за У координатата на показалеца на мишката .
Методи
HideCursor - Mouse.HideCursor () Скрива показалеца на мишката върху екрана.
ShowCursor - Mouse.ShowCursor () Показва показалеца на мишката върху екрана.
Ще използваме тези свойства, за да можем да рисуваме само когато е натиснат левия бутон.
Нека въведем следния код:
GraphicsWindow.MouseMove = OnMouseMove
GraphicsWindow.MouseDown = OnMouseDown
Sub OnMouseDown
prevX = GraphicsWindow.MouseX
prevY = GraphicsWindow.MouseY
EndSub
Sub OnMouseMove
x = GraphicsWindow.MouseX
y = GraphicsWindow.MouseY
If (Mouse.IsLeftButtonDown) Then
GraphicsWindow.DrawLine(prevX, prevY, x, y)
EndIf
prevX = x
prevY = y
EndSub
Сега можем да рисуваме само с натиснат лев бутон. Във втората процедура сме добавили логическо условие и проверяваме дали левия бутон е натиснат. Ако това е вярно – ние рисуваме линия между 2те точки.
Нека въведем и изпълним следния код:
GraphicsWindow.MouseDown = MouseClick
GraphicsWindow.MouseMove = MouseDrag
GraphicsWindow.MouseUp = MouseUp
Sub MouseClick
OrgX = GraphicsWindow.MouseX
OrgY = GraphicsWindow.MouseY
EndSub
Sub MouseDrag
x = GraphicsWindow.MouseX
y = GraphicsWindow.MouseY
If (Mouse.IsLeftButtonDown) then
GraphicsWindow.DrawLine(OrgX, OrgY, x, y)
Endif
EndSub
Sub MouseUp
GraphicsWindow.PenColor=GraphicsWindow.GetRandomColor()
GraphicsWindow.PenWidth=Math.GetRandomNumber(5)
EndSub
В него са включени 3 процедури:
MouseClick – присвоява на OrgX и OrgY координатите на показалеца на мишката
MouseDrag - Рисува прави линии между две точки (х,у) и (OrgX, OrgY) ако държим натиснат левия бутон на мишката
MouseUp – при отпускане на натиснатия бутон генерира цвят и го присвоява на молива.
Освен, че можем да рисуваме в грфиния прозорец, ние можем да създаваме интересни приложения, в това число и игри.
Въведете следния код:
w = 350
h = 290
GraphicsWindow.CanResize = "False"
GraphicsWindow.Width = w
GraphicsWindow.Height = h
GraphicsWindow.Top = (Desktop.Height-h) / 2
GraphicsWindow.Left = (Desktop.Width-w) / 2
GraphicsWindow.Title = "Calculator"
CreateGUI()
Controls.ButtonClicked = ButtonDown
Sub CreateGUI
GraphicsWindow.DrawRectangle(10, 10, 330, 270)
GraphicsWindow.DrawText(50, 70, "Въведете първото число: ")
Ftextbox = Controls.AddTextBox(200, 60)
Controls.SetSize(Ftextbox, 60, 30)
GraphicsWindow.DrawText(50, 120, "Въведете второто число: ")
Stextbox = Controls.AddTextBox(200, 110)
Controls.SetSize(Stextbox, 60, 30)
GraphicsWindow.DrawText(50, 170,"Отговорът е:")
Atextbox=Controls.AddTextBox(200, 160)
Controls.SetSize(Atextbox, 60, 30)
GraphicsWindow.FontSize = 15
Plus = Controls.AddButton("+", 20, 210)
Controls.SetSize(Plus, 40, 40)
Minus = Controls.AddButton("-", 70, 210)
Controls.SetSize(Minus, 40, 40)
Asterisk = Controls.AddButton("*", 120, 210)
Controls.SetSize(Asterisk, 40, 40)
Division = Controls.AddButton("/", 170, 210)
Controls.SetSize(Division, 40, 40)
Clear = Controls.AddButton("C", 220, 210)
Controls.SetSize(Clear, 40, 40)
EndSub
Sub ButtonDown
FtxtValue = controls.GetTextBoxText(Ftextbox)
StxtValue = controls.GetTextBoxText(Stextbox)
operator = Controls.GetButtonCaption(Controls.LastClickedButton)
If operator = "C" Then
Controls.SetTextBoxText(Ftextbox, "")
Controls.SetTextBoxText(Stextbox, "")
Controls.SetTextBoxText(Atextbox, "")
ElseIf operator = "+" Then
AtxtValue = FtxtValue + StxtValue
Controls.SetTextBoxText(Atextbox, AtxtValue)
ElseIf operator = "-" Then
AtxtValue = FtxtValue - StxtValue
Controls.SetTextBoxText(Atextbox, AtxtValue)
ElseIf operator = "*" Then
AtxtValue=FtxtValue*StxtValue
Controls.SetTextBoxText(Atextbox,AtxtValue)
Else
AtxtValue=FtxtValue/StxtValue
Controls.SetTextBoxText(Atextbox,AtxtValue)
EndIf
EndSub
Изпълнете програмата. В нея са вкючени 2 процедури – едната за интерфейса а другата за извършване на операциите с двете числа.
Ето как изглежда прозореца на калкулатора: