Рисование линий и фигур

 

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

Контекст устройства в среде.NET инкапсулирован («завернут») в базовом классе System.Drawing.Graphics. Для создания объекта класса Graphics необходимо использовать метод CreateGraphics(), возвращающий ссылку на объект класса Graphics:

 

Graphics dc = CreateGraphics();

 

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

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

Рисование контуров прямоугольников осуществляется с помощью методов:

 

public void DrawRectangle(Pen pen, Rectangle rect);

public void DrawRectangle(Pen pen, int x, int y, int width, int height);

public void DrawRectangle(Pen pen, float x, float y, float width, float height);

 

Рисование контуров эллипсов осуществляется с помощью методов:

 

public void DrawEllipse (Pen pen, Rectangle rect);

public void DrawEllipse (Pen pen, int x, int y, int width, int height);

public void DrawEllipse (Pen pen, float x, float y, float width, float height);

 

Рисование закрашенных эллипсов и прямоугольников осуществляется с помощью методов:

 

public void FillEllipse(Brush brush, Rectangle rect);

public void FillEllipse(Brush brush, int x, int y, int width, int height);

public void FillEllipse(Brush brush, float x, float y, float width, float height);

public void FillRectangle(Brush brush, Rectangle rect);

public void FillRectangle(Brush brush, int x, int y, int width, int height);

public void FillRectangle(Brush brush, float x, float y, float width, float height);

 

Параметры методов означают следующее:

pen − перо;

brush − кисть;

rect − прямоугольник;

х − координата х левого верхнего угла прямоугольника;

y − координата у левого верхнего угла прямоугольника;

width − ширина прямоугольника;

height −высота прямоугольника;

 

Рисование линий осуществляется с помощью перегруженных методов:

 

public void DrawLine(Pen pen, Point pt1, Point pt2);

public void DrawLine(Pen pen, PointF pt1, PointF pt2);

public void DrawLine(Pen pen, int x1, int y1, int x2, int y2);

public void DrawLine(Pen pen, float x1, float y1, float x2, float y2);

 

Параметры методов означают следующее:

pen − перо;

pt1 − начальная точка рисования;

pt2 − конечная точка рисования;

х1 и у1 − координаты начальной точки рисования;

х2 и у2 − координаты конечной точки рисования;

 

Примеры использоания функций:

 

dc.DrawRectangle(Pens.OrangeRed,5,10,25,45);

dc.DrawEllipse(Pens.Magenta,100,125,20,15);

dc.FillEllipse(Brushes.BlueViolet,45,50,20,15);

dc.DrawLine(Pens.Green,20,40,60,70);

Рисование текста

 

Для рисования текста используют перегруженный метод DrawString. Рассмотрим два из шести перегруженных методов DrawString:

public void DrawString(string s, Font fnt, Brush br, PointF pt);

public void DrawString(string s, Font fnt, Brush br, RectangleF ltRct);

Параметры:

s –строка символов,

fnt – шрифт текста,

br – кисть,

pt – точка, определяющая координаты вывода текста,

ltRct – прямоугольник, внутри которого выводится текст, если же текст не вмещается в область прямоугольника, то он (текст) обрезается.

Например:

Font fnt = new Font("Arial",10); //Шрифт Arial, размер 10

dc.DrawString("Привет!",fnt, Brushes.Green,10,20);

 

Пример 1. Создадим приложение, которое при щелчке левой кнопкой мыши на окне приложения выводит в месте щелчка прямоугольник с текстом координатами левого верхнего угла прямоугольника, а при щелчке правой кнопкой мыши в месте щелчка выводится закрашенный эллипс.

Для этого создайте проект Windows Application. В окне свойств формы выбрать событие MouseDown, дважды щелкнуть на названии события мышкой. В появившейся заготовке метода-обработчика события вставить код, чтобы тело метода выглядело следующим образом:

 

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

Graphics dc = CreateGraphics();

Font fnt = new Font("Coyrier",10);

if(e.Button.ToString()== "Left")

{

dc.DrawRectangle(Pens.OrangeRed,e.X,e.Y,15,15);

dc.DrawString("X="+e.X.ToString()+" Y="+e.Y.ToString(),fnt,Brushes.Green,e.X,e.Y+20);

}

if(e.Button.ToString()== "Right")

{

dc.DrawEllipse(Pens.Magenta,e.X,e.Y,20,15);

dc.FillEllipse(Brushes.Blue,e.X,e.Y,20,15);

}

}

Скомпилируйте приложение. Проанализируйте полученные результаты.

 

Перерисовка окна приложения

 

Если свернуть окно приложения из предыдущего примера, затем вновь развернуть его, то мы, к сожалению, заметим, что изображение на поверхности окна исчезло. Операционная система не восстанавливает содержимого окна. Восстановлением графики и текста должно заниматься само приложение. Операционная система в необходимых случаях вырабатывает сообщение (событие Paint), которое «говорит», что окно приложения не корректно и его необходимо перерисовать. Перерисовка окна должна происходить по событию Paint. Метод-обработчик этого события имеет заголовок:

 

private void Form_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

 

Для этого метода нет необходимости создавать контекст устройства, он передается методу с помощью параметра e. Для получения контекста устройства необходимо выполнить следующую операцию:

 

Graphics dc = e.Graphics;

 

В теле этой функции необходимо выполнить все действия для перерисовки окна.

Очень часто перерисовка окна должна происходить в определенные моменты времени по инициативе приложения. Это бывает необходимо при выводе на экран анимации.

«Заставить» операционную систему выработать событие Paint можно путем вызова метода Invalidate(), который является членом класса System.Windows.Forms.Form. Существуют несколько перегруженных версий этого метода. Одна из них принимает в качестве параметра прямоугольник, который определяет область окна для перерисовки. Используемая нами версия без параметров перерисовывает все окно.

 

Пример 2.

Создадим приложение, в котором при запуске появляется прямоугольник, ширина которого увеличивается через каждые 150мс на 5 пикселей.

1. Объявим в классе Form1 переменную:

 

private int xWidth;

 

2. Создадим метод-обработчик события Paint, для этого в свойствах формы выберем событие Paint и щелкнем по нему. После редактирования тела метода, метод должен иметь вид:

 

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

Graphics dc = e.Graphics;

dc.DrawRectangle(Pens.RoyalBlue,10,100,xWidth,50);

}

 

3. Перенесем на форму Timer из Toolbox, затем в свойствах таймера установим свойство Enable в true и Interval в 150.

4. Далее двойным щелчком мыши по таймеру создаем метод-обработчик таймера. После редактирования тела метода, метод должен иметь вид:

 

private void timer1_Tick(object sender, System.EventArgs e)

{

xWidth += 5;

Invalidate();

}

Скомпилируйте приложение. Проанализируйте полученные результаты.

Вопросы:

1. Какой метод используется для «смещения» координат точки, прямоугольника?

2. Как определить находится ли точка или прямоугольник внутри другого прямоугольника?

3. С помощью какого метода можно найти пересечение прямоугольников?

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

5. С помощью экземпляров, какой структуры задается цвет?

6. Как создаются сплошные кисти, штриховые кисти?

7. Как создаются сплошные перья, штриховые перья?

8. Что означает Интернет цвет, Интернет кисть, Интернет перо?

9. Что собой представляет интерфейс графических устройств?

10. Что такое контекст устройства? Как он создается?

11. С помощью, каких методов контекста устройств осуществляется рисование линий?

12. С помощью, каких методов контекста устройств осуществляется рисование прямоугольников?

13. С помощью, каких методов контекста устройств осуществляется рисование эллипсов?

14. Как задать тип и размер шрифта текста?

15. Как можно нарисовать текст по заданным координатам, в заданном прямоугольнике?

16. Какая функция, обработчик события Paint, вызывается для перерисовки окна приложения?

17. С помощью вызова, какой функции можно инициализировать ОС для генерации события Paint?

Задание:

 

1. Создайте приложение, в котором по нажатию клавиши мыши в месте щелчка выводилось название нажатой клавиши мыши.

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

3. Создайте приложение, в котором выводился след движения мыши (использовать функцию рисования линии).

4. Создать приложение, в котором вводятся координаты окружности и меняются по нажатию кнопки.

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

6. Создать приложение, в котором прямоугольник увеличивается на пять пикселей при каждом щелчке правой кнопкой мыши и уменьшается при каждом щелчке левой кнопкой мыши на поверхности прямоугольника.

7. Создать приложение, в котором появляется маленький прямоугольник, который увеличивается (эффект наезда).

8. Создать приложение, в котором в момент создания формы появляются два прямоугольника равных размеров и координат, затем прямоугольники начинают разъезжаться по разным углам окна (по диагонали).

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

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


 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: