Изображение кругов на воде с использованием двойной буферизации
Листинг 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;
}
}