Книга: Программирование мобильных устройств на платформе .NET Compact Framework

Листинг 13.1. Использование конечного автомата для экспериментов с двумя различными вариантами компоновки пользовательского интерфейса

Листинг 13.1. Использование конечного автомата для экспериментов с двумя различными вариантами компоновки пользовательского интерфейса

#Const PLAYFIELD_ON_BOTTOM = 0 'Отобразить ПОЛЕ ИГРЫ под ПИ
'#Const PLAYFIELD_ON_BOTTOM = 1 'Отобразить ПОЛЕ ИГРЫ над ПИ
'-------------------------------------------------
'ОБРАБОТЧИК СОБЫТИЙ: Вызывается при загрузке формы
'-------------------------------------------------
Private Sub Form1_Load(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles MyBase.Load
 'Задать совместно используемые свойства нашего визуального интерфейса
 SetStartControlPositionAndState()
 'Задать динамические свойства, исходя из того, в какое состояние
 'игры мы входим
 StateChangeForGameUI(GameUIState.startScreen)
End Sub
'---------------------------------------------------------------------------
'Конечный автомат, который управляет отображением кнопок, скрываемых вручную
'---------------------------------------------------------------------------
Private Enum GameUIState
 startScreen = 1
 waitForNextQuestion = 2
 waitForUserToStateKnowledge = 4
 waitForUserToAnswerMultipleChoice = 8
End Enum
'Текущее состояние игры
Private m_GameUIState As GameUIState
'==========================================================================
'Конечный автомат, используемый для управления пользовательским интерфейсом
'==========================================================================
Private Sub StateChangeForGameUI(ByVal newGameUIState As _
 GameUIState)
 m_GameUIState = newGameUIState
 Select Case (newGameUIState)
 Case GameUIState.startScreen
  buttonAskQuestion.Visible = True
  buttonAskQuestion.Text = "Start"
  'Скрыть текстовое окно
  textBoxAskQuestion.Visible = False
  SetAnswerButtonVisibility(False)
  SetDifficultyButtonVisibility(False)
 Case GameUIState.waitForNextQuestion
  setQuestionText("List answer details here... " + vbCrLf + _
   "Lots of space to write..." + vbCrLf + _
   "Waiting for user to select next question...")
  textBoxAskQuestion.Visible = True
  buttonAskQuestion.Text = "Next"
  buttonAskQuestion.Visible = True
  'Убедиться в том, что кнопка отображается на переднем плане
  buttonAskQuestion.BringToFront()
  SetAnswerButtonVisibility(False)
  SetDifficultyButtonVisibility(False)
#If PLAYFIELD_ON_BOTTOM <> 0 Then 'ПОЛЕ ИГРЫ располагается под ПИ
  textBoxAskQuestion.Height = pictureBoxGameBoard.Top - 2
#Else 'ПОЛЕ ИГРЫ располагается над пользовательскими элементами управления
  textBoxAskQuestion.Top = pictureBoxGameBoard.Top + _
   pictureBoxGameBoard.Height + 2
  textBoxAskQuestion.Height = Me.Height - _
   textBoxAskQuestion.Top
#End If
 Case GameUIState.waitForUserToStateKnowledge
  SetTextForVocabularyQuestion()
  textBoxAskQuestion.Visible = True
  buttonAskQuestion.Visible = False
  SetAnswerButtonVisibility(False)
  SetDifficultyButtonVisibility(True)
#If PLAYFIELD_ON_BOTTOM <> 0 Then 'ПОЛЕ ИГРЫ располагается под ПИ
  textBoxAskQuestion.Height = _
   buttonShowAnswers_AdvancedVersion.Top - 2
#Else 'ПОЛЕ ИГРЫ располагается над пользовательскими элементами управления
  textBoxAskQuestion.Top = _
   buttonShowAnswers_AdvancedVersion.Top + _
   buttonShowAnswers_AdvancedVersion.Height + 2
  textBoxAskQuestion.Height = Me.Height - _
   textBoxAskQuestion.Top
#End If
 Case GameUIState.waitForUserToAnswerMultipleChoice
  buttonAskQuestion.Visible = False
  SetDifficultyButtonVisibility(False)
  'Сделать кнопки доступными, чтобы пользователь мог щелкать на них
  SetAnswerButtonEnabled(True)
  SetAnswerButtonVisibility(True)
#If PLAYFIELD_ON_BOTTOM <> 0 Then
  'ПОЛЕ ИГРЫ располагается под ПИ
  textBoxAskQuestion.Height = buttonAnswer0.Top - 2
#Else 'ПОЛЕ ИГРЫ располагается над пользовательскими элементами управления
  'Разместить текстовое окно таким образом, чтобы экран использовался
  'эффективно
  textBoxAskQuestion.Top = buttonAnswer5.Top + _
   buttonAnswer5.Height + 2
  textBoxAskQuestion.Height = Me.Height - _
   textBoxAskQuestion.Top
#End If
 End Select
End Sub
'========================================================================
'Задать статическую компоновку нашего пользовательского интерфейса.
'Сюда входят все элементы, позиции которых остаются фиксированными.
'Изменения в остальные свойства внесет конечный автомат пользовательского
'интерфейса
'========================================================================
Private Sub SetStartControlPositionAndState()
 pictureBoxGameBoard.Width = 240
 pictureBoxGameBoard.Height = 176
 'Установить размеры кнопок множественного выбора вариантов ответов
 Const answerButtons_dx As Integer = 117
 Const answerButtons_dy As Integer = 18
 buttonAnswer0.Width = answerButtons_dx
 buttonAnswer0.Height = answerButtons_dy
 buttonAnswer1.Size = buttonAnswer0.Size
 buttonAnswer2.Size = buttonAnswer0.Size
 buttonAnswer3.Size = buttonAnswer0.Size
 buttonAnswer4.Size = buttonAnswer0.Size
 buttonAnswer5.Size = buttonAnswer0.Size
 buttonShowAnswers_AdvancedVersion.Width = answerButtons_dx
 buttonShowAnswers_AdvancedVersion.Height = 24
 buttonShowAnswers_SimpleVersion.Size = _
  buttonShowAnswers_AdvancedVersion.Size
 'Расстояние (в пикселях) между соседними кнопками
 Const dx_betweenButtons As Integer = 3
 Const dy betweenButtons As Integer = 2
 Const answerbuttons_beginX As Integer = 3
 'Создать задний план для нашего изображения, чтобы мы видели
 'его в процессе тестирования
 Dim gameBoard As System.Drawing.Bitmap
 gameBoard = New System.Drawing.Bitmap( _
  pictureBoxGameBoard.Width, pictureBoxGameBoard.Height)
 Dim gameboard_gfx As System.Drawing.Graphics
 gameboard_gfx = System.Drawing.Graphics.FromImage(gameBoard)
 gameboard_gfx.Clear(System.Drawing.Color.Yellow)
 Dim myPen As System.Drawing.Pen = New System.Drawing.Pen( _
  System.Drawing.Color.Blue)
 gameboard_gfx.DrawRectangle(myPen, 2, 2, _
  gameBoard.Width - 4, gameBoard.Height - 6)
 myPen.Dispose()
 gameboard_gfx.Dispose()
 pictureBoxGameBoard.Image = gameBoard
 'Разместить текстовое окно, в котором содержатся задаваемые вопросы,
 'а также подробные ответы для пользователей
 textBoxAskQuestion.Left = 0
 textBoxAskQuestion.Width = 240
 buttonAskQuestion.Width = 64
 buttonAskQuestion.Height = 20
#If PLAYFIELD_ON_BOTTOM <> 0 Then 'ПОЛЕ ИГРЫ располагается под ПИ
 Const answerbuttons_beginY As Integer = 42
 Const showanswers_beginY As Integer = 77
 '------------------------------------------------------------
 'Задать кнопки выбора вариантов "Easy" или "Hard" режима игры
 '------------------------------------------------------------
 buttonShowAnswers_AdvancedVersion.Top = showanswers_beginY
 buttonShowAnswers_SimpleVersion.Top = showanswers_beginY
 '------------------------------
 'Задать набор вариантов ответов
 '------------------------------
 'Задать элемент управления, по которому будут выравниваться
 'все остальные элементы управления
 buttonAnswer0.Top = answerbuttons_beginY
 'Поместить PictureBox под элементами управления
 pictureBoxGameBoard.Top = _
  (answerButtons dy + dy betweenButtons) * 3 + _
  answerbuttons_beginY
 buttonAskQuestion.Top = 0
 buttonAskQuestion.Left = 174
 textBoxAskQuestion.Top = 0
#Else 'ПОЛЕ ИГРЫ располагается над пользовательскими элементами управления
 Const answerbuttons_beginY As Integer = 174
 '------------------------------------------------------------
 'Задать кнопки выбора вариантов "Easy" или "Hard" режима игры
 '------------------------------------------------------------
 buttonShowAnswers_AdvancedVersion.Top = answerbuttons_beginY
 buttonShowAnswers_SimpleVersion.Top = answerbuttons_beginY
 '-----------------------------
 'Задать набор вариантов ответа
 '-----------------------------
 'Задать элемент управления, по которому будут выравниваться
 'все остальные элементы управления
 buttonAnswer0.Top = answerbuttons_beginY
 pictureBoxGameBoard.Top = 0
 buttonAskQuestion.Top = answerbuttons_beginY
 buttonAskQuestion.Left = 174
#End If
 buttonShowAnswers AdvancedVersion.Left = answerbuttons_beginX
 buttonShowAnswers_SimpleVersion.Left = _
  buttonShowAnswers_AdvancedVersion.Left + _
  answerButtons dx + dx_betweenButtons
 pictureBoxGameBoard.Left = 0
 pictureBoxGameBoard.Width = 240
 pictureBoxGameBoard.Height = 172
 buttonAnswer0.Left = answerbuttons_beginX
 buttonAnswer1.Left = buttonAnswer0.Left + answerButtons_dx + _
  dx_betweenButtons
 buttonAnswer1.Top = buttonAnswer0.Top
 'Следующий ряд
 buttonAnswer2.Left = buttonAnswer0.Left
 buttonAnswer2.Top = buttonAnswer0.Top + answerButtons_dy + _
  dy_betweenButtons
 buttonAnswer3.Left = buttonAnswer2.Left + answerButtons_dx + _
  dx_betweenButtons
 buttonAnswer3.Top = buttonAnswer2.Top
 'Следующий ряд
 buttonAnswer4.Left = buttonAnswer2.Left
 buttonAnswer4.Top = buttonAnswer2.Top + answerButtons_dy + _
  dy_betweenButtons
 buttonAnswer5.Left = buttonAnswer4.Left + answerButtons_dx + _
  dx_betweenButtons
 buttonAnswer5.Top = buttonAnswer4.Top
End Sub
'-----------------------------------------------------------------------
'Вспомогательная функция, которая позволяет задавать состояние видимости
'кнопок, отображающих ответы из словаря
'-----------------------------------------------------------------------
Private Sub SetAnswerButtonVisibility(ByVal visibleState _
 As Boolean)
 buttonAnswer0.Visible = visibleState
 buttonAnswer1.Visible = visibleState
 buttonAnswer2.Visible = visibleState
 buttonAnswer3.Visible = visibleState
 buttonAnswer4.Visible = visibleState
 buttonAnswer5.Visible = visibleState
End Sub
'-----------------------------------------------------------------
'Вспомогательная функция, вызываемая для задания свойств видимости
'некоторых элементов управления
'-----------------------------------------------------------------
Private Sub SetDifficultyButtonVisibility(ByVal visibleState _
 As Boolean)
 buttonShowAnswers_AdvancedVersion.Visible = visibleState
 buttonShowAnswers_SimpleVersion.Visible = visibleState
End Sub
'-----------------------------------------------------------------------
'Вспомогательная функция, которая позволяет задавать состояние видимости
'кнопок, отображающих ответы из словаря
'-----------------------------------------------------------------------
Private Sub SetAnswerButtonEnabled(ByVal enabledState _
 As Boolean)
 buttonAnswer0.Enabled = enabledState
 buttonAnswer1.Enabled = enabledState
 buttonAnswer2.Enabled = enabledState
 buttonAnswer3.Enabled = enabledState
 buttonAnswer4.Enabled = enabledState
 buttonAnswer5.Enabled = enabledState
End Sub
'-----------------------------------------------------------------
'Задает текст в текстовом окне и кнопках,
'необходимых для формулирования вопросов.
'
'В случае практической реализации эта функция должна просматривать
'вопросы динамически
'-----------------------------------------------------------------
Private Sub SetTextForVocabularyQuestion()
 setQuestionText("What is the English word for 'der Mensch'?")
 buttonAnswer0.Text = "Four"
 buttonAnswer1.Text = "Person"
 buttonAnswer2.Text = "Three"
 buttonAnswer3.Text = "To Jump"
 buttonAnswer4.Text = "Newspaper"
 buttonAnswer5.Text = "Brother"
End Sub
'Вызывается для оценки варианта ответа, выбранного пользователем
Private Sub evaluateMultipleChoiceAnswer(ByVal buttonClicked _
 As Button, ByVal selection As Integer)
 'Примечание: В практической реализации правильный номер ответа
 'определяется динамически и не всегда соответствует "кнопке #1"
 'Если выбранный пользователем вариант ответа не является правильным,
 'отменить доступ к нажатой кнопке
 If (selection <> 1) Then
  'Выбранный вариант ответа является неправильным
  buttonClicked.Enabled = False
 Else
  'Пользователь выбрал правильный ответ, продолжить игру
  StateChangeForGameUI(GameUIState.waitForNextQuestion)
 End If
End Sub
'Абстракция, задающая текст вопросов
Sub setQuestionText(ByVal textIn As String)
 textBoxAskQuestion.Text = textIn
End Sub
'----------------------------------------------------------------
'ОБРАБОТЧИК СОБЫТИЙ: Пользователь желает увидеть следующий вопрос
'----------------------------------------------------------------
Private Sub buttonAskQuestion_Click(ByVal sender As Object, _
 ByVal e As System.EventArgs) Handles buttonAskQuestion.Click
 SetTextForVocabularyQuestion()
 StateChangeForGameUI(GameUIState.waitForUserToStateKnowledge)
End Sub
'---------------------------------------------------------------------
'ОБРАБОТЧИК СОБЫТИЙ:
'Пользователь желает ответить на отображенный вопрос и сообщить, какой
'наиболее сложный уровень является для него приемлемым
'---------------------------------------------------------------------
Private Sub buttonShowAnswers AdvancedVersion_Click( _
 ByVal sender As Object, ByVal e As System.EventArgs) _
 Handles buttonShowAnswers_AdvancedVersion.Click
 'Установить состояние игры для отображения вариантов выбора
 StateChangeForGameUI( _
  GameUIState.waitForUserToAnswerMultipleChoice)
End Sub
'---------------------------------------------------------------------
'ОБРАБОТЧИК СОБЫТИЙ:
'Пользователь желает ответить на отображенный вопрос и сообщить, какой
'наиболее легкий уровень является для него приемлемым
'---------------------------------------------------------------------
Private Sub buttonShowAnswers_SimpleVersion_Click( _
 ByVal sender As Object, ByVal e As System.EventArgs) _
 Handles buttonShowAnswers_SimpleVersion.Click
 'Установить состояние игры для отображения вариантов выбора
 StateChangeForGameUI( _
  GameUIState.waitForUserToAnswerMultipleChoice)
End Sub
'ОБРАБОТЧИК СОБЫТИЙ: Был выполнен щелчок на кнопке выбора варианта ответа
Private Sub buttonAnswer0_Click(ByVal sender As Object, ByVal _
 e As System.EventArgs) Handles buttonAnswer0.Click
 evaluateMultipleChoiceAnswer(buttonAnswer0, 0)
End Sub
'ОБРАБОТЧИК СОБЫТИЙ: Был выполнен щелчок на кнопке выбора варианта ответа
Private Sub buttonAnswer1_Click(ByVal sender As Object, ByVal _
 e As System.EventArgs) Handles buttonAnswer1.Click
 evaluateMultipleChoiceAnswer(buttonAnswer1, 1)
End Sub
'ОБРАБОТЧИК СОБЫТИЙ: Был выполнен щелчок на кнопке выбора варианта ответа
Private Sub buttonAnswer2_Click(ByVal sender As Object, ByVal _
 e As System.EventArgs) Handles buttonAnswer2.Click
 evaluateMultipleChoiceAnswer(buttonAnswer2, 2)
End Sub
'ОБРАБОТЧИК СОБЫТИЙ: Был выполнен щелчок на кнопке выбора варианта ответа
Private Sub buttonAnswer3_Click(ByVal sender As Object, ByVal _
 e As System.EventArgs) Handles buttonAnswer3.Click
 evaluateMultipleChoiceAnswer(buttonAnswer3, 3)
End Sub
'ОБРАБОТЧИК СОБЫТИЙ: Был выполнен щелчок на кнопке выбора варианта ответа
Private Sub buttonAnswer4_Click(ByVal sender As Object, ByVal _
 e As System.EventArgs) Handles buttonAnswer4.Click
 evaluateMultipleChoiceAnswer(buttonAnswer4, 4)
End Sub
'ОБРАБОТЧИК СОБЫТИЙ: Был выполнен щелчок на кнопке выбора варианта ответа
Private Sub buttonAnswer5_Click(ByVal sender As Object, ByVal _
 e As System.EventArgs) Handles buttonAnswer5.Click
 evaluateMultipleChoiceAnswer(buttonAnswer5, 5)
End Sub

Оглавление книги


Генерация: 1.136. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз