Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компьютерная графика, мультимедиа и игры на Vis...doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
1.92 Mб
Скачать

Глава 61. Вращающееся градиентное заполнение фигур цветом

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

//Объявляем и обнуляем глобальную переменную angle:

int angle = 0;

private void timer1_Tick(object sender, EventArgs e)

{

//Экземпляр структуры ntPtr:

IntPtr myIntPtr = new IntPtr();

//Свойство Handle:

myIntPtr = this.Handle;

//Создаем объект myGraphics класса Graphics

//и применяем функцию FromHwnd:

Graphics myGraphics = Graphics.FromHwnd(myIntPtr);

//Задаем параметры прямоугольника:

Rectangle myRectangle = new Rectangle(5, 5, 700, 400);

//Задаем два граничных цвета Red и White

//градиентной заливки:

LinearGradientBrush myLinearGradientBrush =

new LinearGradientBrush(myRectangle,

Color.Red, Color.White, angle);

//Заполняем прямоугольник цветом:

myGraphics.FillRectangle(myLinearGradientBrush,

myRectangle);

//Организовываем циклический процесс вращения:

angle = angle + 10;

if (angle >= 360) angle = 0;

//Высвобождаем ресурсы, выделенные объекту

//myGraphics:

myGraphics.Dispose();

}

Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form1.cs с шаблоном, в который записываем код, приведенный в предыдущей главе.

Согласно разработанной выше методике, чтобы иметь возможность приостановить (и запустить вновь) процесс анимации при помощи кнопки Stop Animation, дважды щелкаем эту кнопку в режиме проектирования. Появляется файл Form1.cs с шаблоном, в который записываем код, приведенный в предыдущей главе.

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

Листинг 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;

}

}