
- •Лабораторная работа 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
- •Вывод изображений и двойная буферизация
Вывод изображений и двойная буферизация
Способ уменьшения мерцания – использовать двойную буферизацию вывода – когда изображение сначала готовится "за кадром", а затем переносится на экран, устраняя мерцание при анимации. Рассмотрим пример вывода с двойной буферизацией:
using System.Threading; //добавляем для использования задержки
private void Form1_Paint(Object sender, PaintEventArgs e) {
//Graphics g = e.Graphics;
Graphics displayGraphics = e.Graphics;
int k=0;
while(k <500) {
Pen p = new Pen(Color.Red);
SolidBrush b= new SolidBrush(Color.Yellow);
SolidBrush b1= new SolidBrush(Color.Green);
//создаем объект - изображение, которое будет включать все, что нарисовано на форме
Image i = new Bitmap(Control.Height,Control.Width);
Graphics g = Graphics.FromImage(i);
g.Clear(Color.Aqua);
Thread.Sleep(200); //задержка на 300 миллисекунд
g.FillEllipse(b,k,150,30,45);
g.FillEllipse(b1,k+5,165,5,5);
g.FillEllipse(b1,k+20,165,5,5);
g.DrawArc(p,k+5,175,20,10,0,180);
g.FillRectangle(b1,0,190,500,100);
k=k+10;
//выводим на форму, созданное изображение
displayGraphics.DrawImage(i,ClientRectangle);
}
}
Для сравнения закомментируйте строки выделенные красным цветом и снимите комментарий со строки : Graphics g = e.Graphics;
Процесс анимации можно выполнять по таймеру.
Для объекта таймер устанавливается интервал срабатывания.
public partial class Form1 : Form
{
int k = 0;
Graphics displayGraphics;
Pen p;
SolidBrush b, b1;
public Form1()
{
InitializeComponent();
displayGraphics = Graphics.FromHwnd(this.Handle);
timer1.Enabled = true;
p = new Pen(Color.Red);
b = new SolidBrush(Color.Yellow);
b1 = new SolidBrush(Color.Green);
}
private void timer1_Tick(object sender, EventArgs e)
{
//создаем объект - изображение, которое будет включать все, что нарисовано на форме
Image i = new Bitmap(this.Height, this.Width);
Graphics g = Graphics.FromImage(i);
g.Clear(Color.Aqua);
g.FillEllipse(b, k, 150, 30, 45);
g.FillEllipse(b1, k + 5, 165, 5, 5);
g.FillEllipse(b1, k + 20, 165, 5, 5);
g.DrawArc(p, k + 5, 175, 20, 10, 0, 180);
g.FillRectangle(b1, 0, 190, 500, 100);
k = k + 10;
displayGraphics.DrawImage(i, new Point(0, 0));
}
}
Двойную буферизацию можно реализовать на основе классов BufferedGraphics и BufferedGraphicsContext. Класс BufferedGraphicsContext предоставляет методы для использования двойной буферизации, подготавливает память для второго буфера и ассоциирует этот буфер с «холстом» (Graphics) элемента управления по умолчанию.
Класс BufferedGraphics – это «оболочка» самого буфера, имеет основной метод для работы двойной буферизации – Render() с вариантами перегрузки.
Render() без параметров визуализирует второй буфер на буфер элемента управления по умолчанию. В программе используется вариант метода, при котором передается параметр – «холст», на который необходимо выполнить «проецирование» внутреннего буфера. Метод позволяет наиболее быстро производить отображение буфера на «холст» элемента управления, что позволяет избежать мерцаний.
private BufferedGraphicsContext context;
private BufferedGraphics grafx;
private Graphics pgrafx;
Здесь переменная pgrafx – экранный буфер панели panel1, т.е. на этот буфер должно «проецироваться» готовое изображение.
Переменная context – объект класса BufferedGraphicsContext, имеет необходимый метод Allocate выделения памяти для второго буфера по размеру и формату pgrafx и panel2.
Переменная grafx – ссылка на объект BufferedGraphics, который создается при вызове метода Allocate.
pgrafx = panel1.CreateGraphics();
context = new BufferedGraphicsContext();
grafx = context.Allocate(pgrafx, new Rectangle(0, 0, panel2.Width, panel2.Height));
….
перенос готового кадра из второго буфера непосредственно в буфер элемента управления (panel1), который будет выведен на экран:
grafx.Render(pgrafx);
Задания к лабораторной работе
Разобрать предложенные фрагменты программ.
Выполнить задание преподавателя. Нарисовать рисунок, используя графические примитивы, раскрасить и выполнить анимацию (можно для изображения загрузить готовую картинку). Использовать двойную буферизацию.
Запуск и останов анимации выполнять по заданным клавишам.
Нарисовать домик. Из трубы идет дым. По нажатию на заданную клавишу реализовать анимацию.
Нарисовать машинку, двигающуюся по дороге. Движение и останов машинки реализовать по нажатию на клавиши клавиатуры.
Нарисовать небо и движущиеся облака и солнце. Если облако закрывает солнце, идет дождь. Движение запускается и останавливается по щелчку мыши.
Нарисовать летающий в пространстве мяч. Движение и останов реализовать по нажатию на клавиши клавиатуры.
Нарисовать замкнутый прямоугольник, внутри которого двигается мячик и отталкивается от стенок прямоугольника. Начало и конец движения по щелчку мыши.
Реализовать фрагмент игры в «Настольный теннис». Ракетка двигается и отбивает летящий шарик. Движение ракетки по нажатию клавиш управлением курсора.
Нарисовать рисунок запуск ракеты. Движение начинать по щелчку мыши.
Нарисовать рисунок – закипание жидкости в стакане. Температура увеличивается по нажатию клавиш управлением курсора.
Нарисовать рисунок движение змейки по экрану. Направление движения задается нажатием на заданные клавиши клавиатуры.
Нарисовать летающий в пространстве куб. Движение и останов реализовать по нажатию на клавиши клавиатуры.
Вопросы к защите лабораторной работы
Как вывести изображение в форму?
Класс Graphics и его методы.
Как создать объект Graphics без события Paint?
Как вывести изображение?
Методы для настройки параметров изображения?
Как проверить условие попадания курсора мыши в прямоугольную область, непрямоугольную область?
Как организовать перетаскивание мышью графического объекта по форме?
Как создать объект PictureBox?
Для чего используют двойную буферизацию?
Методы, используемые при двойной буферизации. Как вывести изображение, как создать изображение?