Средства для создания и вывода динамических изображений


Лабораторная работа №5

Тема: «Средства для создания и вывода динамических изображений»

Проверка попадания в непрямоугольные области

Например, предположим, что необходимо по щелчку пользователя выделять красным контуром фигуру, которая представляет собой непрямоугольную область.

Например, фигура создана с помощью экземпляра объекта GraphicsPath, пространства имен System.Drawing.Drawing2D. Объект GraphicsPath инкапсулирует набор связанных прямых и кривых линий, строк и т. п. Добавление новых элементов в объект GraphicsPath производится при помощи многочисленных методов Add, представленных в таблице.

 

Таблица 3. Методы Add класса GraphicsPath

Метод Назначение
AddArc() Добавляет в создаваемую фигуру дугу — сегмент эллипса
AddClosedCurve() Добавляет замкнутую кривую
AddCurve() Добавляет кривую
AddEllipse Добавляет эллипс
AddLine(),AddLines Добавляют прямую линию (несколько прямых линий)
AddPath() Добавляет указанный объект GraphicsPath
AddPie Добавляет сегмент эллипса, образованный дугой эллипса и двумя радиальными линиями
AddPolygon() Добавляет многоугольник
AddRectangle() Добавляют прямоугольник
AddString() Добавляет текстовую строку

Добавим в приложение объект GraphicsPath. Добавление в этот объект элементов будет производиться в конструкторе формы:

public partial class Form1 : Form

{

// Создаем объект GraphicsPath

GraphicsPath myPath = new GraphicsPath();

public Form1()

{

InitializeComponent();

// Добавляем в объект GraphicsPath элементы, из которых он будет состоять

myPath.StartFigure();

myPath.AddLine(new Point(160, 10), new Point(140, 150));

myPath.AddArc(260, 200, 150, 150, 0, 90);

myPath.CloseFigure();

}

Метод StartFigure( ) сигнализирует о том, что мы начинаем процедуру добавления новых элементов в объект GraphicsPath, а метод CloseFigure( ) — об окончании этой процедуры. Если создаваемая при помощи объекта GraphicsPath фигура состоит из непрерывных линий, то метод CloseFigure ( ) соединяет начальную и конечную точку фигуры.

Для проверки попадания в область, получаем координаты указателя мыши при помощи обработчика события MouseDown. Далее сравниваем эти координаты с областью, занимаемой объектом GraphicsPath, при помощи метода GraphicsPath . IsVisible (точно такой же метод можно использовать и для объекта Region):

private void Form1_MouseDown(object sender, MouseEventArgs e){                 Добавьте, еще одно условие …..

if (myPath.IsVisible(mousePt))

{

isImageclicked = true;

imag = 3;

this.Text = «Вы кликнули на необычной фигуре»;

}

Внесите изменения в обработчик события Paint:

private void Form1_Paint(object sender, PaintEventArgs e)

{ Graphics g = e.Graphics;

g.FillPath(Brushes.DarkCyan, myPath );

……..

if (imag==3)

g.DrawPath(outline, myPath);

Запустите приложение. Результат программы представлен на рисунке 1.

рисунок 1.

Рассмотрим пример приложения, которое содержит форму c именем ButtonToMove  с кнопкой, по нажатию на которую начинают движение три красных шарика.

Создайте новое приложение. Добавьте на форму объект Button с панели Toolbox. В окне свойств для кнопки установите следующие значения:

Имя свойства Значение
Text Движение
Location 5;5

Дважды щелкните по кнопке для открытия программного кода измените процедуру, которая будет реализована в случае нажатия кнопки

private void button1_Click(object sender, EventArgs e)

{

Graphics g = Graphics.FromHwnd(this.Handle);

Brush red = new SolidBrush(Color.Red);

while (y <= 250)

{

x += 5;

y += 5;

g.Clear(Color.White);

g.FillEllipse(red, x, y, 20, 20);

g.FillEllipse(red, 50, y, 20, 20);

g.FillEllipse(red, x, 50, 20, 20);

Thread.Sleep(300);//задержка на 300 миллисекунд добавьте using System. Threading;

}

}

Добавьте объвление переменных

private int x = 50, y = 50; //объявление переменных

public Form1()

{ ….

Двойная буферизация.

Часто встречающейся проблемой при создании динамично меняющейся графики (и, в частности, анимации) является мерцание. Для его устранения традиционно использовался закадровый буфер, и эта возможность также имеется в GDI+. Объект Graphics можно создать «теневым», используя в качестве основы готовый экземпляр Bitmap.

Способ уменьшения мерцания – использовать двойную буферизацию вывода – когда изображение сначала готовится «за кадром», а затем переносится на экран, устраняя мерцание при анимации:

Рассмотрим пример вывода с двойной буферизацией в GDI+ :

using System.Threading;//добавляем для использования задержки

using System.Collections;//для использования методов вывода изображений

Добавьте метод Paint

private void Form1_Paint(object sender, PaintEventArgs e)

{//Graphics g = e.Graphics;

Graphics displayGraphics = e.Graphics;

int k=0;

while(k <300)

{          Pen p = new Pen(Color.Red);

SolidBrush b= new SolidBrush(Color.Yellow);

SolidBrush b1= new SolidBrush(Color.Green);

//создаем объект — изображение, которое будет включать все, что нарисовано на //форме

Image i = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);

Graphics g = Graphics.FromImage(i);

g.Clear(Color.Aqua);

Thread.Sleep(300);//задержка на 300 миллисекунд

g.FillEllipse(b,k,150,30,30);

g.FillEllipse(b1,k+5,160,5,5);

g.FillEllipse(b1,k+20,160,5,5);

g.DrawArc(p,k+5,165,20,10,0,180);

g.FillRectangle(b1,0,180,300,100);

k=k+10;

b.Dispose();//уничтожаем кисть

b1.Dispose();

//выводим на форму, созданное изображение

displayGraphics.DrawImage(i, ClientRectangle);

i.Dispose();//уничтожаем изображение

}

}

}

Для сравнения закомментируйте строки выделенные красным цветом и снимите комментарий со строки:  Graphics g = e.Graphics;

  1. Выполнить индивидуальное задание, полученное у преподавателя.

КОНТРОЛЬНЫЕ ВОПРОСЫ:

  1. Как вывести изображение в форму?
  2. Методы для настройки параметров изображения?
  3. Для чего используют двойную буферизацию?
  4. Методы, которые используются при двойной буферизации, как вывести изображение, как создать изображение?
  5. Как осуществить проверку попадания в прямоугольную область?
  6. Как осуществить проверку попадания в  не прямоугольную область?