- •Лабораторная работа 1 Тема: Типы данных и операторы языка с#. Массивы. Строки. Регулярные выражения
- •Типы данных c#
- •Преобразования типов
- •Преобразования строк в число. Класс Convert
- •Массивы в c#
- •Int[] k; //k – одномерный массив
- •Базовый класс System.Array
- •Строки в с# Класс Сhar
- •Строковые константы
- •Класс String
- •Пространство имен RegularExpression и классы регулярных выражений
- •Синтаксис регулярных выражений
- •Классы пространства RegularExpressions
- •1. Проработать примеры 1-8, данные в теоретических сведениях. Создать на их основе программы. Получить результаты работы программ и уметь их объяснить. Внести их в отчет с комментариями.
- •2. Выполнить два задания на двумерный массив по заданному номеру варианта и номеру, отсчитанному с конца.
- •3. Выполнить два задания на строки по заданному номеру варианта и номеру, отсчитанному с конца. Использовать в задачах два класса строк: String и StringBuilder.
- •4. Выполнить задание на применение регулярных выражений. Выбрать одно по заданному номеру.
- •Лабораторная работа 2 Тема: Структуры и перечисления как частные виды классов. Классы. Интерфейсы
- •[Атрибуты][модификаторы]enum имя_перечисления[: базовый класс] {список_возможных_значений}
- •[Атрибуты][модификаторы]struct имя_структуры [:список_интерфейсов] {тело_структуры}
- •Классы в c# [атрибуты][модификаторы]class имя_класса [:список_родителей] {тело_класса}
- •Индексаторы
- •Статические поля и методы класса
- •Наследование
- •Интерфейсы
- •Две стратегии реализации интерфейса
- •Преобразование к классу интерфейса
- •Проблемы множественного наследования
- •Коллизия имен
- •Ip1.Prop1("интерфейс iProps: свойство 1");
- •Ip1.Prop2("интерфейс 1 ", 88);
- •Ip2.Prop1("интерфейс iPropsOne: свойство1");
- •2. Наследование от общего предка
- •Обработка исключительных ситуаций
- •Блок finally
- •Лабораторная работа 3 Тема: Разработка gui. Создание sdi-приложений. Обработка событий
- •Создание простых форм с помощью комплекса инструментальных средств разработки программ .Net sdk
- •Режимы дизайна и кода
- •Элементы управления
- •Общие свойства, события и методы элементов управления
- •Обработка событий в Windows Forms
- •События MouseDown и Keypress
- •Форматирование элементов управления
- •Создание меню
- •Закрытие формы
- •Диалоговые окна
- •Создание панели инструментов
- •Список элементов ListBox
- •Потоковые классы
- •Встроенные типы данных и потоки
- •Класс File
- •Сериализация объектов
- •Создание многооконного приложения
- •Для каждого пункта меню пишем обработчики событий, выполняющие соответсвтвующие пункту действия. Перечисление MdiLayout
- •Вырезание, копирование и вставка текстовых фрагментов
- •Контекстное меню
- •Диалоговые окна
- •Сохранение файла при закрытии формы
- •OpenFileDialog и SaveFileDialog для sdi-приложений
- •Лабораторная работа 5 Тема: Создание и вывод графический изображений на форму. Анимация.
- •Класс Region
- •Вывод графических объектов без события Paint
- •Возможности класса Graphics
- •Класс Pen
- •Вывод изображений
- •Элемент управления PictureBox
- •Вывод изображений и двойная буферизация
Элемент управления PictureBox
PictureBox — это класс, производный от Control, поэтому можно использовать множество событий, всплывающую подсказку, контекстное меню и прочие возможности элемента управления. Проиллюстрируем применение PictureBox на примере.
Создадим приложение, которое будет захватывать события MouseUp, MouseDown и MouseMove для области, занятой на форме изображением (которое помещено в PictureBox). Добавим код для работы с перетаскиванием (drag-and-drop). Пользователь сможет перетаскивать одно из изображений по всей форме. Кроме того, будем осуществлять проверку того, где оказалось перетаскиваемое изображение после того, как пользователь его отпустит. Если оно попало в область, занимаемую заданным прямоугольником, будет выводиться специальное сообщение. Таким образом, реализуем механизм, называемый «проверкой попадания» — hit testing.
Назначение объекту PictureBox изображения, которое будет в нем содержаться, выглядит следующим образом:
Свойство PictureBox, —SizeMode, для него используются значения из перечисления PictureBoxSizeMode. Это свойство позволяет определить, как именно будет выводиться изображение внутри PictureBox. В нашем случае было использовано значение StretchImage, которое означает, что изображение должно быть сжато или растянуто таким образом, чтобы полностью соответствовать размерам PictureBoх. Другие возможные значения представлены в таблице 5.8.
Таблица 5.8. Значения перечисления PictureBoxSizeMode
Значение |
Описание |
AutoSize |
Значения PictureBox будут изменены таким образом, чтобы полностью соответствовать размерам изображения |
CenterImage |
Если размеры PictureBox будут больше, чем размеры изображения, изображение будет позиционировано точно по центру PictureBox, Если же размеры изображения будут превышать размеры PictureBox, то выступающие края будут обрезаны |
Normal |
Изображение будет расположено в верхнем левом углу PictureBox. Если размеры изображения превысят размеры PictureBox, выступающие края будут обрезаны |
Выберите Choose Image для выбора изображения для отображения в PictureBox.
После того как создали PictureBox и настроили его свойства, следующая задача — обеспечить обработчики для событий MouseMove, MouseUp и MouseDown.
// Добавляем обработчики для следующих событий
pictureBox1.MouseDown +=new MouseEventHandler(pictureBox1_MouseDown);
pictureBox1.MouseUp +=new MouseEventHandler(pictureBox1_MouseUp);
pictureBox1.MouseMove +=new MouseEventHandler(pictureBox1_MouseMove);
this.Paint +=new PaintEventHandler(Form1_Paint);
В обработчике события MouseDown, во-первых, устанавливается значение true для переменной isDragging (началась операция перетаскивания), а во-вторых, фиксируются координаты указателя мыши при наступлении этого события:
// Обработчик события MouseDown для объекта PictureBox
private void pictureBox1_MouseDown(Object sender, MouseEventArgs e) {
isDragging = true;
oldX = e.X;
oldY = e.Y ;
}
Обработчик события MouseMove обеспечивает перемещение PictureBox по форме (изменяя значения свойств Тор и Left). Для расчета нового положения PictureBox используется смещение указателя мыши относительно исходной позиции:
Если пользователь производит щелчок на изображении и, не отпуская кнопку, перемещает мышь. PictureBox вместе с изображением будет перерисовываться в новой месте
private void pictureBox1_MouseMove(Object sender, MouseEventArgs e) {
if(isDragging) {
// Определяем новые координаты для PictureBox по разности между
// старым и новым положением указателя мыши
pictureBox1.Top =pictureBox1.Top + (e.Y - oldY);
pictureBox1.Left = pictureBox1.Left + (e.X - oldX);
}
}
Далее обработчик события MouseUp должен установить значение переменной isDragging равным false — это признак окончания операции перетаскивания. Кроме того, по условиям задачи должна производиться проверка: если перемещаемый PictureBox отпущен внутри определенной области формы (ограниченной размерами объекта Rectangle), то пользователь добился успеха.
Таким образом, весь оставшийся необходимый код выглядит следующим образом:
private void pictureBox1_MouseUp(Object sender, MouseEventArgs e) {
Rectangle dropRect = new Rectangle(200, 100, 350, 250);
isDragging = false;
if(dropRect.Contains(pictureBox1.Bounds))
MessageBox.Show("Вы победили!", "Проверка попадания");
}
private void Form1_Paint(Object sender, PaintEventArgs e) {
// Выводим "прямоугольник сбрасывания"
Graphics g = e.Graphics;
Rectangle dropRect = new Rectangle(200, 100, 350, 250);
g.FillRectangle(Brushes.Blue, dropRect);
g.DrawString("Перетащите картинку в эту область.", this.Font, Brushes.Red, 200, 100);
}
Не забудьте объявить переменные перед классом формы, например,
bool isDragging;
int oldX, oldY;
Главную роль в проверке попадания играет метод Rectangle.Contains( ). Этот метод перегружен и может принимать другой прямоугольник, точку или два значения типа int в качестве координат. Этот метод удобен в ситуации, когда необходимо проверить, попал ли пользователь щелчком мыши в прямоугольную область на форме или нет.
Рассмотрим следующую задачу: Если щелчок пришелся на какое-либо из изображений, заключить это изображение в красную рамку и изменить заголовок формы (это делается при помощи свойства Form.Text).
Первое, необходимо обеспечить перехват события MouseDown для самой формы. После этого осуществлять проверку — попадает или нет указатель мыши в область, занимаемую одним из изображений. Если ответ положительный, то значения двух переменных изменятся: переменной IsImageClicked (типа bool) будет присвоено значение true, а переменной imag (типа int) - значение, соответствующее номеру выбранного пользователем изображения. Пример кода может быть таким:
public class Form1 : Form {
private bool isImageclicked;
private int imag;
private Rectangle rectA;
private Rectangle rectB;
private Rectangle rectC;
public Form1() {
InitializeComponent();
rectA= new Rectangle(15, 15, 125, 75);
rectB = new Rectangle(15, 95, 125, 75);
rectC = new Rectangle(15, 175, 125, 75);
isImageclicked = false;
this .MouseDown+=new MouseEventHandler(Form1_MouseDown);
this.Paint +=new PaintEventHandler(Form1_Paint);
}
private void Form1_Paint(Object sender, PaintEventArgs e) {
Graphics g= e. Graphics;
Pen outline = new Pen(Color.Red, 5);
// Выводим все три изображения
g.FillRectangle(Brushes.Blue,20,20,120,70);
g.FillRectangle(Brushes.Aqua,20,100,120,70);
g.FillRectangle(Brushes.BlueViolet,20,180,120,70);
// Выводим рамку (по щелчку пользователя)
if(isImageclicked == true){
if (imag==0)
g.DrawRectangle(outline, rectA);
if (imag==1)
g.DrawRectangle(outline, rectB);
if (imag==2)
g.DrawRectangle(outline, rectC);
}
}
private void Form1_MouseDown(Object sender, MouseEventArgs e) {
// Получаем координаты указателя мыши в момент щелчка
Point mousePt = new Point(e.X, e.Y);
// Проверяем, не попадает ли указатель мыши в одну из трех областей,
// занимаемых изображениями.
if (rectA.Contains(mousePt)) {
isImageclicked = true;
imag = 0;
this.Text = "Вы кликнули изображение A";
}
else {
if (rectB.Contains(mousePt)) {
isImageclicked = true;
imag = 1;
this.Text = " Вы кликнули изображение B";
}
else if (rectC.Contains(mousePt)) {
isImageclicked = true;
imag = 2;
this.Text = " Вы кликнули изображение C";
}
else {
isImageclicked = false;
this.Text = "Изображения";
}
}
// Перерисовываем форму
Invalidate();
}
В приложение добавлена еще одна проверка: для щелчка мыши, который не попадает ни в одно из трех изображений. Эта проверка нужна для удаления рамки с выбранного перед этим изображения.
