Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методпособие ДРП - версия 7

.pdf
Скачиваний:
7
Добавлен:
02.06.2015
Размер:
2.33 Mб
Скачать

Рисунок 2.16 – Форма с изображенным домиком

13.Увеличить масштаб рисунка в полтора раза

gr.ScaleTransform(1.5F, 1.5F);

14.Запустить проект на выполнение (рис. 2.17)

Рисунок 2.17 – Форма после изменения масштаба

Полностью программный код примера представлен в листинге 2.1.

Листинг 2.1 – Программный код пример

public partial class Form1 : Form { public Form1() {

InitializeComponent();

}

private void Form1_Paint(object sender, PaintEventArgs e) { Graphics gr = this.CreateGraphics();

gr.Clear(Color.White);

Pen gray = new Pen(Color.Gray);

Pen black = new Pen(Color.Black, 3F);

//Перенос начала координат gr.TranslateTransform(30, this.Height - 80);

//Масштабирование

gr.ScaleTransform(1.5F, 1.5F); // Координатная ось OX

gr.DrawLine(gray, new Point(0, 0), new Point(this.Width, 0)); for (int i = 0; i < this.Width; i+= 40)

gr.DrawString(i.ToString(), new Font("Arial", 10F), Brushes.Gray, new PointF(i,

5F));

// Координатная ось OY

gr.DrawLine(gray, new Point(0, 0), new Point(0, -this.Height)); // Стена

Point pointLeftTop = new Point(0, -80);

gr.DrawRectangle(black, new Rectangle(pointLeftTop, new Size(100, 80))); // Крыша

Point[] trianglePoints = {

pointLeftTop,

new Point(50, -120),

new Point(100, -80)

}; gr.DrawPolygon(black, trianglePoints); // Окна

Size window = new Size(30, 30);

gr.DrawRectangle(black, new Rectangle(new Point(10, -60), window)); gr.DrawRectangle(black, new Rectangle(new Point(60, -60), window));

}

}

8 Пример анимированной надписи

На рисунке 2.18 представлена форма в процессе проектирования, на рисунке 2.19

– форма в процессе выполнения.

Рисунок 2.18 - Форма в процессе проектирования

Рисунок 2.19 - Форма в процессе выполнения

В листинге 2.2 представлены программные коды файла Form1.cs.

Листинг 2.2 - Программные коды файла Form1.cs

public partial class Form1 : Form

{

public Form1()

{

 

InitializeComponent();

 

}

 

 

Graphics graphText;

 

 

static bool x = false;

 

 

void doAnimate()

{

 

String str = "Рисунок";

graphText = pctText.CreateGraphics(); graphText.Clear(this.BackColor);

if (x) { graphText.DrawString(str,

new Font("Arial", 30.0f, FontStyle.Bold),

new SolidBrush(btnForeColor.ForeColor), new PointF()); x = false;

}

else x = true;

}

private void timer_Tick(object sender, EventArgs e) { doAnimate();}

private void btnForeColor_Click(object sender, EventArgs e)

{

colorDialog.Color = btnForeColor.ForeColor;

 

if (colorDialog.ShowDialog() == DialogResult.OK)

{

btnForeColor.ForeColor = colorDialog.Color;

 

doAnimate();

 

}

 

}

private void btnRun_Click(object sender, EventArgs e) { timer.Start(); } private void btnStop_Click(object sender, EventArgs e) { timer.Stop(); }

}

Лабораторная работа №3. Анимация

Цель работы: создать приложение с графическим интерфейсом для реализации анимации по примеру.

План работы: студент должен изучить материал текущей лабораторной работы и продемонстрировать свои навыки преподавателю. В результате чего студент получает оценку за выполненное приложение по примеру и за изученный материал.

Задание: создать приложение по примеру.

Теоретический материал работы

1 Добавление новой формык проекту

Для того, чтобы добавить новую форму к проекту необходимо:

1.в меню выбрать «Проект», затем «Добавить форму Windows»

2.в поле «Имя:» ввести имя формы (рисунок 3.1)

Рисунок 3.1 – Добавление новой формы в проект

2 Создание анимации

Анимация представляет собой смену изображений окна через определенный промежуток времени. Каждый кадр представляет собой набор графических объектов в определенном состоянии и положении. Через некоторое время состояние и/или положение объекта должно измениться и новый кадр должен быть нарисован заново. Таким образом, при формировании анимации требуется:

Создать переменные класса, которые будут хранить состояние объектов на кадре;

В зависимости от значений этих переменных рисовать кадр в функции-обработчике события Paint формы;

Создать таймер, который будет генерировать событие Tick через определенный интервал времени (интервал смены кадров);

В обработчике события Tick таймера предусмотреть изменение переменных, описывающих состояние объектов кадра, и вызвать перерисовку формы, чтобы отобразить новый кадр.

3 Пример работы

На рисунках 3.1 – 3.6 представлены формы приложения во время выполнения.

Рисунок 3.1 – Главная форма приложения

Рисунок 3.2 – Форма «Движение прямоугольника»

Рисунок 3.3 – Форма «Рисование графика функции синуса»

Рисунок 3.4 – Форма «Затухающий процесс»

Рисунок 3.5 – Форма «Падение мяча»

 

 

 

Рисунок 3.6 – Форма «Парад планет»

 

В таблицах 3.1 – 3.6 определены свойства объектов форм.

 

Таблица 3.1 – Таблица свойств объектов главной формы

 

 

 

 

 

 

 

 

Контейнер

Элемент

Name

Text

Другие свойства

События

 

 

Form

Form1

Анимация

 

 

 

 

 

btnRectange

Движение

 

btnRectange_Click()

Form1

Button

btnSin

Рисование графика

 

btnSin_Click()

 

 

 

btnFading

Затухающий процесс

 

btnFading_Click()

 

 

 

btnBall

Падение мяча

 

btnBall_Click()

 

 

 

btnPlanel

Парад планет

 

btnPlanel_Click()

Таблица 3.2 – Таблица свойств объектов формы «Движение прямоугольника»

 

 

 

 

 

 

 

Контейне

 

Элемент

Name

Text

Другие свойства

События

р

 

 

 

 

 

 

 

 

Form

FormRectange

Движение

 

FormRectange_Paint()

 

 

 

 

прямоугольника

 

 

FormRecta

 

Button

btnStart

Запустить снова

 

btnStart_Click

nge

 

Timer

timer

 

Enabled = True

timer_Tick()

Таблица 3.3 – Таблица свойств объектов формы «Рисование графика функции

синуса»

 

 

 

 

Контейне

 

Элемент

Name

Text

Другие свойства

События

р

 

 

 

 

 

 

 

 

Form

FormSin

Рисование графика

 

FormSin_Shown ()

 

 

 

 

функции синуса

 

 

FormSin

 

Button

btnStart

Запустить снова

 

btnStart_Click

 

Timer

timer

 

 

timer_Tick()

 

 

 

 

Таблица 3.4 – Таблица свойств объектов формы «Затухающий процесс»

Контейне

Элемент

Name

Text

Другие свойства

События

р

 

 

 

 

 

 

Form

FormFading

Затухающий процесс

BackColor = Black

FormFading_Paint ()

FormFadin

Button

btnStart

Запустить снова

 

btnStart_Click

g

Timer

timer

 

Enabled = True

timer_Tick()

Таблица 3.5 – Таблица свойств объектов формы «Падение мяча»

Контейне

Элемент

Name

Text

Другие свойства

События

р

 

 

 

 

 

 

Form

FormBall

Падение мяча

 

FormBall_Paint ()

 

 

 

 

 

FormBall_Shown()

FormBall

Button

btnStart

Запустить снова

 

btnStart_Click

Timer

timer

 

Enabled = True

timer_Tick()

 

 

Таблица 3.6 – Таблица свойств объектов формы «Парад планет»

Контейне

Элемент

Name

Text

Другие свойства

События

р

 

 

 

 

 

 

Form

FormPlanet

Парад планет

 

FormPlanet_Paint()

FormPlanet

Button

btnStart

Запустить снова

 

btnStart_Click

Timer

timer

 

Enabled = True

timer_Tick()

В листингах 3.1 – 3.6 представлены программные коды приложения.

Листинг 3.1 - Программные коды файла Form1.cs

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void btnRectange_Click(object sender, EventArgs e)

{

new FormRectange().ShowDialog();

}

private void btnSin_Click(object sender, EventArgs e)

{

new FormSin().ShowDialog();

}

private void btnFading_Click(object sender, EventArgs e)

{

new FormFading().ShowDialog();

}

private void btnBall_Click(object sender, EventArgs e)

{

new FormBall().ShowDialog();

}

private void btnPlanel_Click(object sender, EventArgs e)

{

new FormPlanet().ShowDialog();

}

}

Листинг 3.2 - Программные коды файла FormRectange.cs

public partial class FormRectange : Form

{

public FormRectange()

{

InitializeComponent();

// начальные значения координат прямоугольника x = 0; y = 0;

}

// переменные для хранения координат прямоугольника int x, y;

private void FormRectange_Paint(object sender, PaintEventArgs e)

{

e.Graphics.FillRectangle(Brushes.MediumTurquoise, x, y, 50, 50);

}

private void timer_Tick(object sender, EventArgs e)

{

//запоминаем текущие координаты прямоугольника int prev_x = x, prev_y = y;

//изменение координаты x, если прямоугольник остается в клиентской части окна if (x + 50 < ClientSize.Width)

x+= 5;

//изменение координаты y, если прямоугольник остается в клиентской части окна if (y + 50 < ClientSize.Height)

y+= 5;

//если координаты прямоугольника не изменились, он достиг правого нижнего угла окна,

//поэтому можно остановить таймер

if (x == prev_x && y == prev_y) timer.Stop(); // остановка таймер

// вызов перерисовки окна

Refresh();

}

private void btnStart_Click(object sender, EventArgs e)

{

// начальные значения координат прямоугольника x = 0; y = 0;

timer.Start();

}

}

Листинг 3.3 - Программные коды файла FormSin.cs

public partial class FormSin : Form

{

public FormSin()

{

InitializeComponent(); x = 0; y = 0;

}

float x, y, prev_x, prev_y; Graphics graph;

Pen penLine = new Pen(Color.GreenYellow);

private float calc(float k)

{

return (float)((30) * Math.Sin(0.2*k));

}

private void doDrawSin()

{

graph = this.CreateGraphics(); graph.TranslateTransform(0, this.Height / 2);

graph.FillEllipse(Brushes.Black, prev_x-2, prev_y, 6, 6); for (float t = prev_x-2; t <= x; t += 0.1f)

{

graph.DrawLine(penLine, t, calc(t), t + 0.1f, calc(t + 0.1f));

}

graph.FillEllipse(Brushes.Red, x-2, y, 6, 6);

}

private void timer_Tick(object sender, EventArgs e)

{

doDrawSin();

prev_x = x; prev_y = y;

if (x + 10 < ClientSize.Width) x += 5;

y = calc(x);

if (x == prev_x) btnStart_Click(sender, e);

}

private void btnStart_Click(object sender, EventArgs e)

{

x = 0; y = 0;

graph = this.CreateGraphics(); graph.Clear(Color.Black); timer.Start();

}

private void FormSin_Shown(object sender, EventArgs e)

{

btnStart_Click(sender, e);

}

}

Листинг 3.4 - Программные коды файла FormFading.cs

public partial class FormFading : Form

{

public FormFading()

{

InitializeComponent();

x = 0; y = 0; counter = 0;

}

float x, y, counter;

Pen pen = new Pen(Color.Yellow);

private float calc(float k, float r)

{

return (float)((40 - r) * Math.Cos(0.3*k));

}

private void FormBall_Paint(object sender, PaintEventArgs e)

{

e.Graphics.TranslateTransform(0, this.Height / 2); e.Graphics.FillEllipse(Brushes.Red, x, y, 5, 5);

float less = 0f;

for (float t = 0; t < x; t += 1)

{

less+=(float)1/5;