// обработчик нажатия клавиш. основная логика 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; } }
/// <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; } }