Графические возможности интегрированной среды « Visual Studio и основные приёмы разработки программ под Windows»




Отчет

по дисциплине «ТП»

Лабораторная работа №3

Программирование на языке C# в среде Microsoft Visual Studio.

Графические возможности интегрированной среды «Visual Studio и основные приёмы разработки программ под Windows»

 

 

Выполнил: студент 1104 группы ИВТ

Скорик Павел Александрович

 

Проверил: ассистент кафедры ЭВМ

Удалов Алексей Владимирович

 

 

 

 

Задание на лабораторную работу.

 

Разрабатываемое приложение должно обеспечивать формирование группы многоугольников на его рабочей поверхности, размеры которой превышают размеры клиентной области окна приложения.

Для этого необходимо выполнить следующее:

а) Разработать абстрактное представление такой разновидности геометрических объектов, которые известны нам как многоугольники, в виде класса, позволяющего имитировать характеристики и поведение данного понятия (см. содержимое разделов 1,2 и 4.1).

б) На основе разработанного класса многоугольника построить интерфейс приложения, предназначенного для создания и редактирования многоугольных фигур и обеспечивающего следующие возможности:

- создавать новые фигуры в виде многоугольников с произвольным количеством вершин;

- перемещать фигуры в переделах клиентной части окна приложения тремя способами, описанными в разделе 4.2.

- изменять форму выбранного многоугольника путем изменения положения любой из его вершин (раздел 4.3);

- добавлять и удалять вершины у выбранного многоугольника;

- раскрашивать фигуры и их контуры в произвольные цвета и с использованием различных стилей.

в) Поскольку основная работа приложения происходит в результате его ответной реакции на события нажатия на клавишу "мыши" и перемещение "мыши", то необходимо разработать алгоритмы функционирования приложения реагирующего на эти два события.

г) На основе созданных алгоритмов и класса многоугольника разработать программное приложение для редактирования фигур.

д) Сравнить между собой эффективность различных способов перемещения многоугольников и изменения их формы.

е) В соответствии с разделом 7 составить пояснительную записку в форме отчета по лабораторной работе

 

Описание приложения

 

Разработанное приложение представлено двумя формами: главная форма, на которой производится редактирование фигур и модальная форма, вызываемая в режиме Стиль при нажатии на некоторую фигуру.

Класс главной формы содержит список экземпляров класса Figure, который является представлением многоугольника. Главная форма выполняет все необходимые манипуляции с объектами класса Figure c помощью соответствующего интерфейса, который включает следующие методы для:

 

· перемещения фигуры

· перемещения точки

· удаления точки

· добавления точки

· определения принадлежности точки фигуре

 

Побочная модальная форма позволяет пользователю выбирать цвета границы фигуры и ее заливки, а также ширину пера границы фигуры.

 

 

 

 

 

Файл Figure.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Windows.Forms;

 

 

namespace lab3

 

class Figure

{

List<Point> points;

// перо для рисования границ фигуры

Pen BorderPen;

// кисть для закрашивания области фигуры

SolidBrush figureBrush;

 

// размеры области фигуры

Size size;

Point minP, maxP;

 

public Figure(List<Point> points)

{

this.points = points;

BorderPen = new Pen(Color.Black, 3);

figureBrush = new SolidBrush(Color.Gray);

FindFiguresBounds();

}

 

// выполняет перемещение всех точек массива на величину d_p

public void MoveFigure(Point d_p)

{

for (int i = 0; i < points.Count; i++)

{

points[i] = new Point(points[i].X + d_p.X, points[i].Y + d_p.Y);

}

minP.X += d_p.X;

minP.Y += d_p.Y;

maxP.X += d_p.X;

maxP.Y += d_p.Y;

}

 

// перемещает указанную точку на величину d_p

public void MovePoint(int index, Point d_p)

{

points[index] = new Point(points[index].X + d_p.X,

points[index].Y + d_p.Y);

RefreshBounds(d_p, index);

}

public void AddPoint(Point p)

{

points.Add(p);

}

// метод определения расстояния между двумя точками

 

 

public Point GetPoint(int i)

{

return points[i];

}

// возвращает количество точек

public int Count()

{

return points.Count;

}

 

public void Draw(Graphics g)

{

GraphicsPath path = new GraphicsPath();

for (int i = 0; i < points.Count - 1; i++)

path.AddLine(points[i], points[i + 1]);

path.AddLine(points[0], points[points.Count - 1]);

 

g.FillPath(figureBrush, path);

g.DrawPath(BorderPen, path);

g.Dispose();

}

 

public void Draw(Graphics g, Bitmap buffer)

{

DrawToBuffer(buffer, BorderPen, figureBrush);

g.DrawImage(buffer, minP);

buffer.Dispose();

g.Dispose();

}

 

private void DrawToBuffer(Bitmap buffer, Pen pen, Brush brush)

{

Graphics gr = Graphics.FromImage(buffer);

GraphicsPath path = new GraphicsPath();

for (int i = 0; i < points.Count - 1; i++)

{

Point A = new Point(points[i].X - minP.X, points[i].Y - minP.Y);

Point B = new Point(points[i + 1].X - minP.X, points[i + 1].Y - minP.Y);

path.AddLine(A, B);

}

path.AddLine(new Point(points[0].X - minP.X, points[0].Y - minP.Y),

new Point(points[points.Count - 1].X - minP.X, points[points.Count - 1].Y - minP.Y));

 

gr.FillPath(brush, path);

gr.DrawPath(pen, path);

gr.Dispose();

}

 

public void DeletePoint(int index)

{

if (points.Count > 3)

points.RemoveAt(index);

}

// проверяет попадает ли точка в область фигуры

public bool Contains(Point p)

{

GraphicsPath gp = new GraphicsPath();

gp.AddPolygon(points.ToArray());

return gp.IsVisible(p);

}

 

public Point GetLocation()

{

return minP;

}

 

public Size GetSize()

{

return size;

}

 

 

/*

* группа методов для изменения

* цвета границ и заливки фигуры

* */

 

public void SetBorderPen(Pen newBorderPen)

{

BorderPen = newBorderPen;

}

 

public void SetFigureBrush(SolidBrush newFigureBrush)

{

figureBrush = newFigureBrush;

}

 

public Pen GetBorderPen()

{

return BorderPen;

}

 

public SolidBrush GetFigureBrush()

{

return figureBrush;

}

 

 

// находит верхний левый и нижний правый углы

// области, заключающей фигуру

private void FindFiguresBounds()

{

minP = points[0];

maxP = points[0];

for (int i = 1; i < points.Count; i++)

{

Point p = points[i];

if (p.X < minP.X)

minP.X = p.X;

else if (p.X > maxP.X)

maxP.X = p.X;

 

if (p.Y < minP.Y)

minP.Y = p.Y;

else if (p.Y > maxP.Y)

maxP.Y = p.Y;

}

CorrectBounds();

size = new Size(maxP.X - minP.X, maxP.Y - minP.Y);

 

}

// расширяет границы фигуры учитывая

// ширину ее пера

private void CorrectBounds()

{

int w = (int)BorderPen.Width;

minP.X -= w;

minP.Y -= w;

maxP.X += w;

maxP.Y += w;

}

// обновляет границы фигуры при добавлении

// или перемещении точки

private void RefreshBounds(Point d_p, int index)

{

if (points[index].X > maxP.X)

maxP.X = points[index].X;

else if (points[index].X < minP.X)

minP.X = points[index].X;

if (points[index].Y > maxP.Y)

maxP.Y = points[index].Y;

else if (points[index].Y < minP.Y)

minP.Y = points[index].Y;

 

size.Width = maxP.X - minP.X;

size.Height = maxP.Y - minP.Y;

 

CorrectBounds();

}

}

}

 

 

Файл Form1.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace laba3

{

public partial class Form1: Form

{

enum Mode

{

Default, Create, Move, Delete, Add, Style,

MoveFigure, MovePoint, DeleteFigure, DeletePoint

};

 

List<Figure> Figures;

// ссылка на перемещаемую фигуру

Figure MovedFigure;

// точка предыдущего положения курсора для расчета

// перемещения фигуры, или точки

Point lastMousePos;

// индекс выбранной точки некоторой фигуры

int MovedPointIndex = -1;

Mode mode;

List<Point> newFiguresPoints;

// буффер для хранения пространства под перемещаемой фигурой

Bitmap buffer;

 

public Form1()

{

InitializeComponent();

 

pictureBox1.MouseMove += new MouseEventHandler(Form1_MouseMove);

pictureBox1.MouseDown += new MouseEventHandler(Form1_MouseDown);

pictureBox1.MouseUp += new MouseEventHandler(Form1_MouseUp);

pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);

this.SizeChanged += new EventHandler(Form1_SizeChanged);

Figures = new List<Figure>();

mode = Mode.Create;

newFiguresPoints = new List<Point>();

SetPictureBoxSize();

}

private void button1_Click(object sender, EventArgs e)

{

mode = Mode.Create;

}

 

private void button2_Click(object sender, EventArgs e)

{

mode = Mode.MoveFigure;

}

 

private void button3_Click(object sender, EventArgs e)

{

mode = Mode.DeleteFigure;

}

 

private void button4_Click(object sender, EventArgs e)

{

mode = Mode.Add;

}

 

private void button5_Click(object sender, EventArgs e)

{

mode = Mode.Style;

}

 

private void button6_Click(object sender, EventArgs e)

{

mode = Mode.MovePoint;

}

 

private void button7_Click(object sender, EventArgs e)

{

mode = Mode.DeletePoint;

}

 

void Form1_MouseDown(object sender, MouseEventArgs e)

{

switch (mode)

{

case Mode.Create:

CreateLogic(e);

break;

 

case Mode.MoveFigure:

CheckFigures(e);

if (MovedFigure!= null)

{

DrawFigures(MovedFigure);

buffer = GetSpaceUnderFigure(MovedFigure);

MovedFigure.Draw(pictureBox1.CreateGraphics());

}

break;

 

case Mode.MovePoint:

CheckPoints(e);

if (MovedPointIndex!= -1)

{

DrawFigures(MovedFigure);

buffer = GetSpaceUnderFigure(MovedFigure);

MovedFigure.Draw(pictureBox1.CreateGraphics());

}

break;

 

case Mode.DeleteFigure:

CheckFigures(e);

if (MovedFigure!= null)

{

DrawFigures(MovedFigure);

Figures.Remove(MovedFigure);

}

break;

 

case Mode.DeletePoint:

CheckPoints(e);

if (MovedPointIndex!= -1)

{

DrawFigures(MovedFigure);

MovedFigure.DeletePoint(MovedPointIndex);

MovedFigure.Draw(pictureBox1.CreateGraphics());

}

break;

 

case Mode.Add:

CheckFigures(e);

if (MovedFigure!= null)

{

DrawFigures(MovedFigure);

MovedFigure.AddPoint(e.Location);

MovedFigure.Draw(pictureBox1.CreateGraphics());

}

break;

 

case Mode.Style:

CheckFigures(e);

if (MovedFigure!= null)

{

StyleForm sform = new StyleForm(MovedFigure);

if (sform.ShowDialog() == System.Windows.Forms.DialogResult.OK)

MovedFigure.Draw(pictureBox1.CreateGraphics());

}

break;

}

}

 

private void CreateLogic(MouseEventArgs e)

{

Point currentPoint = e.Location;

if (e.Button == MouseButtons.Left)

{

if (newFiguresPoints.Count() > 0)

{

Graphics g = pictureBox1.CreateGraphics();

Pen stdPen = new Pen(Color.Black, 3);

g.DrawLine(stdPen, newFiguresPoints[newFiguresPoints.Count() - 1],

currentPoint);

stdPen.Dispose();

g.Dispose();

}

newFiguresPoints.Add(currentPoint);

}

else if (e.Button == MouseButtons.Right)

{

if (newFiguresPoints.Count > 2)

{

Figure newFigure = new Figure(newFiguresPoints);

Figures.Add(newFigure);

newFigure.Draw(pictureBox1.CreateGraphics());

newFiguresPoints = new List<Point>();

}

}

}

 

private void CheckFigures(MouseEventArgs e)

{

for (int i = 0; i < Figures.Count; i++)

{

Figure figure = Figures[i];

// проверяет, попала ли точка в область i фигуры

if (figure.Contains(e.Location))

{

MovedFigure = figure;

lastMousePos = e.Location;

break;

}

}

}

 

private void CheckPoints(MouseEventArgs e)

{

int a = 10;

// область рядом с курсором, в которой проверяются на принадлежность точки фигур

Rectangle rec = new Rectangle(e.Location.X - a, e.Location.Y - a, 2 * a, 2 * a);

for (int i = 0; i < Figures.Count; i++)

{

Figure figure = Figures[i];

for (int j = 0; j < figure.Count(); j++)

{

if (rec.Contains(figure.GetPoint(j)))

{

MovedPointIndex = j;

MovedFigure = figure;

lastMousePos = e.Location;

break;

}

}

}

}

 

 

void Form1_MouseMove(object sender, MouseEventArgs e)

{

if (mode == Mode.MoveFigure && MovedFigure!= null)

{

Point d_p = new Point(e.Location.X - lastMousePos.X,

e.Location.Y - lastMousePos.Y);

DrawSpaceUnderFigure(buffer, MovedFigure);

MovedFigure.MoveFigure(d_p);

buffer = GetSpaceUnderFigure(MovedFigure);

MovedFigure.Draw(pictureBox1.CreateGraphics(), (Bitmap)(buffer.Clone()));

lastMousePos = e.Location;

}

else if (mode == Mode.MovePoint && MovedPointIndex!= -1)

{

Point d_p = new Point(e.Location.X - lastMousePos.X,

e.Location.Y - lastMousePos.Y);

DrawSpaceUnderFigure(buffer, MovedFigure);

MovedFigure.MovePoint(MovedPointIndex, d_p);

buffer = GetSpaceUnderFigure(MovedFigure);

MovedFigure.Draw(pictureBox1.CreateGraphics(), (Bitmap)(buffer.Clone()));

lastMousePos = e.Location;

}

}

// рисует все фигуры кроме той, которая подана

// качестве аргумента

private void DrawFigures(Figure notToDraw)

{

Graphics g = pictureBox1.CreateGraphics();

g.Clear(pictureBox1.BackColor);

 

for (int i = 0; i < Figures.Count; i++)

{

if (Figures[i]!= notToDraw)

{

Figures[i].Draw(pictureBox1.CreateGraphics());

}

}

}

 

// рисует пространство под перемещаемой фигурой

private void DrawSpaceUnderFigure(Bitmap buffer, Figure figure)

{

Graphics g = pictureBox1.CreateGraphics();

g.DrawImage(buffer, figure.GetLocation());

buffer.Dispose();

g.Dispose();

}

// запоминает пространство под перемещаемой фигурой

private Bitmap GetSpaceUnderFigure(Figure figure)

{

Bitmap buffer = new Bitmap(figure.GetSize().Width, figure.GetSize().Height);

Graphics gr = Graphics.FromImage(buffer);

gr.CopyFromScreen(pictureBox1.PointToScreen(figure.GetLocation()),

new Point(0, 0), figure.GetSize());

gr.Dispose();

return buffer;

}

 

 

void Form1_MouseUp(object sender, MouseEventArgs e)

{

// в режиме добавления необходимо запоминать

// фигуру, к которой добавляются точки

if (mode!= Mode.Add)

MovedFigure = null;

MovedPointIndex = -1;

}

 

void pictureBox1_Paint(object sender, PaintEventArgs e)

{

DrawFigures(null);

if (newFiguresPoints!= null)

{

Graphics g = pictureBox1.CreateGraphics();

Pen pen = new Pen(Color.Black, 3);

for (int i = 0; i < newFiguresPoints.Count - 1; i++)

{

g.DrawLine(pen, newFiguresPoints[i], newFiguresPoints[i + 1]);

}

}

}

 

void Form1_SizeChanged(object sender, EventArgs e)

{

SetPictureBoxSize();

}

 

// изменяет размеры pictureBox1 при изменении размеров формы

private void SetPictureBoxSize()

{

pictureBox1.Location = new Point(groupBox1.Location.X,

groupBox1.Location.Y + groupBox1.Height + 10);

pictureBox1.Size = new System.Drawing.Size(this.Width - pictureBox1.Location.X - 28,

this.Height - pictureBox1.Location.Y - 50);

}

Файл StyleForm.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace laba3

{

public partial class StyleForm: Form

{

Color figureColor;

Pen borderPen;

Figure figure;

 

private void Form2_Load(object sender, EventArgs e)

{

 

}

public StyleForm(Figure figure)

{

InitializeComponent();

this.figure = figure;

borderPen = figure.GetBorderPen();

figureColor = figure.GetFigureBrush().Color;

}

private void button1_Click(object sender, EventArgs e)

{

ColorDialog cd = new ColorDialog();

if (cd.ShowDialog() == System.Windows.Forms.DialogResult.OK)

{

figureColor = cd.Color;

 

}

}

private void button2_Click(object sender, EventArgs e)

{

ColorDialog cd = new ColorDialog();

if (cd.ShowDialog() == System.Windows.Forms.DialogResult.OK)

{

borderPen.Color = cd.Color;

 

}

 

}

private void button3_Click(object sender, EventArgs e)

{

this.DialogResult = System.Windows.Forms.DialogResult.OK;

float a = Convert.ToSingle(textBox1.Text);

borderPen.Width = a;

figure.SetBorderPen(borderPen);

figure.SetFigureBrush(new SolidBrush(figureColor));

this.Close();

}

 

Внешний вид приложения:


Вывод.

 

В процессе выполнения данной лабораторной работы было разработано приложение, имеющее графический интерфейс пользователя операционной системы Windows, с использованием интегрированной среды разработки Microsoft Visual Studio. Данное приложение предоставляет пользователю функции для редактирования многоугольников: изменения размеров, формы, добавление и удаление вершин, изменения цвета.

В качестве мер для усовершенствования приложения можно предложить расширение его функционала путем добавления более продвинутых методов рисования фигур, улучшение алгоритмов рисования, более рациональное использование ресурсов и т.п.

Исходя из всего вышеперечисленного, можно заключить, что в ходе работы мной были:

· Изучены основные возможности технологии.NET и особенностей использования механизма инкапсуляции при разработке классов.

 

· Разработан собственный класс для описания характеристик и поведения объектов геометрических фигур многоугольников.

 

· Создано простейшее приложение для создания и редактирования графических объектов, представляющих собой раскрашенные геометрические фигуры.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: