thisAssembly.GetManifestResourceStream( _
assemblyName + ".Hank_LeftRunl.bmp"))
m_CaveMan_Bitmap4 = New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream( _
assemblyName + ".Hank_LeftRun2.bmp"))
'Добавить их в коллекцию
m_colCaveManBitmaps = New System.Collections.ArrayList
m_colCaveManBitmaps.Add(m_CaveMan_Bitmap1)
m_colCaveManBitmaps.Add(m_CaveMan_Bitmap2)
m_colCaveManBitmaps.Add(m_CaveMan_Bitmap3)
m_colCaveManBitmaps.Add(m_CaveMan_Bitmap4)
End If
'Возвратить коллекцию
Return m_colCaveManBitmaps
End Function
End Class
Примеры к главе 13 (проектирование пользовательского интерфейса)
Листинг 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