Внешний вид главного окна созданного приложения.




Освоение приемов работы с окнами приложения и манипуляции ими.»

по дисциплине «Технология программирования»

 

 

Выполнил:

студент группы ИВТ 1104

Сябро Николай

Проверил:

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

 

Тверь, 2012

 

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

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

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

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

2. Разработать родительскую форму многодокументного редактора фигур обеспечивающего следующие возможности:

• Скрывать локальные меню дочерних окон и управлять процессом редактировании с помощью меню родительской формы;

• Скрывать локальные панели управления дочерних окон и управлять процессом редактировании с помощью панели управления, расположенной на родительской форме.

• Сохранять созданные в дочерних окнах множества фигур в файл с возможностью их воспроизведения;


Алгоритмы:

1) реакция на нажате кнопки мыши

Если режим рисования

Если нажата ЛКМ

Если нет активной фигуры

Создём новую фигуру и делаем её активной

Всё Если

Создаём точку из текущих координат мыши

Добавляем точки в фигуру

Иначе

Если число вершин больше 2

Стираем последнюю линию из последней вершины в текущую позицию мыши

Соединяем первую вершину с последней в списке

Для каждой фигуры из списка фигур

Если фигура не активна

Перерисовываем фигуру

Добавляем фигуру в FigList и делаем её неактивной

Всё Если

Если режим редактирования

Если нажата ПКМ

Для каждой фигуры в списке фигур

Если мышь попала в фигуру

Делаем фигуру активной

Показываем контекстное меню

Выходим из цикла

Всё Если

Всё Если

Если режим удаления вершины

Вызываем функцию поиска вершины, передавая ей текущие координаты мыши

Если вершина найдена

Стираем фигуру

Удалем точку из списка вершин

Для каждой фигуры из списка фигур

Если фигура не активна

Перерисовываем фигуру

Всё Для

Перерисовываем фигуру

Возвращаемся в режим редактирования

Всё если

Если режим добавления вершины

Создаём новую вершину в текущих координатах мыши

Добавляем вершину в конец списка вершин текущей фигуры

Перерисовываем фигуру

Возвращаемся в режим редактирования

Если режим перемещения вершины

Если вершина ещё не движется(нет индекса)

Вызываем функцию поиска вершины

Запоминаем её индекс

Стираем фигуру

Удалем точку из списка вершин

Перерисовываем фигуру

Всё если

Если режим перемещения фигуры

Если фигура ещё не движется

Для каждой фигуры в списке фигур

Если мышь попала в фигуру

Делаем фигуру активной

Запоминаем её границы в форме квадрата

Стираем фигуру

Создаём буффер с помощью запомненных границ фигуры

Копируем в него изображение под фигурой

Запоминаем что фигура находится в движении

Выходим из цикла

Всё Если

Всё Если

 

Функция поиска вершины(в классе фигуры)

Для каждой точки в списке точек

Если переданные координаты мыши совпадают с координатами точки +-5 пикселей

Возврат этой точки

Всё для

Возврат пустой точки

 

2) реакция на перемещение мыши

Если фигура существует

Если режим рисования

Закрашивем линию из последней вершины в старую позицию курсора

Рисуем линию из последней вершины в текущую позицию курсора

Иначе Если есть индекс удалённой вершины

Закрашивем линии из соседних вершин в старую позицию курсора

Рисуем линии из соседних вершин в текущую позицию курсора

Иначе Если фигура движется

Рисуем изображение из буфера в старую позицию фигуры

Сохраняем в буфер изображение в новой позиции фигуры

Вызываем функцию смещения точек

Перерисовываем фигуру в новой позиции

Всё если

Сохраняем текущую позицию курсора как старую

Всё если

 

Функция смещения вершин(в классе фигуры)

Создаём массив вершин перемещаемой фигуры

Для каждого элемента массива

Смещаем элемент на полученную величину

Заменяем вершину в списке вершин на текущий элемент

Всё Для

 

2) реакция на отпускание мыши

Если есть индекс удалённой вершины и режим движения вершины

Добавляем новую вершину в список по индексу удалённой

Перерисовываем фигуру

Сбрасываем индекс удалённой фигуры

Возвращаемся в режим редактирования

Иначе Если режим движения фигуры и фигура движется

Выход из режима движения

Удаление буфера

 

 


 

Внешний вид главного окна созданного приложения.

Содержание файла:

 


Код приложения.

Главная форма

enum DrawMode { MoveFig, Draw, Redact, Delete, Add, MoveVersh };

 

public partial class ChildForm: Form

{

Point oldCursor;

DrawMode drMode;

public List<Figure> FigList;

ColorDialog ColDial;

Figure f = null;

Point pnt;

Bitmap buffer;

bool moving=false;

int deleted = -1;

 

public ChildForm()

{

InitializeComponent();

ColDial = new ColorDialog();

oldCursor = new Point(0, 0);

FigList = new List<Figure>();

drMode = DrawMode.Draw;

}

 

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

{

Graphics g = pictureBox1.CreateGraphics();

switch (drMode)

{

case DrawMode.Draw:

if (e.Button == MouseButtons.Left)

{

if (f == null)

f = new Figure();

pnt = new Point(e.X, e.Y);

f.PointsList.Add(pnt);

}

else

{

if (f.PointsList.Count > 2)

{

Pen pen2 = new Pen(pictureBox1.BackColor, 2);

Pen pen = new Pen(f.kont, 2);

g.DrawLine(pen2, f.PointsList[f.PointsList.Count - 1], oldCursor);

g.DrawLine(pen, f.PointsList[0], f.PointsList[f.PointsList.Count - 1]);

foreach (Figure fig in FigList)

if (!fig.Equals(f))

fig.Redraw(false, g);

FigList.Add(f);

f = null;

pen2.Dispose();

pen.Dispose();

}

}

break;

case DrawMode.Redact:

if(e.Button == MouseButtons.Right)

foreach (Figure fig in FigList)

if (fig.GetPath().IsVisible(e.X, e.Y))

{

f = fig;

contextMenuStrip1.Show(pictureBox1, e.X, e.Y);

break;

}

break;

case DrawMode.Delete:

pnt = f.FindPoint(e.X, e.Y);

if (!pnt.IsEmpty)

{

f.Redraw(true,g);

foreach (Figure fig in FigList)

if (!fig.Equals(f))

fig.Redraw(false, g);

f.PointsList.Remove(pnt);

f.Redraw(false,g);

drMode = DrawMode.Redact;

}

break;

case DrawMode.Add:

f.PointsList.Add(new Point(e.X, e.Y));

f.Redraw(false,g);

drMode = DrawMode.Redact;

break;

case DrawMode.MoveVersh:

if (deleted == -1)

{

pnt = f.FindPoint(e.X, e.Y);

deleted = f.PointsList.IndexOf(pnt);

f.Redraw(true,g);

f.PointsList.Remove(pnt);

f.Redraw(false,g);

}

break;

 

case DrawMode.MoveFig:

if (!moving)

{

foreach (Figure fig in FigList)

if (fig.GetPath().IsVisible(e.X, e.Y))

{

f = fig;

f.Redraw(true,g);

Rectangle bnd = new Rectangle();

bnd = Rectangle.Ceiling(f.GetPath().GetBounds());

buffer = new Bitmap(bnd.Height * 2, bnd.Width);

Graphics bg = Graphics.FromImage(buffer);

bg.CopyFromScreen(pictureBox1.PointToScreen(bnd.Location), new Point(0, 0), bnd.Size);

Cursor.Position = pictureBox1.PointToScreen(bnd.Location);

moving = true;

bg.Dispose();

break;

}

}

break;

}

g.Dispose();

}

 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

{

if (f!= null)

{

Graphics g = pictureBox1.CreateGraphics();

Pen pen = new Pen(f.kont, 2);

Pen pen2 = new Pen(Color.White, 2);

if (drMode == DrawMode.Draw)

{

g.DrawLine(pen2, f.PointsList[f.PointsList.Count - 1], oldCursor);

g.DrawLine(pen, f.PointsList[f.PointsList.Count - 1], e.Location);

 

}

else if (deleted!= -1)

{

g.DrawLine(pen2, f.PointsList[deleted - 1], oldCursor);

g.DrawLine(pen2, f.PointsList[deleted], oldCursor);

g.DrawLine(pen, f.PointsList[deleted - 1], e.Location);

g.DrawLine(pen, f.PointsList[deleted], e.Location);

}

else if (moving)

{

g.DrawImage(buffer, oldCursor);

Graphics bg = Graphics.FromImage(buffer);

bg.CopyFromScreen(pictureBox1.PointToScreen(new Point(e.X, e.Y)), new Point(0, 0), buffer.Size);

f.Offset(oldCursor.X - e.X, oldCursor.Y - e.Y);

f.Redraw(false,g);

bg.Dispose();

}

pen2.Dispose();

pen.Dispose();

g.Dispose();

}

oldCursor = e.Location;

}

 

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

{

if (deleted!= -1 && drMode==DrawMode.MoveVersh)

{

Graphics g = pictureBox1.CreateGraphics();

f.PointsList.Insert(deleted, new Point(e.X, e.Y));

f.Redraw(false,g);

deleted = -1;

drMode = DrawMode.Redact;

g.Dispose();

}

else if (moving && drMode == DrawMode.MoveFig)

{

moving = false;

buffer.Dispose();

}

 

}

 

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

Close();

}

 

private void рисованиеToolStripMenuItem_Click(object sender, EventArgs e)

{

f = null;

drMode = DrawMode.Draw;

}

 

private void редактированиеToolStripMenuItem_Click(object sender, EventArgs e)

{

f = null;

drMode = DrawMode.Redact;

}

 

private void перемещениеToolStripMenuItem_Click(object sender, EventArgs e)

{

f = null;

drMode = DrawMode.MoveFig;

MessageBox.Show("Выберите фигуру");

}

 

private void контураToolStripMenuItem_Click(object sender, EventArgs e)

{

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

{

Graphics g = pictureBox1.CreateGraphics();

f.kont = ColDial.Color;

f.Redraw(false,g);

g.Dispose();

}

}

 

private void заливкиToolStripMenuItem_Click(object sender, EventArgs e)

{

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

{

Graphics g = pictureBox1.CreateGraphics();

f.zal = ColDial.Color;

f.Redraw(false,g);

g.Dispose();

}

}

 

private void удалитьToolStripMenuItem_Click(object sender, EventArgs e)

{

MessageBox.Show("Выберите вершину");

drMode = DrawMode.Delete;

}

 

private void добавитьToolStripMenuItem_Click(object sender, EventArgs e)

{

MessageBox.Show("Выберите вершину");

drMode = DrawMode.Add;

}

 

private void переместитьToolStripMenuItem_Click(object sender, EventArgs e)

{

MessageBox.Show("Выберите вершину");

drMode = DrawMode.MoveVersh;

}

 

public class Figure

{

public List<Point> PointsList;

public Color kont, zal;

 

public Figure()

{

PointsList = new List<Point>();

 

kont = Color.Black;

zal = Color.White;

}

 

public GraphicsPath GetPath()

{

GraphicsPath path = new GraphicsPath();

Point[] points = new Point[PointsList.Count];

points = PointsList.ToArray();

path.AddPolygon(points);

return path;

}

 

public void Redraw(bool transparent, Graphics g)

{

Color p, b;

if (!transparent)

{

p = kont;

b = zal;

}

else

{

p = Color.White;

b = Color.White;

}

Pen pen = new Pen(p, 2);

SolidBrush brush = new SolidBrush(b);

g.DrawPath(pen, GetPath());

g.FillPath(brush, GetPath());

brush.Dispose();

pen.Dispose();

}

 

public Point FindPoint(int x, int y)

{

Point pnt = new Point();

foreach (Point p in PointsList)

if (x < p.X + 5 && x > p.X - 5 && y < p.Y + 5 && y > p.Y - 5)

return p;

return pnt;

}

 

public void Offset(int dx, int dy)

{

Point[] points = new Point[PointsList.Count];

points = PointsList.ToArray();

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

{

points[i].Offset(dx, dy);

PointsList.RemoveAt(i);

PointsList.Insert(i,points[i]);

}

}

}

 

private void СохранитьToolStripMenuItem_Click(object sender, EventArgs e)

{

using (System.IO.StreamWriter sw = new System.IO.StreamWriter(@"D:\Polygons.txt"))

{

foreach (Figure f in FigList)

{

foreach (Point p in f.PointsList)

sw.Write(p.ToString());

sw.WriteLine("");

sw.WriteLine(f.kont.ToKnownColor());

sw.WriteLine(f.zal.ToKnownColor());

}

}

/*

System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(List<Figure>));

saveFileDialog1.ShowDialog();

System.IO.StreamWriter file = new System.IO.StreamWriter(@saveFileDialog1.FileName);

writer.Serialize(file, FigList);

file.Close();

*/

}

 

private void загрузитьToolStripMenuItem_Click(object sender, EventArgs e)

{

Point p = new Point();

string line = "";

char start='{';

string coord= "";

FigList.Clear();

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"D:\Polygons.txt"))

{

while ((line = sr.ReadLine())!= null)

{

if (line[0] == start)

{

f = new Figure();

foreach (char c in line)

{

if (Char.IsDigit(c))

coord += c;

else if (coord!= "" && p.IsEmpty)

{

p.X = Convert.ToInt32(coord);

coord = "";

}

else if (coord!= "" &&!p.IsEmpty)

{

p.Y = Convert.ToInt32(coord);

f.PointsList.Add(p);

p.X = 0;

p.Y = 0;

coord = "";

}

}

FigList.Add(f);

}

else

{

f.kont = Color.FromName(line);

f.zal = Color.FromName(sr.ReadLine());

}

 

}

}

f = null;

Graphics g = pictureBox1.CreateGraphics();

pictureBox1.Refresh();

foreach (Figure fig in FigList)

fig.Redraw(false, g);

g.Dispose();

/*

System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(List<Figure>));

openFileDialog1.ShowDialog();

System.IO.StreamReader file = new System.IO.StreamReader(@openFileDialog1.FileName);

FigList = (List<Figure>)reader.Deserialize(file);

file.Close();

Graphics g = pictureBox1.CreateGraphics();

pictureBox1.Refresh();

foreach (Figure f in FigList)

f.Redraw(false, g);

g.Dispose();

*/

}

 

}

 

}

 



Поделиться:




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

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


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