Превращение рисованного изображения в кнопку в VB.net 2010

#.net #vb.net #button #resources #drawimage

#.net #vb.net #кнопка #Ресурсы #рисованное изображение

Вопрос:

У меня есть эти три изображения, которые я нарисовал в своей форме.

     GraphicsBuffer.DrawImage(ButtonEasy, New Rectangle(25, 330, 100, 50), 0, 0, 100, 50, GraphicsUnit.Pixel, ImageAttributes)
    GraphicsBuffer.DrawImage(ButtonMedium, New Rectangle(150, 330, 100, 50), 0, 0, 100, 50, GraphicsUnit.Pixel, ImageAttributes)
    GraphicsBuffer.DrawImage(ButtonHard, New Rectangle(275, 330, 100, 50), 0, 0, 100, 50, GraphicsUnit.Pixel, ImageAttributes)
  

Но я хочу создать логическое выражение для того, когда на них нажимают, чтобы я мог запускать события для загрузки выбранного режима игры.

Делаю ли я это с помощью кода ресурса или есть простой способ сделать это. Мне кажется, что это было бы плохо и синтаксически некорректно.

Редактировать: я добрался до этого:

 Private Sub ButtonEasy_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs) _
 Handles ButtonEasy.MouseClick

    Dim buttonEasyRect = New Rectangle(25, 330, 100, 50)
    If buttonEasyRect.Contains(e.Location) Then

    End If

End Sub
  

Но не совсем уверен, куда идти от этого. По-видимому, «ButtonEasy.Щелчок мышью «Обрабатывает» выдает ошибку «Переменная событий не определена». Не уверен, куда идти дальше.

Заранее спасибо!

Правка 2: После помощи от LarsTech я получил перечисление в и это:

 Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown
    Dim level As Difficulty = Difficulty.None
    If e.Button = MouseButtons.Left Then
    End If

    If New Rectangle(25, 330, 100, 50).Contains(e.Location) Then
        level = Difficulty.Easy
    ElseIf New Rectangle(150, 330, 100, 50).Contains(e.Location) Then       
        level = Difficulty.Medium
    ElseIf New Rectangle(275, 330, 100, 50).Contains(e.Location) Then
        level = Difficulty.Hard
    End If

    If level = Difficulty.Easy Then
        GameMode = 1
    ElseIf level = Difficulty.Medium Then
        GameMode = 2
    ElseIf level = Difficulty.Hard Then
        GameMode = 3
    End If

End Sub
  

Как мне вызвать это в моем цикле? В настоящее время у меня есть цикл ожидания Asynchkeypress, чтобы установить временную шкалу в 300, которая запускает игру.

Ответ №1:

Есть ли причина, по которой вы на самом деле не используете кнопки для этого?

В любом случае, у вас, вероятно, должен быть класс для всей этой информации, какое изображение, какой прямоугольник и т.д. Этот класс button также будет содержать логику IsPushed.

Но для того, что у вас есть в настоящее время, наличие перечисления, вероятно, помогло бы:

 Public Enum Difficulty
  None
  Easy
  Medium
  Hard
End Enum
  

Затем в событии наведения курсора мыши:

 Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown
  Dim level As Difficulty = Difficulty.None

  If e.Button = MouseButtons.Left Then
    If New Rectangle(25, 330, 100, 50).Contains(e.Location) Then
      level = Difficulty.Easy
    ElseIf New Rectangle(150, 330, 100, 50).Contains(e.Location) Then
      level = Difficulty.Medium
    ElseIf New Rectangle(275, 330, 100, 50).Contains(e.Location) Then
      level = Difficulty.Hard
    End If
  End If

  If level <> Difficulty.None Then
    MessageBox.Show("You are playing " amp; level.ToString)
  End If
End Sub
  

Комментарии:

1. Я думаю, это именно то, что я искал! Я собираюсь немного подправить это, чтобы лучше соответствовать моему коду, и вернусь через несколько минут с результатами.

2. Хорошо, я добавил новый код в свой post, просто не уверен, как вызвать его в моем цикле.

3. @user1041950 Ты не делаешь это простым. Что вы подразумеваете под циклом? WinForms использует события. Если вы нажмете на форму и будете обрабатывать событие наведения курсора мыши, будет запущен код, приведенный в моем примере. Вам не нужна отдельная переменная «GameMode», просто переместите переменную level на уровень класса.

4. Хорошо, то, что я делал раньше, заключалось в создании цикла подготовки игры к запуску, и я знаю, что, вероятно, мог бы сделать это лучше, но, вероятно, слишком поздно. Как мне заставить событие при наведении курсора мыши работать только при вызове «choosegamemode», обрабатывать событие наведения курсора мыши в этом подразделе?

5. @user1041950 «Звучит» так, будто у вас есть одна форма, пытающаяся обработать все эти разные «представления» игры. Это не самый простой способ сделать что-то в WinForms. Но да, у вас должно быть другое перечисление для GameView, для установки или воспроизведения, и вы рисуете и обрабатываете события мыши на основе того, в каком представлении вы находитесь. Близок ли я к пониманию этого?