Перейти к содержимому

Как сделать секундомер в c windows forms

  • автор:

Руководство. Добавление таймера в приложение WinForms для математики

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

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

В тесте используется элемент управления Timer. Код, лежащий в основе этого элемента управления, отслеживает прошедшее время и проверяет ответы игрока.

В этом третьем учебнике вы научитесь следующему:

  • Добавление элемента управления Timer.
  • Добавление обработчика событий для таймера.
  • Написание кода для проверки ответов игрока, вывода сообщений и указания правильных ответов.

Необходимые компоненты

Этот учебник построен на предыдущих, начиная с учебника Создание приложения WinForms с математическим тестом. Если вы не изучили эти учебники, начните с них.

Добавление таймера с обратным отсчетом

Для наблюдения за временем в ходе теста используется компонент «Таймер». Кроме того, требуется переменная для хранения оставшегося времени.

    Добавьте целочисленную переменную с именем timeLeft так же, как вы объявляли переменные в предыдущих учебниках. Разместите объявление timeLeft сразу после других объявлений. Код должен выглядеть так, как показано ниже.

public partial class Form1 : Form < // Create a Random object called randomizer // to generate random numbers. Random randomizer = new Random(); // These integer variables store the numbers // for the addition problem. int addend1; int addend2; // These integer variables store the numbers // for the subtraction problem. int minuend; int subtrahend; // These integer variables store the numbers // for the multiplication problem. int multiplicand; int multiplier; // These integer variables store the numbers // for the division problem. int dividend; int divisor; // This integer variable keeps track of the // remaining time. int timeLeft; 
Public Class Form1 ' Create a Random object called randomizer ' to generate random numbers. Private randomizer As New Random ' These integer variables store the numbers ' for the addition problem. Private addend1 As Integer Private addend2 As Integer ' These integer variables store the numbers ' for the subtraction problem. Private minuend As Integer Private subtrahend As Integer ' These integer variables store the numbers ' for the multiplication problem. Private multiplicand As Integer Private multiplier As Integer ' These integer variables store the numbers ' for the division problem. Private dividend As Integer Private divisor As Integer ' This integer variable keeps track of the ' remaining time. Private timeLeft As Integer 

Используйте элемент управления языка программирования в правом верхнем углу этой страницы, чтобы просмотреть фрагмент кода на C# или Visual Basic.

Programming language control for Microsoft Learn

  1. В конструкторе Windows Forms переместите элемент управления Timer из категории Компоненты на панели элементов в форму. Элемент управления появляется в серой области в нижней части окна конструктора.
  2. Щелкните в форме только что добавленный значок timer1 и установите его свойство Interval равным 1000. Поскольку этот интервал измеряется в миллисекундах, при значении 1000 таймер создает событие Tick каждую секунду.

Проверка ответов

Поскольку таймер создает событие Tick каждую секунду, имеет смысл проверять истекшее время в обработчике событий Tick. Также целесообразно проверять ответы в этом обработчике событий. Если время истекло или ответы указаны правильно, тест должен завершиться.

Перед написанием этого обработчика событий добавьте метод CheckTheAnswer() , чтобы определить, верны ли ответы на арифметические примеры. Этот метод должен располагаться в строке с другими методами, например StartTheQuiz() . Код должен выглядеть так, как показано ниже.

/// /// Check the answers to see if the user got everything right. /// /// True if the answer's correct, false otherwise. private bool CheckTheAnswer() < if ((addend1 + addend2 == sum.Value) && (minuend - subtrahend == difference.Value) && (multiplicand * multiplier == product.Value) && (dividend / divisor == quotient.Value)) return true; else return false; >
''' ''' Check the answers to see if the user got everything right. ''' ''' True if the answer's correct, false otherwise. ''' Public Function CheckTheAnswer() As Boolean If addend1 + addend2 = sum.Value AndAlso minuend - subtrahend = difference.Value AndAlso multiplicand * multiplier = product.Value AndAlso dividend / divisor = quotient.Value Then Return True Else Return False End If End Function 

Этот метод определяет ответы на арифметические примеры и сравнивает результаты со значениями в элементах управления NumericUpDown. В этом коде:

  • Версия на Visual Basic использует ключевое слово Function вместо обычного ключевого слова Sub , потому что этот метод возвращает значение.
  • Так как простого способа ввести знак умножения (×) и знак деления (÷) с клавиатуры нет, в языках C# и Visual Basic используется звездочка (*) для умножения и косая черта (/) для деления.
  • В C# && — это оператор logical and . Эквивалентный оператор в языке Visual Basic — AndAlso . Оператор logical and используется для проверки того, имеет ли значение true более одного условия. В этом случае, если все значения верны, метод возвращает значение true . В противном случае метод возвращает значение false .
  • Инструкция if использует свойство Value элемента управления NumericUpDown для доступа к текущему значению элемента управления. В следующем разделе вы используете то же свойство для вывода правильного ответа в каждом элементе управления.

Добавление обработчика событий в таймер

Теперь, когда у вас есть способ проверить ответы, можно написать код для обработчика событий Tick. Этот код выполняется каждую секунду после того, как таймер создаст событие Tick. Этот обработчик событий проверяет ответы игрока, вызывая метод CheckTheAnswer() . Он также проверяет, сколько времени теста уже истекло.

    Двойным щелчком выберите в форме элемент управления Timer либо выделите его и нажмите клавишу ВВОД. Эти действия добавляют обработчик событий Tick к таймеру. Откроется редактор кода, в котором отобразится метод обработчика Tick.

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

private void timer1_Tick(object sender, EventArgs e) < if (CheckTheAnswer()) < // If CheckTheAnswer() returns true, then the user // got the answer right. Stop the timer // and show a MessageBox. timer1.Stop(); MessageBox.Show("You got all the answers right!", "Congratulations!"); startButton.Enabled = true; >else if (timeLeft > 0) < // If CheckTheAnswer() returns false, keep counting // down. Decrease the time left by one second and // display the new time left by updating the // Time Left label. timeLeft = timeLeft - 1; timeLabel.Text = timeLeft + " seconds"; >else < // If the user ran out of time, stop the timer, show // a MessageBox, and fill in the answers. timer1.Stop(); timeLabel.Text = "Time's up!"; MessageBox.Show("You didn't finish in time.", "Sorry!"); sum.Value = addend1 + addend2; difference.Value = minuend - subtrahend; product.Value = multiplicand * multiplier; quotient.Value = dividend / divisor; startButton.Enabled = true; >> 
Private Sub Timer1_Tick() Handles Timer1.Tick If CheckTheAnswer() Then ' If CheckTheAnswer() returns true, then the user ' got the answer right. Stop the timer ' and show a MessageBox. Timer1.Stop() MessageBox.Show("You got all of the answers right!", "Congratulations!") startButton.Enabled = True ElseIf timeLeft > 0 Then ' If CheckTheAnswer() returns false, keep counting ' down. Decrease the time left by one second and ' display the new time left by updating the ' Time Left label. timeLeft -= 1 timeLabel.Text = timeLeft & " seconds" Else ' If the user ran out of time, stop the timer, show ' a MessageBox, and fill in the answers. Timer1.Stop() timeLabel.Text = "Time's up!" MessageBox.Show("You didn't finish in time.", "Sorry!") sum.Value = addend1 + addend2 difference.Value = minuend - subtrahend product.Value = multiplicand * multiplier quotient.Value = dividend / divisor startButton.Enabled = True End If End Sub 

Этот метод выполняется каждую секунду теста. Код сначала проверяет значение, которое возвращает CheckTheAnswer() .

  • Если все ответы верны, это значение равно true , и тест завершается:
    • Таймер останавливается.
    • Появится поздравительное сообщение.
    • Свойству Enabled элемента управления startButton устанавливается значение true , чтобы игрок мог заново запустить тест.
    • Если эта переменная больше 0, таймер вычитает 1 из timeLeft. Затем он обновляет свойство Text элемента управления timeLabel, чтобы показать игроку, сколько осталось секунд.
    • Если времени не остается, таймер останавливается и изменяет текст timeLabel на time's up! В окне сообщения будет объявлено, что тест закончен, и появятся ответы. Кнопка старта снова станет доступной.

    Запуск таймера

    Чтобы запустить таймер при запуске теста, добавьте в конец метода StartTheQuiz() три строки, как показано в следующем примере.

    /// /// Start the quiz by filling in all of the problem /// values and starting the timer. /// public void StartTheQuiz() < // Fill in the addition problem. // Generate two random numbers to add. // Store the values in the variables 'addend1' and 'addend2'. addend1 = randomizer.Next(51); addend2 = randomizer.Next(51); // Convert the two randomly generated numbers // into strings so that they can be displayed // in the label controls. plusLeftLabel.Text = addend1.ToString(); plusRightLabel.Text = addend2.ToString(); // 'sum' is the name of the NumericUpDown control. // This step makes sure its value is zero before // adding any values to it. sum.Value = 0; // Fill in the subtraction problem. minuend = randomizer.Next(1, 101); subtrahend = randomizer.Next(1, minuend); minusLeftLabel.Text = minuend.ToString(); minusRightLabel.Text = subtrahend.ToString(); difference.Value = 0; // Fill in the multiplication problem. multiplicand = randomizer.Next(2, 11); multiplier = randomizer.Next(2, 11); timesLeftLabel.Text = multiplicand.ToString(); timesRightLabel.Text = multiplier.ToString(); product.Value = 0; // Fill in the division problem. divisor = randomizer.Next(2, 11); int temporaryQuotient = randomizer.Next(2, 11); dividend = divisor * temporaryQuotient; dividedLeftLabel.Text = dividend.ToString(); dividedRightLabel.Text = divisor.ToString(); quotient.Value = 0; // Start the timer. timeLeft = 30; timeLabel.Text = "30 seconds"; timer1.Start(); >
    ''' ''' Start the quiz by filling in all of the problem ''' values and starting the timer. ''' ''' Public Sub StartTheQuiz() ' Fill in the addition problem. ' Generate two random numbers to add. ' Store the values in the variables 'addend1' and 'addend2'. addend1 = randomizer.Next(51) addend2 = randomizer.Next(51) ' Convert the two randomly generated numbers ' into strings so that they can be displayed ' in the label controls. plusLeftLabel.Text = addend1.ToString() plusRightLabel.Text = addend2.ToString() ' 'sum' is the name of the NumericUpDown control. ' This step makes sure its value is zero before ' adding any values to it. sum.Value = 0 ' Fill in the subtraction problem. minuend = randomizer.Next(1, 101) subtrahend = randomizer.Next(1, minuend) minusLeftLabel.Text = minuend.ToString() minusRightLabel.Text = subtrahend.ToString() difference.Value = 0 ' Fill in the multiplication problem. multiplicand = randomizer.Next(2, 11) multiplier = randomizer.Next(2, 11) timesLeftLabel.Text = multiplicand.ToString() timesRightLabel.Text = multiplier.ToString() product.Value = 0 ' Fill in the division problem. divisor = randomizer.Next(2, 11) Dim temporaryQuotient As Integer = randomizer.Next(2, 11) dividend = divisor * temporaryQuotient dividedLeftLabel.Text = dividend.ToString() dividedRightLabel.Text = divisor.ToString() quotient.Value = 0 ' Start the timer. timeLeft = 30 timeLabel.Text = "30 seconds" Timer1.Start() End Sub 

    Теперь при запуске теста переменная timeLeft устанавливается в значение 30, а свойство Text элемента управления timeLabel — 30 секунд. После этого метод Start() элемента управления Timer начинает обратный отсчет.

    Запустите приложение.

    Screenshot that shows a completed quiz with 19 seconds remaining. The Start the quiz button is available.

    1. Сохраните и выполните программу.
    2. Нажмите Начать тест. Таймер начинает обратный отсчет. Когда время истечет, тест закончится и появятся ответы.
    3. Запустите еще один тест и предоставьте правильные ответы на арифметические примеры. При правильном ответе в течение отведенного времени откроется окно сообщения, кнопка запуска станет доступной, а таймер остановится.

    Следующие шаги

    Перейдите к следующему учебнику, чтобы узнать, как настроить математический тест.

    Как сделать секундомер в c windows forms

    Регистрация: 18.11.2013

    Сообщений: 2

    C# Секундомер

    Доброго времени суток! Помогите доделать секундомер: нужен циферблат(обозначение от 1 до 60),линия секундомера должна выглядеть как стрелка,а не линия(мой пример).
    Вот мой секундомер:

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace _13 < using System.Drawing.Drawing2D; public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void Form1_Load(object sender, EventArgs e) < >public int angle = 0; public int num = 0; private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) < GraphicsPath myGraphicsPath = new GraphicsPath(); myGraphicsPath.AddString(num.ToString(), FontFamily.GenericMonospace, (int)FontStyle.Italic, 21f, new Point(20, 20), StringFormat.GenericDefault); myGraphicsPath.AddLine(100, 0, 100, 100); Matrix myMatrix = new Matrix(); PointF myPointF = new PointF(100,100); myMatrix.RotateAt(angle, myPointF); myGraphicsPath.Transform(myMatrix); e.Graphics.DrawPath(new Pen(Color.Black, 3), myGraphicsPath); angle = angle + 6; num = (int)angle / 6; if (angle == 360) angle = 0; e.Graphics.DrawEllipse(new Pen(Color.Blue, 2), 0, 0, 200, 200); e.Graphics.DrawLine(new Pen(Color.Red, 1), 0, 100, 200, 100); e.Graphics.DrawLine(new Pen(Color.Red, 1),100,0,100,200); >private void timer1_Tick(object sender, EventArgs e) < panel1.Refresh(); >> >

    ___________
    Код нужно оформлять по правилам:
    тегом [CODE]..[/СODE]
    (кнопочка на панели форматирования с решёточкой #)
    Не забывайте об этом!

    Последний раз редактировалось Serge_Bliznykov; 18.11.2013 в 16:41 .

    NikolyaShiryaev
    Посмотреть профиль
    Найти ещё сообщения от NikolyaShiryaev

    Как сделать секундомер в C#

    Эта программа представляет собой простой секундомер. Когда вы нажимаете кнопку «Пуск», программа меняет заголовок кнопки на «Стоп» и запускает Timer. По мере запуска секундомера Timer программа отображает прошедшее время. Нажмите кнопку «Стоп», чтобы остановить Timer.

    Этот пример почти тривиален, но на самом деле возникает несколько интересных проблем.

    В следующем коде показан обработчик события Click кнопки.

    // Запуск или останов секундомера. private DateTime StartTime; private void btnStart_Click(object sender, EventArgs e)

    Этот код сначала переключает свойство Enable компонента Timer компонента, поэтому он запускается, если он остановлен и наоборот.

    Далее код устанавливает свойство кнопки Text кнопки. Если Timer включен, тогда выполняется Timer, поэтому свойство Text кнопки должно быть «Стоп». Если Timer отключен, то Timer не работает, поэтому свойство Text кнопки должно быть «Start». (Обычно я не использую оператор?: потому что это сбив с толку, но в этом случае он сокращает код, и это то, что каждый программист на C# должен знать, как использовать, даже если вы его не используете.)

    Наконец, этот код записывает текущее время в переменной StartTime.

    Каждый раз, когда галочка секундомера Timer гаснет, для отображения прошедшего времени выполняется следующий обработчик событий.

    // Показывает новое прошедшее время. private void tmrClock_Tick(object sender, EventArgs e) < TimeSpan elapsed = DateTime.Now - StartTime; // Начнем с дней, если больше 0. string text = ""; if (elapsed.Days >0) text += elapsed.Days.ToString() + "."; // Преобразование миллисекунд в десятые доли секунды. int tenths = elapsed.Milliseconds / 100; // Запишите оставшееся время. text += elapsed.Hours.ToString("00") + ":" + elapsed.Minutes.ToString("00") + ":" + elapsed.Seconds.ToString("00") + "." + tenths.ToString("0"); lblElapsed.Text = text; >

    Этот код получает прошедшее время, так как секундомер запускается путем вычитания времени начала с текущего времени.

    Истекшая переменная TimeSpan имеет Days, Часы, Минуты, Секунды , и Milliseconds, чтобы узнать, сколько времени прошло. Каждое из этих значений не учитывает значения более высокого уровня. Например, если прошло 1 час и 10 минут, свойство Hour равно 1, а свойство Minutes равно 10. Свойство Minutes not 70 для представления всего прошедшего времени в минутах.

    Класс TimeSpan также имеет TotalDays, TotalHours и аналогичные свойства для представления времени в одной единице. В этом примере TotalMinutes будет равным 70. Этот пример не использует свойства Total.

    Если количество прошедших дней составляет не менее 1, код добавляет количество дней к переменной text.

    Затем код преобразует число миллисекунд в десятые доли секунды. Это одно из мест, где этот пример немного сложнее. Выражение прошло. Миллисекунды / 100 обрезает результат. Например, если число миллисекунд равно 199, этот код обрезает результат на 1 десятую секунды.

    Однако вы, вероятно, захотите округлить это до 2 десятых секунды. Вы можете сделать это с помощью дополнительного кода, но что произойдет, если число миллисекунд равно 999? Тогда вы обойдете это до 10 десятых секунды. Это означало бы, что вам нужно добавить еще 1 секунду к числу прошедших секунд. Но тогда, если количество прошедших секунд равно 59? Затем вам нужно будет добавить минута к количеству прошедших минут.

    Вероятно, вы можете видеть, куда это направляется. Вам понадобятся специальные случаи, чтобы добавить дополнительные секунды, минуты, часы и дни. Обработка всех этих особых случаев делает код намного дольше и труднее читать и отлаживать. Этот секундомер просто обрезает число десятых. Результат может быть отключен на 0,05 секунды. Это всего лишь 1/20 секунды, и прошедшее время сокращается на эту сумму в течение небольшого промежутка времени, поэтому я хочу жить с ним, чтобы упростить код.

    Фактически, вы можете сделать код секундомера еще проще, просто отображая значение elapsed.ToString (). К сожалению, это показывает прошедшее время в формате 1.02: 03: 04.0050000. Это дает необоснованное впечатление о точности времени.

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

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

    Другой подход доступен в Visual Studio 2010 и более поздних версиях. В более ранних версиях метод TimeSpan класса TimeSpan не принимает никаких параметров и просто дает результат, аналогичный 1.02: 03: 04.0050000. В Visual Studio 2010 и более поздних версиях метод ToString может принимать строку форматирования. Строки стандартного формата отображают миллисекунды не менее 3-х цифр. Вы можете использовать строку пользовательского формата, например ts.ToString (@ "dd \: hh \: mm \: ss \ .f"), но тогда результат не распознается локалью. Если вам нужен секундомер для запуска в других странах, вам нужно будет определить страну и соответствующим образом скорректировать формат. По крайней мере, ToString (), а стандартные форматы, такие как ToString ("g"), являются языковыми, поэтому вам не нужно беспокоиться о стране.

    Программирование на C, C# и Java

    Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

    ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode

    Исходный код: таймер на C# в Windows Forms

    Разбираем создание таймера на языке программирования C# в приложении Windows Forms. Полный исходный код с подробными комментариями можно будет скачать внизу страницы.

    Для начала в Windows Forms создаём внешнюю оболочку программы. У нас она выглядит вот так:

    таймер на C# в Windows Forms - vscode.ru

    Здесь у нас 8 Label’ов, 3 TextBox’a, 3 Buttom’a и сам Timer.

    Примечание: при переносе элемента Timer в форму, на неё ничего не появляется. Лишь в нижней части окна программы под формой появляется значок , не пугайтесь.

    Щёлкнем на значок таймера и в окне «Свойства» в группе «Поведение» устанавливаем значение параметра Interval равным 1000. Данный параметр определяет длину тика таймера в миллисекундах, указав 1000, мы сделали один тик равным одной секунде.

    После оформления и настройки приступаем к коду. Вводим целочисленные переменные h — часы, m- минуты, s — секунды.

    Затем дважды щёлкаем мышью на кнопке «Старт» и переходим на участок кода, отвечающий за клик на эту кнопку.

    Туда мы пишем следующий код:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *