Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
74
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

9. Модификация приложения Windows Forms: вкладка «Дождик»

Последняя вкладка будет вызывать дождь. Внутри вкладки. Опять же, как и в случае с часами и огнём, не будем использовать сторонних ресурсов. Разве что можно добавить звуки дождя.

Для этого нам понадобиться новая вкладка со свойствами:

TabPage:

Text:

Дождик

Cursor:

PanSouth

Один новый таймер со свойствами:

TabPage:

(Name):

timer2

Interval:

60

Один PictureBox, растянутый на всю новую вкладку со свойствами:

PictureBox:

(Name):

pictureBox1

Anchor:

Top, Bottom, Left, Right

Код для события Selected элемента TabControl:

if (e.TabPage.Name == tabPage6.Name) timer2.Enabled = true;

else timer2.Enabled = false;

После закрывающей скобки предыдущего события в файле LWP19Main.cs добавим:

// Начало: вкладка "Дождик"

private static Image _raindropImage;

private readonly List<Raindrop> _raindrops;

// Конец: вкладка "Дождик"

#region Класс Raindrop

private class Raindrop

{

private static readonly Random random = new Random(DateTime.Now.Millisecond);

// Удаление от экрана

private float _depth;

// Положение

private PointF _location;

// Прямоугольник для отрисовки

private Rectangle _rectangleToDraw;

// Скорость

private PointF _speed;

public Raindrop(Rectangle rectangleToDraw)

{

_rectangleToDraw = rectangleToDraw;

SetRandomLoc();

}

public void UpdatePosition()

{

// Вертикальная скрость

_location.Y += _speed.Y;

// Горизонтальная скорость

_location.X += _speed.X;

if (_location.Y > _rectangleToDraw.Height)

SetRandomLoc();

}

private void SetRandomLoc()

{

// Максимально удаление

const int MAX_DEPTH = 10;

_depth = random.Next(MAX_DEPTH) + 1;

const int MIN_SPEED = 100;

const int SPEED_DISPERSION = 20;

_speed.X = 5;

// Чем дальше капля от экрана, тем она медленнее падает

_speed.Y = (MIN_SPEED + random.Next(SPEED_DISPERSION)) / _depth;

// Необходимо расширить область, в которой появляются капли

const int DY = 200;

int locX = random.Next(_rectangleToDraw.Width + DY) - DY;

int locY = -random.Next(_rectangleToDraw.Height) - _raindropImage.Height;

// Точка возникновения капли

_location = new PointF(locX, locY);

}

public void Draw(Graphics g)

{

// Масштаб текстуры

float scale = 2 / _depth;

g.DrawImage(_raindropImage, _location.X, _location.Y, _raindropImage.Width * scale,

_raindropImage.Height * scale);

}

}

#endregion

Инициализируем событие второго таймера Tick:

private void timer2_Tick(object sender, EventArgs e)

{

// Обновляем положение капель

foreach (Raindrop raindrop in _raindrops)

raindrop.UpdatePosition();

// Перерисовываем картинку

pictureBox1.Refresh();

}

И событие Paint для PictureBox:

private void pictureBox1_Paint(object sender, PaintEventArgs e)

{

// Отрисовываем капли

foreach (Raindrop raindrop in _raindrops)

raindrop.Draw(e.Graphics);

}

Готово. Можно компилировать и проверять работоспособность.