Изображение кругов на воде с использованием двойной буферизации

 

Листинг 62.1. Шаблон метода Form1_Load с кодом.

//Массив окружностей:

myClass[] Circles = new myClass[100];

//В структуре Point объявляем объект myPoint:

Point myPoint;

//Генератор случайных чисел:

Random myRandow;

int c, j;

private void myMethod()

{

Circles[c] = new myClass(myPoint);

c = c + 1;

if (c >= Circles.Length) c = 0;

}

private void Form1_Load(object sender, EventArgs e)

{

//Используем двойную буферизацию:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer |

ControlStyles.AllPaintingInWmPaint, true);

myRandow = new Random();

myMethod();

}

В панели Properties для элемента управления PictureBox на вкладке Events дважды щелкаем по имени события Paint и в шаблон записываем следующий код.

Листинг 62.2. Шаблон метода pictureBox1_Paint с кодом.

private void pictureBox1_Paint(object sender,

PaintEventArgs e)

{

Color myColor = Color.Black;

float f;

e.Graphics.SmoothingMode =

System.Drawing.Drawing2D.SmoothingMode.HighQuality;

int k;

for (k = 0; k <= c - 1; k++)

{

f = 0.05f * Circles[k].value;

e.Graphics.DrawEllipse(new Pen(myColor, f),

Circles[k].pos.X - Circles[k].value,

Convert.ToInt32(Circles[k].pos.Y - Circles[k].value / 4),

Circles[k].value * 2,

Convert.ToInt32(Circles[k].value / 2));

Circles[k].value = Circles[k].value + 10;

if (Circles[k].value > 100) Circles[k].Reset();

}

}

Чтобы подключить к работе таймер, дважды щелкаем значок timer1 (ниже формы в режиме проектирования). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает такой вид.

Листинг 62.3. Метод для компонента Timer1.

private void timer1_Tick(object sender, EventArgs e)

{

myMethod();

Refresh();

j = j + 1;

if (j > myRandow.Next(30))

{

j = 0;

myPoint.X = myRandow.Next(pictureBox1.Width);

myPoint.Y = myRandow.Next(pictureBox1.Height);

c = 0;

}

}

Листинг 62.4. Дополнительный класс.

class myClass

{

public Point pos = Point.Empty;

public int value = 0;

public myClass(Point pos)

{

Reset();

this.pos = pos;

}

public void Reset()

{

pos = Point.Empty;

value = 0;

}

}

Предлагаю ознакомиться с аналогичными статьями: