Методпособие ДРП - версия 6
.pdfРисунок 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;