Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oop6.docx
Скачиваний:
5
Добавлен:
07.04.2025
Размер:
75.36 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное

Образовательное учреждение высшего образования

«Уфимский университет науки и технологий»

Факультет информатики и робототехники

Кафедра ВМиК

Отчет по лабораторной работе № 6

по дисциплине «Объектно-ориентированное программирование»

Выполнил:

Студент группы ПРО-232Б Э. А. Ихсанова

Проверил:

Доцент кафедры ВМИК В. А. Котельников

Уфа 2023

Цель работы

Продолжение изучения основ полиморфизма, создания интерфейса, работы с классами.

Задание

  • Создание графических объектов на экране:

    • меню, панель инструментов с доступными классами объектов

    • добавление нового объекта в рабочую область

    • изменение пользователем размера формы

  • Манипуляции объектами в рабочей области:

    • выбор объекта для манипулирования (выделяется цветом или рамкой)

    • несколько одновременно выбранных объектов

    • изменение цвета, размера, положения

    • удаление объекта из рабочей области

    • контроль выхода за рабочую область (при передвижении объект не должен выходить за границы ни одной своей частью)

  • Программные требования:

    • манипуляции объектами выполняются с помощью клавиатуры, при этом выбор клавиш управления должен быть как можно ближе к используемым обычно для таких задач в среде Windows

    • «хорошая» иерархия классов

    • использование своего контейнера-хранилища объектов из Л.Р.3

    • отделение взаимодействия с пользователем от логики работы классов

Ход работы

Лабораторная построена на основе ЛР 4.1, дополняет и расширяет ее возможности: полиморфизмы, работа с классами и пользовательскими интерфейсами

Рисунок 1 Скриншот работы программы

Выводы

По ходу выполнения работы были закреплены основы полиморфизма, работа с классами и пользовательскими интерфейсами.

Ссылка на GitHub: https://github.com/eikhovna/oop6

Приложение 1

Form1.cs:

using System;

using System.Drawing.Drawing2D;

using System.Windows.Forms.VisualStyles;

using static oop6.Form1;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Color;

using System.Windows.Forms;

using static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;

using static System.Collections.Specialized.BitVector32;

namespace oop6

{

public partial class Form1 : Form

{

private List<CFigure> figures = new List<CFigure>(); // Лист для хранения всех фигур

public int objectSize = 10;

public bool Cntrl;

Color color = Color.Red;

Color red = Color.Red;

Color green = Color.Green;

Color purple = Color.Purple;

Color black = Color.Black;

int colorIndex = 0;

int selectedFigure = 0;

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

foreach (Control control in this.Controls)

{

control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown);

}

}

private void Form1_Paint(object sender, PaintEventArgs e)// Метод отрисовки кругов

{

e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // Сглаживание

foreach (CFigure figure in figures)

{

figure.SelfDraw(e.Graphics); // Метод круга для отрисовки самого себя

}

}

private void Form1_MouseClick(object sender, MouseEventArgs e)

{

if (!Cntrl)

{

foreach (CFigure figure in figures) // снятие выделения со всех объектов

{

figure.setCondition(false);

}

switch (selectedFigure)

{

case 0:

CCircle newcircle = new CCircle(e.X, e.Y, objectSize, color);

newcircle.setCondition(true);

figures.Add(newcircle);

break;

case 1:

CSquare newsquare = new CSquare(e.X, e.Y, objectSize, color);

newsquare.setCondition(true);

figures.Add((newsquare));

break;

case 2:

CTriangle newtriangle = new CTriangle(e.X, e.Y, objectSize, color);

newtriangle.setCondition(true);

figures.Add((newtriangle));

break;

case 3:

CSection newsection = new CSection(e.X, e.Y, objectSize, color);

newsection.setCondition(true);

figures.Add((newsection));

break;

}

Refresh();

}

else if (Cntrl) // Выделение кругов, если зажат cntrl

{

foreach (CFigure figure in figures)

{

if (figure.MouseCheck(e))

{

figure.setCondition(true);

break;

}

}

Refresh();

}

}

private void trackBar1_Scroll(object sender, EventArgs e)

{

objectSize = trackBar1.Value;

}

private void Form1_KeyUp(object sender, KeyEventArgs e)// Отжатие кнопки

{

checkBox1.Checked = false;

}

private void Form1_KeyDown(object sender, KeyEventArgs e)// Нажатие кнопок delete и cntrl

{

if (Control.ModifierKeys == Keys.Control)

{

checkBox1.Checked = true;

}

else if (e.KeyCode == Keys.Delete)

{

DelFigures();

}

else if (e.KeyCode == Keys.Up)

{

foreach (CFigure figure in figures)

{

if (figure.selected && ((figure.coords.Y - figure.rad) > 0))

{

figure.coords.Y -= 3;

}

}

Refresh();

}

else if (e.KeyCode == Keys.Down)

{

foreach (CFigure figure in figures)

{

if (figure.selected && ((figure.coords.Y + figure.rad) < (int)this.ClientSize.Height))

{

figure.coords.Y += 3;

}

}

Refresh();

}

else if (e.KeyCode == Keys.Left)

{

foreach (CFigure figure in figures)

{

if (figure.selected && ((figure.coords.X - figure.rad) > 0))

{

figure.coords.X -= 3;

}

}

Refresh();

}

else if (e.KeyCode == Keys.Right)

{

foreach (CFigure figure in figures)

{

if (figure.selected && ((figure.coords.X + figure.rad) < (int)this.ClientSize.Width))

{

figure.coords.X += 3;

}

}

Refresh();

}

else if (e.KeyCode == Keys.Oemplus)

{

GetBigger();

}

else if (e.KeyCode == Keys.OemMinus)

{

GetSmaller();

}

}

private void checkBox1_CheckedChanged(object sender, EventArgs e)

{

Cntrl = checkBox1.Checked;

foreach (CFigure figure in figures)

{

figure.fcntrl = Cntrl;

}

}

private void button1_Click(object sender, EventArgs e)

{

GetBigger();

}

private void button2_Click(object sender, EventArgs e)

{

GetSmaller();

}

private void button3_Click(object sender, EventArgs e)

{

DelFigures();

}

private void GetSmaller()

{

foreach (CFigure figure in figures)

{

if (figure.selected && figure.rad > 10)

{

figure.rad -= 5;

}

}

Refresh();

}

private void GetBigger()

{

foreach (CFigure figure in figures)

{

if (figure.selected && figure.rad <= 95)

{

figure.rad += 5;

}

}

Refresh();

}

void DelFigures() // Метод удаления фигур

{

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

{

if (figures[i].selected == true)

{

figures.Remove(figures[i]);

i--;

}

}

Refresh();

}

private void button_circle_Click(object sender, EventArgs e)

{

selectedFigure = 0;

}

private void button_square_Click(object sender, EventArgs e)

{

selectedFigure = 1;

}

private void button_triangle_Click(object sender, EventArgs e)

{

selectedFigure = 2;

}

private void button_section_Click(object sender, EventArgs e)

{

selectedFigure = 3;

}

private void button6_Click(object sender, EventArgs e)

{

if (colorIndex < 3)

colorIndex++;

else

colorIndex = 0;

switch (colorIndex)

{

case 0:

color = red;

break;

case 1:

color = green;

break;

case 2:

color = purple;

break;

case 3:

color = black;

break;

}

button6.BackColor = color;

foreach (CFigure figure in figures)

{

if (figure.selected)

figure.colorF = color;

}

}

void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)

{

if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)

{

e.IsInputKey = true;

}

}

private void button4_Click(object sender, EventArgs e)

{

foreach (CFigure figure in figures) // выделения всех объектов

{

figure.setCondition(true);

}

Refresh();

}

public class CFigure

{

public Point coords;

public int rad;

public bool selected = false;

public bool fcntrl = false;

public Color colorT = Color.CornflowerBlue;

public Color colorF = Color.Purple;

public void setCondition(bool cond) // метод переключения выделения

{

selected = cond;

}

public virtual void SelfDraw(Graphics g) // Метод для отрисовки самого себя

{

}

public virtual bool MouseCheck(MouseEventArgs e) // Проверка объекта на попадание в него курсора

{

return false;

}

}

public class CCircle : CFigure// класс круга

{

public CCircle(int x, int y, int radius, Color color) // конструктор по умолчанию

{

coords.X = x;

coords.Y = y;

rad = radius;

colorF = color;

}

public override void SelfDraw(Graphics g) // Метод для отрисовки самого себя

{

if (selected == true)

g.DrawEllipse(new Pen(colorT, 3), coords.X - rad, coords.Y - rad, rad * 2, rad * 2);

else

g.DrawEllipse(new Pen(colorF, 3), coords.X - rad, coords.Y - rad, rad * 2, rad * 2);

}

public override bool MouseCheck(MouseEventArgs e) // Проверка объекта на попадание в него курсора

{

if (fcntrl)

{

if (Math.Pow(e.X - coords.X, 2) + Math.Pow(e.Y - coords.Y, 2) <= Math.Pow(rad, 2) && !selected)

{

selected = true;

return true;

}

}

return false;

}

}

public class CSquare : CFigure // класс квадрата

{

public CSquare(int x, int y, int radius, Color color) // конструктор по умолчанию

{

coords.X = x;

coords.Y = y;

rad = radius;

colorF = color;

}

public override void SelfDraw(Graphics g) // Метод для отрисовки самого себя

{

if (selected == true)

g.DrawRectangle(new Pen(colorT, 3), coords.X - rad, coords.Y - rad, rad * 2, rad * 2);

else

g.DrawRectangle(new Pen(colorF, 3), coords.X - rad, coords.Y - rad, rad * 2, rad * 2);

}

public override bool MouseCheck(MouseEventArgs e) // Проверка объекта на попадание в него курсора

{

if (fcntrl)

{

if (Math.Pow(e.X - coords.X, 2) + Math.Pow(e.Y - coords.Y, 2) <= Math.Pow(rad, 2) && !selected)

{

selected = true;

return true;

}

}

return false;

}

}

public class CTriangle : CFigure // класс треугольника

{

public CTriangle(int x, int y, int radius, Color color) // конструктор по умолчанию

{

coords.X = x;

coords.Y = y;

rad = radius;

colorF = color;

}

public override void SelfDraw(Graphics g) // Метод для отрисовки самого себя

{

Point point1 = new Point(coords.X, coords.Y - rad);

Point point2 = new Point(coords.X + rad, coords.Y + rad);

Point point3 = new Point(coords.X - rad, coords.Y + rad);

Point[] curvePoints = { point1, point2, point3 };

if (selected == true)

g.DrawPolygon(new Pen(colorT, 3), curvePoints);

else

g.DrawPolygon(new Pen(colorF, 3), curvePoints);

}

public override bool MouseCheck(MouseEventArgs e) // Проверка объекта на попадание в него курсора

{

if (fcntrl)

{

if (Math.Pow(e.X - coords.X, 2) + Math.Pow(e.Y - coords.Y, 2) <= Math.Pow(rad, 2) && !selected)

{

selected = true;

return true;

}

}

return false;

}

}

public class CSection : CFigure // класс отрезка

{

public CSection(int x, int y, int radius, Color color) // конструктор по умолчанию

{

coords.X = x;

coords.Y = y;

rad = radius;

colorF = color;

}

public override void SelfDraw(Graphics g) // Метод для отрисовки самого себя

{

Point point1 = new Point(coords.X - rad, coords.Y);

Point point2 = new Point(coords.X + rad, coords.Y);

Point[] curvePoints = { point1, point2 };

if (selected == true)

g.DrawPolygon(new Pen(colorT, 3), curvePoints);

else

g.DrawPolygon(new Pen(colorF, 3), curvePoints);

}

public override bool MouseCheck(MouseEventArgs e) // Проверка объекта на попадание в него курсора

{

if (fcntrl)

{

if (Math.Pow(e.X - coords.X, 2) + Math.Pow(e.Y - coords.Y, 2) <= Math.Pow(rad, 2) && !selected)

{

selected = true;

return true;

}

}

return false;

}

}

}

}

Соседние файлы в предмете Объектно ориентированное программирование