// обработчик нажатия клавиш. основная логика
        public void Control_KeyDown(object sender, KeyEventArgs e)
        {
            // Проверяем, было ли уже обработано событие - чтобы исключить учёт удержания клавиши
            if (isKeyPressed)
            {
                return;
            }
            isKeyPressed = true;

            Keys keyCode = e.KeyCode;

            if (CurrentControlMode == ControlMode.ControlStarted && keyCode == Keys.Enter)
            {
                mistakeCountTextControl.AddLettersOnControl(symbols); // добавляем символы в поток
                CurrentControlMode = ControlMode.TypingStarted;       // стартуем
                lbTaskText.Text    = "Поехали!";
                mistakeCountTextControl.Start();
            }
            else if (CurrentControlMode == ControlMode.TypingStarted && keyCode == Keys.Escape) // на паузу
            {
                Result = MistakeCountControlResult.PAUSE;
            }
            else if (CurrentControlMode == ControlMode.TypingStopped && keyCode == Keys.Escape) // на восстановление от паузы
            {
                Result = MistakeCountControlResult.RESUME;
            }
            else if (CurrentControlMode == ControlMode.TypingStarted)   // при печатании
            {
                char middleSymbol  = mistakeCountTextControl.GetLetterInTheMiddleOfControl();
                char pressedSymbol = '\0';
                switch (lang)
                {
                case Language.ENGLISH:
                    pressedSymbol = KeyboardHelper.GetUpperEngCharForKey(keyCode); break;

                case Language.RUSSIAN:
                    pressedSymbol = KeyboardHelper.GetUpperRusCharForKey(keyCode); break;
                }
                if (pressedSymbol == '\0' || pressedSymbol != middleSymbol)
                {
                    statistic.errors++;
                    lbTaskText.Text = "Неправильная клавиша!";
                }
                else if (pressedSymbol == middleSymbol)
                {
                    mistakeCountTextControl.DropFirstLetter();
                    statistic.correct++;
                    mistakeCountTextControl.UpdatingStateTimer.Start();
                    lbTaskText.Text = "Верно";
                }
            }
            else if (CurrentControlMode == ControlMode.TypingFinished && keyCode == Keys.Enter) // при завершении работы
            {
                Result = MistakeCountControlResult.EXIT;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Обработчик события нажатия клавиши
        /// </summary>
        /// <param name="sender">Объект, вызвавший событие</param>
        /// <param name="e">Параметры события</param>
        public override void Control_KeyDown(object sender, KeyEventArgs e)
        {
            // ! Подписан на событие самого контрола

            // Проверяем, было ли уже обработано событие - чтобы исключить учёт удержания клавиши
            if (f_keyDown)
            {
                return;
            }
            f_keyDown = true;

            Keys keyCode = e.KeyCode;

            // Начинаем состязание, если после отображения тренажёра нажат Enter
            if (CurControlMode == ControlMode.ControlStarted && keyCode == Keys.Enter)
            {
                symbolQueueControl.AddLettersToStream(symbols, lettersInterval); // добавляем символы в поток
                CurControlMode = ControlMode.StreamStarted;                      // стартуем поток
                lTaskText.Text = "Поток букв запущен!";
                symbolQueueControl.StartLettersStream(symbolStream.SymbolSpeed);
            }
            // Проверяем, не была ли нажата пауза
            else if (CurControlMode == ControlMode.StreamStarted && keyCode == Keys.Escape)
            {
                Result = SymbolStreamControlResult.PAUSE;
            }
            // Проверяем, не запрошено ли снятие паузы
            else if (CurControlMode == ControlMode.StreamStoped && keyCode == Keys.Escape)
            {
                Result = SymbolStreamControlResult.RESUME;
            }
            // Если поток идёт - проверяем нажатую кнопку на соответствие символу в кольце
            else if (CurControlMode == ControlMode.StreamStarted)
            {
                char roundedSymbol = symbolQueueControl.GetRoundedChar();
                char pressedSymbol;
                switch (lang)
                {
                case Language.ENGLISH:
                    pressedSymbol = KeyboardHelper.GetUpperEngCharForKey(keyCode); break;

                case Language.RUSSIAN:
                    pressedSymbol = KeyboardHelper.GetUpperRusCharForKey(keyCode); break;

                default: pressedSymbol = '\0'; break;
                }
                if (roundedSymbol == '\0')
                {
                    curStatistic.missedCount++;
                    lTaskText.Text = "Мимо!";
                }
                else if (pressedSymbol == '\0' || pressedSymbol != roundedSymbol)
                {
                    curStatistic.missedCount++;
                    lTaskText.Text = "Неправильная клавиша!";
                }
                else if (pressedSymbol == roundedSymbol)
                {
                    symbolQueueControl.DropFirstLetterFormStream();
                    curStatistic.correctCount++;
                    lTaskText.Text = "Отлично!";
                }
            }
            // Завершение работы элемента управления
            else if (CurControlMode == ControlMode.StreamFinished && keyCode == Keys.Enter)
            {
                Result = SymbolStreamControlResult.EXIT;
            }
        }