- •15. Работа с графикой.
- •С точки зрения приложений интерфейс GDI состоит из контекста отображения (display context) и
- •Функции рисования GDI, входящие в программный интерфейс Win32 API, не имеют параметров, указывающих
- •Для этого внесём в класс Form1 дополнительное булевское поле и реализуем три обработчика:
- •Те же команды можно повторить для панели Panel1:
- •При рисовании подобным образом проявляется неприятный эффект – при перерисовке формы изображение не
- •Основные структуры данных
- •Структура Point
- •Структура Rectangle
- •В структуре определены два конструктора с аргументами:
- •Представление цвета
- •Для задания цвета можно также использовать один из перегруженных методов FromArgb:
- •Кисти и перья
- •В классе HatchBrush определены штриховые кисти. Их конструкторы:
- •Перья описываются классом System.Drawing.Pen.
- •Рисование линий и фигур
- •Класс Graphics содержит множество методов, позволяющих рисовать различные графические фигуры.
- •Параметры методов означают следующее:
- •Рисование линий осуществляется с помощью методов:
- •Вывод текста
- •Пример:
- •Перерисовка окна приложения
- •Очень часто перерисовка окна должна происходить в определенные моменты времени по инициативе приложения.
- •Пример:
- •4. Cоздадим метод-обработчик таймера: private void timer1_Tick(object sender,
- •Пример :
- •3. Далее опишем пользовательский метод DrawSheep(), рисующий фигуру:
- •4. Реализуем анимацию:
Вывод текста
Для вывода текста используют перегруженный метод DrawString.
DrawString(string s, Font font, Brush brush, PointF point);
DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle);
Параметры:
s –строка символов, font – шрифт текста,
brush – кисть для рисования символов,
point – точка, определяющая координаты вывода текста, x и y – задают координаты вывода текста layoutRectangle – ограничивающий прямоугольник.
Для вывода текста необходимо задать тип и размер шрифта, кисть и координаты текста.
Например:
Font fnt = new Font("Arial",10); //Шрифт Arial,
Пример:
Создадим приложение, которое при щелчке левой кнопкой мыши на окне приложения выводит в месте щелчка прямоугольник с текстом (координатами левого верхнего угла прямоугольника), а при щелчке правой кнопкой мыши в месте щелчка выводится закрашенный эллипс.
Для этого используем событие MouseDown :
Перерисовка окна приложения
Операционная система не восстанавливает при перерисовке содержимое окна. Восстановлением графики и текста должно заниматься само приложение. ОС в необходимых случаях вырабатывает сообщение (событие Paint), которое «говорит», что окно приложения не корректно и его необходимо перерисовать. Перерисовка окна должна происходить в обработчике этого события. Метод-обработчик этого события имеет заголовок:
Form_Paint(object sender, PaintEventArgs e)
Для этого метода не надо создавать контекст устройства, он передается методу с помощью параметра e. Для получения контекста устройства необходимо выполнить следующую
операцию:
Graphics dc = e.Graphics;
В теле этой функции необходимо выполнить все действия для
перерисовки окна.
Очень часто перерисовка окна должна происходить в определенные моменты времени по инициативе приложения. Это бывает необходимо, например, при выводе на экран анимации.
«Заставить» операционную систему выработать событие Paint можно путем вызова метода Invalidate(), который является
членом System.Windows.Forms.Form.
Существуют несколько перегруженных версий этого метода. Одна из них принимает в качестве параметра прямоугольник, который определяет область окна для перерисовки.
При вызове метода без параметров перерисовывается все окно.
Пример:
Создадим приложение, в котором прямоугольник через каждые 150 мс перемещается вправо на 5 пикселей.
1. Объявим в классе Form1 переменную: private int xLeft;
2. Создадим метод-обработчик события Paint для формы: private void Form1_Paint(object sender,
PaintEventArgs e)
{
Graphics dc = e.Graphics; dc.DrawRectangle(Pens.RoyalBlue, xLeft, 100,
50, 50);
}
3. Перенесем на форму Timer из Toolbox, затем в свойствах таймера установим свойство Enable в true и Interval в 150.
4. Cоздадим метод-обработчик таймера: private void timer1_Tick(object sender,
System.EventArgs e)
{
xLeft += 5; Invalidate();
}
Пример :
Создадим приложение, в котором изображение перемещается по форме по сложной траектории.
1. Объявим в классе Form1 переменные, отвечающие за положение фигуры и за текущее «время». Т.к. возможны дробные значения, то переменные объявляются вещественными:
float x0 = 230; float y0 = 180;
float t = 0;
2. Создадим метод-обработчик события Paint для формы: private void Form1_Paint(object sender,
PaintEventArgs e)
{
Graphics g = e.Graphics; DrawSheep(g, x0, y0, t);
}
3. Далее опишем пользовательский метод DrawSheep(), рисующий фигуру:
void DrawSheep(Graphics g, float x0, float y0, float t)
{ |
|
|
|
|
Pen p1 = new Pen(Color.Blue, |
2); |
|||
Pen p2 |
= new Pen(Color.Red, |
3); |
||
Pen p3 |
= |
new |
Pen(Color.Gray, |
4); |
Pen p4 |
= |
new |
Pen(Color.Black, 3); |
SolidBrush b1 = new SolidBrush(Color.Green);
g.FillEllipse(b1, x0, y0, 100, 50);
float xhead = x0 + 60; float yhead = y0 - 20;
g.DrawPolygon(p1, new PointF[]
{new PointF(xhead, yhead),
new PointF(xhead + 30, yhead +
30),
new PointF(xhead + 60, yhead) });
g.DrawEllipse(p2, x0 + 80, y0 - 12, 5, 5); g.DrawEllipse(p2, x0 + 95, y0 - 12, 5, 5);
g.DrawArc(p3, x0 + 20, y0 - 45, 50, 50, 0, -90); g.DrawArc(p3, x0 + 60, y0 - 45, 50, 50, 0, -90);
float ylegs = y0 + 42;
float xlegs = x0 + 10; g.DrawLines(p4, new PointF[] {
new PointF(xlegs, ylegs),
new PointF(xlegs + 20 * (1 - t), ylegs
+ 20),
new PointF(xlegs, ylegs + 40) });
xlegs = xlegs + 20; g.DrawLines(p4, new PointF[] {
new PointF(xlegs, ylegs),
new PointF(xlegs + 20 * (1 - t), ylegs
+ 20),
new PointF(xlegs, ylegs + 40) });
xlegs = xlegs + 40; g.DrawLines(p4, new PointF[] {
new PointF(xlegs, ylegs),
new PointF(xlegs + 20 * (1 - t), ylegs
+ 20),
new PointF(xlegs, ylegs + 40) });
xlegs = xlegs + 20; g.DrawLines(p4, new PointF[] {
new PointF(xlegs, ylegs),
new PointF(xlegs + 20 * (1 - t), ylegs
+ 20),
new PointF(xlegs, ylegs + 40) });
g.DrawArc(p4, x0 - 25, y0 + 12,
}