Работа с классом таймера в C#

Цель занятия

Научиться использовать класс таймера для обеспечения динамики в программе. Надлежит выяснить, как объявлять таймер, а также запускать ту или иную процедуру по событию от таймера. В качестве приложения с таймером в этом занятии реализована программа "бегущая строка". Более подробную информацию можно получить в [9].

Краткие теоретические сведения

Таймер — это механизм, который позволяет через указанное время многократно активизировать некоторую процедуру. Работу с таймером мы проводили и в Java, и в JavaScript. Рассмотрим, как реализовать бегущую строку на форме. Для этого разместим на форме две кнопки, одна из которых запускает бегущую строку (StartTimer (рис. 4.10)).

Рис. 4.10. Форма для демонстрации бегущей строки

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

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading;

Последняя из этого списка как раз и содержит класс Timer. Объявим переменную t класса Timer, а также саму бегущую строку и ее координаты в классе так:

public string str; public int xcoord;

public int ycoord;

private System.Threading.Timer t;

Объявление переменной класса таймера должно полностью определять путь к этому классу. Например, не пройдет такое указание:

private Timer t;

Теперь запрограммируем кнопку для запуска таймера так:

private void buttonl_Click(object sender, System.EventArgs e)

{

System.Threading.TimerCallback tc=new System.Threading.TimerCallback(showstr); t= new System.Threading.Timer(tc,null,100,350);

}

Здесь используется так называемый класс delegate (делегат) TimerCallback, которому следует передать в качестве аргумента название метода, запускаемого по таймеру, что, собственно, и объявляет инструкция:

t= new System.Threading.Timer(tc,null,100,350);

Инструкция указывает, что таймер следует запустить через 100 мс первый раз, а затем запускать каждые 350 мс. Метод showstr() выводит строку на экран и объявляется таким образом:

public void showstr(Object state)

{

Graphics g = this.CreateGraphics(); this.Refresh();

Font drawFont = new Font("Times New Roman", 16);

SolidBrush drawBrush = new SolidBrush(Color.Red); g.DrawString(str,drawFont,drawBrush,xcoord,ycoord); xcoord+=5; // Наращивание координаты по оси X для вывода // строки при очередном запуски этого метода

}

Вывод строки производит команда:

g.DrawString(str,drawFont,drawBrush,xcoord,ycoord);

Ее аргументами являются выводимая строка str, шрифт — drawFont, кисть (цвет) — drawBrush и координаты. Переменные drawFont и drawBrush созданы с помощью своих конструкторов так:

Font drawFont = new Font("Times New Roman", 16);

SolidBrush drawBrush = new SolidBrush(Color.Red);

После отображения строки увеличиваем координату по оси X для последующего вывода строки при очередном срабатывании таймера. Отметим также, что прежде чем рисовать строку, нужно очистить форму по команде: this.Refresh();

Отображение текста, как и рисование, выполняется на базе методов класса Graphics. Поэтому мы создали переменную графического контекста таким образом:

Graphics g = this.CreateGraphics();

Наконец, объявление метода showstr() требует обязательно указывать в качестве аргумента переменную типа object (таково свойство делегатов).

Кнопка ClearForm запрограммирована таким образом:

private void button2_Click(object sender, System.EventArgs e)

this.Refresh();

t.Dispose(); //удаление таймера

t=null;

xcoord=20;

Во-первых, она очищает экран, а во-вторых, производит уничтожение таймера: t. Dispose () и его деинициализацию: t=nuii.

Суммируя все сказанное, получаем следующую итоговую программу (листинг 4.16).

Листинг 4.16. Приложение типа "бегущая строка"

using System; using System.Drawing;

using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading;

namespace Timerapp {

/// <summary>

/// Summary description for Forml.

/// </summary>

public class Forml : System.Windows.Forms.Form {

public string str;

public int xcoord;

public int ycoord;

private System.Threading.Timer t;

private System.Windows.Forms.Button buttonl;

private System.Windows.Forms.Button button2;

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.Container components = null; public Forml()

{

//

// Required for Windows Form Designer support //

InitializeComponent(); str="Hello"; xcoord=20; ycoord=100;

//

// TODO: Add any constructor code after InitializeComponent // call //

/// <summary>

/// Clean up any resources being used.

/// </summary>

public void showstr(Object state)

{

Graphics g = this.CreateGraphics(); this.Refresh();

Font drawFont = new Font("Times New Roman", 16);

SolidBrush drawBrush = new SolidBrush(Color.Red); g.DrawString(str,drawFont,drawBrush,xcoord, ycoord); xcoord+=5;

}

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose ();

}

}

base.Dispose( disposing );

}

#region Windows Form Designer generated code /// <summary>

/// Required method for Designer support – do not modify /// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.buttonl = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout();

//

// buttonl

this.buttonl.Location = new System.Drawing.Point(16, 232); this.buttonl.Name = "buttonl";

this.buttonl.Size = new System.Drawing.Size(72, 32); this.buttonl.TabIndex = 0; this.buttonl.Text = "StartTimer";

this.buttonl.Click += new

System.EventHandler(this.buttonl_Click);

//

// button2 //

this.button2.Location = new System.Drawing.Point(120, 232); this.button2.Name = "button2";

this.button2.Size = new System.Drawing.Size(88, 32);

this.button2.TabIndex = 1;

this.button2.Text = "ClearForm";

this.button2.Click += new System.EventHandler(this.button2_Click);

//

// Forml //

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.ClientSize = new System.Drawing.Size(292, 273);

this.Controls.Add(this.button2);

this.Controls.Add(this.buttonl);

this.Name = "Forml";

this.Text = "Forml";

this.ResumeLayout(false) ;

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread] static void Main()

{

Application.Run(new Forml());

}

private void buttonl_Click(object sender, System.EventArgs e)

{

System.Threading.TimerCallback tc=new System.Threading.TimerCallback(showstr); t= new System.Threading.Timer(tc,null,100,350);

}

private void button2_Click(object sender, System.EventArgs e)

{

this.Refresh(); t.Dispose(); t=null;

xcoord=20; // Вьшод строки стартует с этой координаты

}

}

}

Задание

Построить:

□               две бегущие строки;

□               бегущую картинку;

□               анимированную картинку.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100