Книга: Программирование мобильных устройств на платформе .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
- Листинг 13.1. Использование конечного автомата для экспериментов с двумя различными вариантами компоновки пользовательского интерфейса
- Листинг 13.2. Динамическое создание элементов управления на форме во время выполнения
- Листинг 13.3. Фильтрующее текстовое окно, принимающее текст в формате ###-##-####
- Листинг 13.4. Код формы для создания пользовательского элемента управления TextBox
- Листинг 13.5. код формы, демонстрирующий использование прозрачности '
- Листинг 13.6. Код формы, демонстрирующий загрузку встроенных ресурсов
- Примеры к главе 13 (проектирование пользовательского интерфейса)
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Восстановление с использованием инструмента gbak
- Миграция между различными версиями InterBase
- Типы страниц и их использование
- Использование констант
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса
- Использование CAST() с типами дата
- Определение пользовательского формата числовых данных
- Использование типов содержимого и столбцов
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC