Скачать 0.85 Mb.
|
Небольшое замечание. При попытке сохранить файл в любом расширении, помимо *.png у пользователя будет сохранен черный квадрат. Это связано с тем, что по умолчанию PictureBox имеет прозрачный фон. Прозрачный фон поддерживает (в нашем случае) только формат png. Остальные форматы, не имеющие данной поддержки, заменяют прозрачный фон на черный. Линии, нарисованные черным пером сливаются с фоном и получается черный прямоугольник. Вот небольшой кусок кода, который может помочь решить проблему: Graphics g = Graphics.FromImage(picDrawingSurface.Image); g.Clear(Color.White); g.DrawImage(picDrawingSurface.Image, 0, 0, 750, 500); Так же есть и другие варианты исправления этой ситуации. Всё это для самостоятельного изучения и исправления. Лабораторная работа №3. Тема: дополнение графического редактора, созданного в прошлой лабораторной работе. Завершающим штрихом для нашего графического редактора будет отдельная форма для выбора цвета пера. Выглядеть она будет следующим образом: Для того, чтобы ее добавить, нужно зайти в проект->добавить форму Windows. 1. Необходимо разместить все компоненты, как показано на рисунке. 2. Для компонентов HScrollBar нужно установить свойство Minimum в 0, а Maximum в 255. Это будет диапазон изменения оттенков цветов. Так же выставляем LargeChage в единицу, это будет величина прокрутки при щелчке на полосе. Точно такие же значения свойств прописываем и для NumericUpDown, только вместо LargeChage будет свойство Increment. 3. Теперь нам нужно связать HScrollBar и NumericUpDown. Для этого в конструкторе новой формы пропишем следующий код, который свяжет эти 2 компонента через свойство Tag: public ColorsForm(Color color) { InitializeComponent(); Scroll_Red.Tag = numeric_Red; Scroll_Green.Tag = numeric_Green; Scroll_Blue.Tag = numeric_Blue; numeric_Red.Tag = Scroll_Red; numeric_Green.Tag = Scroll_Green; numeric_Blue.Tag = Scroll_Blue; numeric_Red.Value = color.R; numeric_Green.Value = color.G; numeric_Blue.Value = color.B; } Для отличия между собой все 6 компонентов были переименованы. 4. Т.к. задача заключается в связывании двух компонентов HScrollBar и NumericUpDown, то воспользуемся событием ValueChanged у обоих компонентов. Для HScrollBar: private void Scroll_Red_ValueChanged(object sender, EventArgs e) { ScrollBar scrollBar = (ScrollBar)sender; NumericUpDown numericUpDown = (NumericUpDown)scrollBar.Tag; numericUpDown.Value = scrollBar.Value; } Для NumericUpDown: private void numeric_Red_ValueChanged(object sender, EventArgs e) { NumericUpDown numericUpDown = (NumericUpDown)sender; ScrollBar scrollBar = (ScrollBar)numericUpDown.Tag; scrollBar.Value = (int)numericUpDown.Value; } Аналогично прописывается еще 2 события для оставшихся двух HScrollBar и 2 события для двух оставшихся NumericUpDown. 5. Теперь нам потребуется одна глобальная для класса переменная colorResult: Color colorResult; А также отдельная функция (назовем ее UpdateColor), которая будет смешивать цвет на основании положения ползунков и закрашивать данным цветом PictureBox. Т.к. в данном PictureBox мы не будем рисовать, а будем использовать его лишь для определения цвета пера, то инициализировать его свойство Image не придется, как это делали в предыдущей части лабораторной работы. Для UpdateColor не принципиально откуда брать значения – из HScrollBar или из NumericUpDown, т.к. они теперь связаны между собой. Для примера взят именно HScrollBar: private void UpdateColor() { colorResult = Color.FromArgb(Scroll_Red.Value, Scroll_Green.Value, Scroll_Blue.Value); picResultColor.BackColor = colorResult; } Вызывать ее можно либо в HScrollBar, либо в NumericUpDown, т.к. опять же не имеет значения, ведь после 4 пункта мы связали эти 2 компонента. Выбирается любой компонент и для всех трех его цветов вызывается функция UpdateColor() в любом месте. Фича #1 В .Net есть готовое решение по выбору цвета. С ним думаю все знакомы, выглядит оно следующим образом: Данное решение называется ColorDialog. Будем вызывать его по кнопке Other Colors. Помимо того, что будет появляться это окно, нужно будет еще привязать RGB выбранного цвета к в HScrollBar и NumericUpDown. Для этого будет служить следующий код: private void buttonOther_Click(object sender, EventArgs e) { ColorDialog colorDialog = new ColorDialog(); if (colorDialog.ShowDialog() == DialogResult.OK) { Scroll_Red.Value = colorDialog.Color.R; Scroll_Green.Value = colorDialog.Color.G; Scroll_Blue.Value = colorDialog.Color.B; colorResult = colorDialog.Color; UpdateColor(); } } 6. Теперь переходим к связке двух форм. Связывать их будет лишь один параметр, который будет передаваться из формы 2 по нажатию на кнопку Ok в форму 1 – это созданный цвет пера colorResult. Существует много вариантов по передаче данных из одной формы в другую внутри одного проекта, разберем некоторые из них: 1. Изменение модификатора доступа В Form2 установить модификатор доступа для контрола/поля public В любом месте Form1
+ Самый быстрый в реализации и удобный способ - Противоречит всем основам ООП - Возможна передача только из более поздней формы в более раннюю - Форма f показывается только с использованием ShowDialog(), т.е. в первую форму управление вернется только по закрытию второй. Избежать этого можно, сохранив ссылку на вторую форму в поле первой формы. 2. Использование открытого свойства/метода. Способ очень похож на первый В классе Form2 определяем свойство (или метод)
В любом месте Form1
+ Противоречит не всем основам ООП - Минусы те же 3. Передача данных в конструктор Form2 Изменяем конструктор Form2
А создаем форму в любом месте Form1 так:
+ Простой в реализации способ + Не нарушает ООП - Возможна передача только из более ранней формы в более позднюю 4. Передача ссылки в конструктор Изменяем конструктор Form2
А создаем форму в любом месте Form1 так, т.е. передаем ей ссылку на первую форму
+ Доступ ко всем открытым полям/функциям первой формы + Передача данных возможна в обе стороны - Нарушает ООП 5. Используем свойство 'родитель' При создании второй формы устанавливаем владельца
Во второй форме определяем владельца
+ Доступ ко всем открытым полям/функциям первой формы + Передача данных возможна в обе стороны + Не нарушает ООП 6. Используем отдельный класс Создаем отдельный класс, лучше статический, в основном namespace, т.е. например в файле Program.cs
Его открытые свойства/методы доступны из любой формы.
+ Самый удобный способ, когда данные активно используются несколькими формами. Приведённый выше обзор методов, взят с интернет-источника, с полным списком методов можно ознакомиться перейдя по ссылке: http://www.cyberforum.ru/windows-forms/thread110436.html#post629892 Это задание для самостоятельного решения. Рекомендуем использовать способ, который не нарушает законы ООП и не вносит ряд костылей в код. (В ходе данной работы был использован вариант под номером 5). Лабораторная работа №4. Тема: Перетаскивание графических объектов с помощью мыши. Требования к работе: 1) На форме, в границах PictureBox, должны быть созданы три графических объекта: квадрат, эллипс и прямоугольник. 2) Реализована возможность перетаскивания этих объектов по форме. 3) Должно быть выполнено следующее условие: если один из объектов, будет перенесён на Label «Вид», то в третьем Lable «Информация», должны появиться данные о том какого цвета и что это за фигура. 4) При перетаскивании окружности или квадрата на Label «Форма», объект должен меняться на противоположный (т.е. если перенесли квадрат, то он становится окружностью, а окружность, в свою очередь, становится квадратом и наоборот). Задание 1. Создание визуальной части приложения.
Задание 2. Программирование элементов.
Порядок действий: 1) Для того, чтобы в элементе PictureBox нарисовать фигуру необходимо выполнить следующие действия: а) Создать три структуры Rectangle в шапке класса вашей формы: public partial class ЛабораторнаяРабота4 : Form { Rectangle Rectangle = new Rectangle(10, 10, 200, 100); Rectangle Circle = new Rectangle(220, 10, 150, 150); Rectangle Square = new Rectangle(380, 10, 150, 150); Примечание: первые два параметра - X и Y, вторые – ширина и высота соответственно. б) Создать обработчик события Paint для PictureBox, в котором, используя методы FillRectangle и FillEllipse класса Graphiscs для параметра обработчика рисования PaintEventArgs, «залейте» три необходимых фигуры: e.Graphics.FillEllipse(Brushes.Red, Circle); e.Graphics.FillRectangle(Brushes.Blue, Square); e.Graphics.FillRectangle(Brushes.Yellow, Rectangle); 2) Для реализации Drag’n’Drop’ нужно: а) Там же, где объявлялись структуры, создайте три переменные типа bool с начальным значением – false. Эти переменные нужны для проверки «кликнули» ли мы на какой-либо наш объект. б) Так же создайте еще по две переменных типа int cо значением равным 0 для каждого объекта (т.е. 6 переменных). Данные переменные будут фиксировать как изменяются координаты объектов во время перетаскивания. в) Теперь, в обработчике события MouseDown вашего PictureBox, вам нужно фиксировать изменение координат для ваших объектов, а так же устанавливать флаг, что тот или иной объект выбран. Пример для прямоугольника, где Rectangle – сам объект, e – параметр для событий мыши (в данном примере, с помощью него мы получаем координаты указателя мыши), RectangleX/RectangleY – те самые int-овские переменные, в которые мы и заносим текущие полученные координаты: if ((e.X < Rectangle.X + Rectangle.Width) && (e.X > Rectangle.X)) { if ((e.Y < Rectangle.Y + Rectangle.Height) && (e.Y > Rectangle.Y)) { RectangleClicked = true; RectangleX = e.X - Rectangle.X; RectangleY = e.Y - Rectangle.Y; } } Для эллипса и квадрата всё делается аналогично. г) Создайте обработчик события MouseUp, для PictureBox, в котором просто всем трём переменным типа bool задайте false. Т.е. когда кнопка мыши отпускается, мы устанавливаем всем трём объектам флаги, что ни один из них не «кликнут». д) Создайте обработчик события MouseMove, всё так же, для PictureBox. Здесь вам нужно проверить какой из объектов в данный момент перетаскивается и нужному присвоить координаты, которые мы считывали в событии MouseDown. Пример для окружности: if (CircleClicked) { Circle.X = e.X - CircleX; Circle.Y = e.Y - CircleY; } После того, как вы сделаете это для остальных двух объектов, добавьте строку: pictureBox1.Invalidate(); В ней вызывается перерисовка PictureBox’a. 3) Выполнение остальной части задания. Чтобы при перетаскивании объекта в определённую область, у нас происходили какие-то события, нам нужно просто считывать координаты объекта и сравнивать их с координатами нужной нам области (в нашем случае это Label). а) В событии MouseMove, нам необходимо сверить попадает ли какой-либо из наших объектов в границы Label «Вид». Алгоритм подобен тому, что мы делали в обработчике MouseDown ранее. Пример для квадрата: if ((label1.Location.X < Square.X + Square.Width) && (label1.Location.X > Square.X)) { if ((label1.Location.Y < Square.Y + Square.Height) && (label1.Location.Y > Square.Y)) { label3.Text = "Синий квадрат"; } } б) Создайте ещё пять переменных типа int: int X, Y, dX, dY; int LastClicked = 0; А теперь в обработчике события MouseUp, вам необходимо, как и в прошлом пункте определять положение вашего объекта и сверять его с Label «Форма». Но теперь, предварительно нам нужно знать какая именно из фигур была перенесена. Для этого и нужна переменная LastClicked, в которой содержится информация об этом. (значение этой переменной вы должны задать в MouseUp-событии. Например: 1 – прямоугольник, 2 – круг и 3 – окружность). Переменные X, Y, dX и dY нужны для сохранения координат одной из фигур, дабы передать их другой фигуре. Пример для изменения формы круга на форму квадрата: if (LastClicked == 2) { if ((label2.Location.X < Circle.X + Circle.Width) && (label2.Location.X > Circle.X)) { if ((label2.Location.Y < Circle.Y + Circle.Height) && (label2.Location.Y > Circle.Y)) { X = Circle.X; Y = Circle.Y; dX = CircleX; dY = CircleY; Circle.X = Square.X; Circle.Y = Square.Y; CircleX = SquareX; CircleY = SquareY; Square.X = X; Square.Y = Y; SquareX = dX; SquareY = dY; } } } Для обратного изменения (квадрат становится кругом) всё делается аналогично. Дополнительное задание: попробуйте сделать так, чтобы при «клике» на определённую фигуру, она становилась на передний план. Подсказка: в событии Paint, фигуры рисуются в прямом порядке, в котором вы их установили. Т.е. если сначала вы «залили» прямоугольник, а потом круг, то круг будет на переднем плане. Значит, для выполнения, этого задания, вам нужно проверять, как фигура выбрана, а далее просто менять порядок прорисовки. Пример готовой программы: |
Административный регламент с целью своевременного обеспечения медицинских организаций Оренбургской области безопасными, эффективными,... | Административный регламент с целью своевременного обеспечения медицинских организаций Оренбургской области безопасными, эффективными,... | ||
Инженер-технолог в области анализа, разработки и испытаний бетонов с наноструктурирующими компонентами | Инженер-технолог в области анализа, разработки и испытаний бетонов с наноструктурирующими компонентами | ||
Например: Проверочная работа. Самостоятельная работа. Контрольная работа. Работа над ошибками. Изложение. Сочинение | Федеральным и региональным компонентами Государственного стандарта начального общего образования | ||
Обязанности: работа с документацией, прием телефонных звонков, работа с оргтехникой, работа с компьютером | Выпускная квалификационная работа (дипломная работа) представляет собой законченную разработку, в которой решается актуальная для... | ||
Фразеологическая единица (фразеологизм, фразеологический оборот) – лексически неделимое, устойчивое в своем составе и структуре,... | ... |
Поиск Главная страница   Заполнение бланков   Бланки   Договоры   Документы    |