Member 13639648 Ответов: 2

Как активировать следующую форму


Эй ребята,

начав изучать C#, я пытаюсь сделать игру quizz, и моя цель-иметь 3 формы.
Первый-это то, где начинается, второй-сама игра, а третий-счет.

Но я застрял здесь, я могу поменять местами формы, но моя форма 2 не активна, и я ничего не могу с ней сделать..

Что я уже пробовал:

private void btn_play_Click(object sender, EventArgs e)
       {
           QUIZ jogo = new QUIZ();
           this.Hide();
           jogo.StartPosition = FormStartPosition.CenterScreen;
           jogo.Show();

       }

cvogt61457

Нам нужно будет увидеть еще кое - что из вашего кода- почти все.
Однако я не думаю, что есть способ застегнуть ваше решение и прикрепить его.
Сократите код для каждой формы и основного дисплея до минимума, который показывает проблему, и поместите его в вопрос.

2 Ответов

Рейтинг:
12

BillWoodruff

GameControl // основная форма проекта winform
Кнопка btnPlay;
Кнопка btnGetScore;
Текстовое поле tbxScoreReport;
Флажок checkBox1;
Флажок checkBox2;

1. поток управления: запуск приложения

a. экземпляр GameControl загружается при запуске приложения

a.1. создается экземпляр "геймплея", игры.

a.2 установлен обработчик событий для FormClosing Enent 'Game

a.2.a это проверяет, закрывается ли игра из-за закрытия приложения или из-за того, что пользователь закрыл эту форму: если приложение закрывается, то ничего не делается; если нет, то при наличии каких-либо игровых данных отчет об игровой статистике записывается в текстовое поле в основной форме.

b. при нажатии кнопки воспроизведения

b.1 Метод ConfigureGame 'Game вызывается для установки начальных параметров игры

b.2 кнопка воспроизведения отключена

б.Показано 3 игровой форме является

2. поток управления: показана игровая форма

a. создается новый экземпляр ScoreData, 'Data

b. показанный обработчик событий устанавливает время начала игры

c. установлен обработчик KeyDown, который закроется, если клавиши alt и q будут удерживаться нажатыми

c.1 когда игровая форма закроется, это вызовет событие FormClosing, определенное в экземпляре GameControl

d. кнопки btnAddPoints и btnAddPoints увеличивают и уменьшают счет

e. метод GetGameStatus вызывается только экземпляром GameControl

пример кода:

public partial class GameControl : Form
{
    private static int gameCounter = 1;

    private GamePlay Game;

    public GameControl()
    {
        InitializeComponent();
    }

    private void GameProtoType_Load(object sender, EventArgs e)
    {
        Game = new GamePlay();

        Game.Owner = this;

        Game.FormClosing += GameOnFormClosing;
    }

    private void GameOnFormClosing(object sender, FormClosingEventArgs e)
    {
        if (Game.Data != null && e.CloseReason != CloseReason.FormOwnerClosing)
        {
            Game.Data.GameEnd = DateTime.Now;
            tbxScoreReport.Text = Game.GetGameStatus();

            btnPlay.BackColor = SystemColors.Control;
            btnPlay.Enabled = true;
        }
    }

    private void btnPlay_Click(object sender, EventArgs e)
    {
        tbxScoreReport.Clear();

        Game.ConfigureGame(gameCounter++, "The Player", checkBox1.CheckState, checkBox2.CheckState);

        btnPlay.BackColor = Color.Firebrick;
        btnPlay.Enabled = false;

        Game.Show();
    }

    private void btnGetScore_Click(object sender, EventArgs e)
    {
        if (Game.Data == null) return;

        tbxScoreReport.Text = Game.GetGameStatus();
    }
}
Геймплей // winform принадлежит компании 'GameControl
Текстовое поле tbxCurrentScore;
Кнопка btnAddPoints;
Кнопка btnSubPoints;
public partial class GamePlay : Form
{
    public GamePlay()
    {
        InitializeComponent();
    }

    public ScoreData Data { set; get; }

    public void ConfigureGame(int id, string plname = "", CheckState chk1 = CheckState.Unchecked,
        CheckState chk2 = CheckState.Unchecked)
    {
        Data = new ScoreData(id, plname);

        if (chk1 == CheckState.Checked)
        {
            // configure
        }

        if (chk2 == CheckState.Checked)
        {
            // configure
        }
    }

    private void GamePlay_Shown(object sender, EventArgs e)
    {
        Data.GameStart = DateTime.Now;
    }

    private void btnAddPoints_Click(object sender, EventArgs e)
    {
        Data.ChangeScore(100);
        tbxCurrentScore.Text = Data.Score.ToString();
    }

    private void btnSubPoints_Click(object sender, EventArgs e)
    {
        Data.ChangeScore(-100);
        tbxCurrentScore.Text = Data.Score.ToString();
    }

    public string GetGameStatus()
    {
        var duration = Data.GameEnd - Data.GameStart;

        return
            $"Player {Data.PlayerName} : Id {Data.Id} : Score {Data.Score}\r\nStart : {Data.GameStart} : End {Data.GameEnd}\r\nDuration : hours {duration.Hours} | minutes: {duration.Minutes} | seconds: {duration.Seconds} | ms: {duration.Milliseconds}";
    }

    private void GamePlay_KeyDown(object sender, KeyEventArgs e)
    {
        if (ModifierKeys == Keys.Alt && e.KeyCode == Keys.Q)
        {
            this.Close();
        }
    }
}

public class ScoreData
{
    public ScoreData(int id, string plname = "")
    {
        Id = id;
        PlayerName = plname;

        Score = 0;
        GameStart = DateTime.Now;
    }

    public int Id { set; get; }
    public string PlayerName { set; get; }

    public int Score { set; get; }

    public DateTime GameStart { set; get; }

    public DateTime GameEnd { set; get; }

    public void ChangeScore(int adjust)
    {
        Score += adjust;
    }
}
Здесь не реализовано: способ приостановить игру и снова запустить ее, отслеживая фактическое игровое время ... должен быть легким.

... конец редактирования ...

Во-первых, вам нужно сделать некоторые стратегические выборы:

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

а. заставка ?
b. экран конфигурации ?
c. экран входа в систему
d. другой главный экран ?

e. существуют ли какие-либо обстоятельства, при которых игровое окно появляется первым ?

2. требуют ли ваши формы взаимодействия, отправки или получения данных ? В вашей игре, очевидно, форма счета должна содержать данные из игры.

3. использование форм, показанных модальными ?

а. вы хотите, чтобы игровой экран блокировал ваше приложение до тех пор, пока оно не будет закрыто ?

4. для каждой формы какие визуальные настройки вы хотите ?

a. FormBorderStyle, ShowinTaskBar, ShowIcon, StartPosition и т. д.

b. фиксированный или переменный размер ?

Скажите мне свой выбор, и я буду рад показать пример кода.


Member 13639648

Привет :)

В форме form1 его только для пользователей запустить саму игру через кнопку. 2-я форма-это сама игра, единственный вводимый пользователем-это флажки. В 3-м классе я думал о отображении счета и возможности повтора и выхода с помощью кнопок.

О размере и стиле уже позаботились

BillWoodruff

Привет, вторая форма, где игра "играется": tnhis - это тоже форма Windows ?

В ближайшие 24 часа я опубликую пример кода, который, как мне кажется, даст вам некоторые идеи о том, как управлять коммуникацией между формами.

твое здоровье, Билл

Member 13639648

да.

Спасибо за помощь Билл

овации

BillWoodruff

Добавлен пример кода. Дайте мне знать, если у вас возникнут вопросы.

Рейтинг:
0

an0ther1

Используйте метод Form.ShowDialog ().
Form.Show() действительно отображает форму, но метод, который вы используете для отображения формы, затем завершается - любой код после Form.Show() будет выполнен.
Form.ShowDialog() отображает форму и останавливает обработку метода до тех пор, пока форма не будет закрыта.
См.следующую статью MSDN о Form. ShowDialog();
Метод Form.ShowDialog (System.Окна.Формы)[^]

Это позволит вам использовать режим линейной обработки - псевдокод ниже;

// code in your btn_play_click event handler
this.Hide();
formQuiz QuizForm = new QuizForm();
formQuiz.StartupPosition = FormStartPosition.CenterScreen;
formQuiz.ShowDialog();
// this method will then wait until the formQuiz is closed

Другое преимущество использования ShowDialog заключается в том, что метод может возвращать форму результата.Показать не возвращает результат &амп; должны иметь общие свойства для получения значений, чтобы определить, если пользователь закрыл форму или завершения викторины.

Надеюсь, это поможет

с уважением