Работа с компонентами


НазваниеРабота с компонентами
страница3/4
ТипЛабораторная работа
1   2   3   4

Небольшое замечание.

При попытке сохранить файл в любом расширении, помимо *.png у пользователя будет сохранен черный квадрат. Это связано с тем, что по умолчанию PictureBox имеет прозрачный фон. Прозрачный фон поддерживает (в нашем случае) только формат png. Остальные форматы, не имеющие данной поддержки, заменяют прозрачный фон на черный. Линии, нарисованные черным пером сливаются с фоном и получается черный прямоугольник. Вот небольшой кусок кода, который может помочь решить проблему:

Graphics g = Graphics.FromImage(picDrawingSurface.Image);



g.Clear(Color.White);

g.DrawImage(picDrawingSurface.Image, 0, 0, 750, 500);

Так же есть и другие варианты исправления этой ситуации. Всё это для самостоятельного изучения и исправления.

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

Тема: дополнение графического редактора, созданного в прошлой лабораторной работе.

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

c:\users\никита\desktop\презентация1.png

Для того, чтобы ее добавить, нужно зайти в проект->добавить форму 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


Код C#

1

2

3


Form2 f = new Form2();

f.ShowDialog();

this.textBox1.Text = f.textBox1.Text;







+ Самый быстрый в реализации и удобный способ
- Противоречит всем основам ООП
- Возможна передача только из более поздней формы в более раннюю
- Форма f показывается только с использованием ShowDialog(), т.е. в первую форму управление вернется только по закрытию второй. Избежать этого можно, сохранив ссылку на вторую форму в поле первой формы.

2. Использование открытого свойства/метода. Способ очень похож на первый
В классе Form2 определяем свойство (или метод)

Код C#

1

2

3

4

5

6

7


public string Data

{

    get

    {

        return textBox1.Text;

    }

}







В любом месте Form1

Код C#

1

2

3


Form2 f = new Form2();

f.ShowDialog();

this.textBox1.Text = f.Data;







+ Противоречит не всем основам ООП
- Минусы те же

3. Передача данных в конструктор Form2
Изменяем конструктор Form2

Код C#

1

2

3

4

5

6

7

8


public Form2(string data)

{

    InitializeComponent();

    //Обрабатываем данные

    //Или записываем их в поле

    this.data = data;

}

string data;







А создаем форму в любом месте Form1 так:

Код C#

1

2

3


Form2 f = new Form2(this.textBox1.Text);

f.ShowDialog();

//Или f.Show();







+ Простой в реализации способ
+ Не нарушает ООП
- Возможна передача только из более ранней формы в более позднюю

4. Передача ссылки в конструктор
Изменяем конструктор Form2

Код C#

1

2

3

4

5

6

7


public Form2(Form1 f1)

{

    InitializeComponent();    

    //Обрабатываем данные

    //Или записываем их в поле

    string s = f1.textBox1.Text;

}







А создаем форму в любом месте Form1 так, т.е. передаем ей ссылку на первую форму

Код C#

1

2

3


Form2 f = new Form2(this);

f.ShowDialog();

//Или f.Show();







+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
- Нарушает ООП

5. Используем свойство 'родитель'
При создании второй формы устанавливаем владельца

Код C#

1

2

3


Form2 f = new Form2();

f.Owner = this;

f.ShowDialog();







Во второй форме определяем владельца

Код C#

1

2

3

4

5

6


Form1 main = this.Owner as Form1;

if(main != null)

{

    string s = main.textBox1.Text;

    main.textBox1.Text = "OK";

}







+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
+ Не нарушает ООП

6. Используем отдельный класс
Создаем отдельный класс, лучше статический, в основном namespace, т.е. например в файле Program.cs

Код C#

1

2

3

4


static class Data

{

    public static string Value { get; set; }

}







Его открытые свойства/методы доступны из любой формы.

Код C#

1


Data.Value = "111";







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

Приведённый выше обзор методов, взят с интернет-источника, с полным списком методов можно ознакомиться перейдя по ссылке: http://www.cyberforum.ru/windows-forms/thread110436.html#post629892

Это задание для самостоятельного решения. Рекомендуем использовать способ, который не нарушает законы ООП и не вносит ряд костылей в код. (В ходе данной работы был использован вариант под номером 5).

Лабораторная работа №4.

Тема: Перетаскивание графических объектов с помощью мыши.





Требования к работе:

1) На форме, в границах PictureBox, должны быть созданы три графических объекта: квадрат, эллипс и прямоугольник.

2) Реализована возможность перетаскивания этих объектов по форме.

3) Должно быть выполнено следующее условие: если один из объектов, будет перенесён на Label «Вид», то в третьем Lable «Информация», должны появиться данные о том какого цвета и что это за фигура.

4) При перетаскивании окружности или квадрата на Label «Форма», объект должен меняться на противоположный (т.е. если перенесли квадрат, то он становится окружностью, а окружность, в свою очередь, становится квадратом и наоборот).

Задание 1. Создание визуальной части приложения.

  1. Расположите на форме PictureBox.

  2. Добавьте три компонента Label

Задание 2. Программирование элементов.

  1. Рисование фигур.

  2. Реализация Drag’n’Drop.

Порядок действий:

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, фигуры рисуются в прямом порядке, в котором вы их установили. Т.е. если сначала вы «залили» прямоугольник, а потом круг, то круг будет на переднем плане. Значит, для выполнения, этого задания, вам нужно проверять, как фигура выбрана, а далее просто менять порядок прорисовки.

Пример готовой программы:



1   2   3   4

Похожие:

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

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

Работа с компонентами iconПрофессиональный стандарт
Инженер-технолог в области анализа, разработки и испытаний бетонов с наноструктурирующими компонентами

Работа с компонентами iconПрофессиональный стандарт
Инженер-технолог в области анализа, разработки и испытаний бетонов с наноструктурирующими компонентами

Работа с компонентами iconПорядок ведения и оформления тетрадей по русскому языку и литературе
Например: Проверочная работа. Самостоятельная работа. Контрольная работа. Работа над ошибками. Изложение. Сочинение

Работа с компонентами iconРабочая программа по предмету «Технология»
Федеральным и региональным компонентами Государственного стандарта начального общего образования

Работа с компонентами iconСинодалова Екатерина Александровна
Обязанности: работа с документацией, прием телефонных звонков, работа с оргтехникой, работа с компьютером

Работа с компонентами icon1 общие положения выпускная квалификационная работа (дипломная работа)
Выпускная квалификационная работа (дипломная работа) представляет собой законченную разработку, в которой решается актуальная для...

Работа с компонентами iconСемантика фразеологизмов с компонентами «белый» и«черный» цвета
Фразеологическая единица (фразеологизм, фразеологический оборот) – лексически неделимое, устойчивое в своем составе и структуре,...

Работа с компонентами iconПрактическая работа №1 «Работа с нормативными документами»
...

Вы можете разместить ссылку на наш сайт:


Все бланки и формы на filling-form.ru




При копировании материала укажите ссылку © 2019
контакты
filling-form.ru

Поиск