Лабораторная работа №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;
- Выполнить индивидуальное задание, полученное у преподавателя.
КОНТРОЛЬНЫЕ ВОПРОСЫ:
- Как вывести изображение в форму?
- Методы для настройки параметров изображения?
- Для чего используют двойную буферизацию?
- Методы, которые используются при двойной буферизации, как вывести изображение, как создать изображение?
- Как осуществить проверку попадания в прямоугольную область?
- Как осуществить проверку попадания в не прямоугольную область?
