Чтение онлайн

ЖАНРЫ

Программирование КПК и смартфонов на .NET Compact Framework

Климов Александр Петрович

Шрифт:

Rectangle portion = new Rectangle(1, 1, 150, 25);

g.DrawImage(myBMP, 20, 220, portion, GraphicsUnit.Pixel);

Метод

FillRectangle
уже применялся при рассмотрении кистей. Метод
DrawRectangle
использует перо вместо кисти, поэтому на экран выводится незакрашенный прямоугольник.

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

DrawPolygon
и
FillPolygon
. В листинге 6.14
приведен код, который позволяет нарисовать простой ромб по указанным точкам.

Листинг 6.14

// Нарисуем ромб

// Зададим массив точек

Point[] arrPoint = {

 new Point(150, 50),

 new Point(200, 100),

 new Point(150, 150),

 new Point(100, 100),

 new Point(150, 50),

};

g.DrawPolygon(bluePen, arrPoint);

Если все рассмотренные ранее методы объединить в одно приложение и затем запустить его, то на экране устройства будет отображено несколько графических образов, как показано на рис. 6.1.

Рис. 6.1. Основные приемы работы с графикой

Создание собственных методов DrawPie и FillPie

В данный момент .NET Compact Framework не поддерживает графические методы

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

Листинг 6.15

///<summary>

///Рисуем закрашенный сектор

///Параметры функции

///g - Объект Graphics

///solidBrush - Кисть для закраски сегмента

///x,y - Координаты центра

///width - Ширина сегмента

///height - Высота сегмента

///startAngle - Значение начального угла

///endAngle - Значение конечного угла

///</summary>

private void FillPie(Graphics g, SolidBrush solidBrush, int x, int y,

 int width, int height, double startAngle, double endAngle) {

 double[] xAngle = new double[12];

 double[] yAngle = new double[12];

 double angleIncrement = (endAngle - startAngle) / 10;

 double angle = startAngle;

 for (int i = 0; i <= 10; i++) {

xAngle[i] = x + (Math.Cos(angle * (Math.PI / 180)) * (width / 2));

yAngle[i] = y + (Math.Sin(angle * (Math.PI / 180)) * (height / 2));

angle += angleIncrement;

 }

 xAngle[11] = x + (Math.Cos(endAngle * (Math.PI / 180)) * (width / 2));

 yAngle[11] = y + (Math.Sin(endAngle * (Math.PI / 180)) * (height / 2));

 Point[] anglePoints = {

new Point(x, y),

new Point((int)xAngle[0], (int)yAngle[0]),

new Point((int)xAngle[1], (int)yAngle[1]),

new Point((int)xAngle[2], (int)yAngle[2]),

new Point((int)xAngle[3], (int)yAngle[3]),

new Point((int)xAngle[4], (int)yAngle[4]),

new Point((int)xAngle[5], (int)yAngle[5]),

new Point((int)xAngle[6], (int)yAngle[6]),

new Point((int)xAngle[7], (int)yAngle[7]),

new Point((int)xAngle[8], (int)yAngle[8]),

new Point((int)xAngle[9], (int)yAngle[9]),

new Point((int)xAngle[10], (int)yAngle[10]),

new Point((int)xAngle[11], (int)yAngle[11])

 };

 g.FillPolygon(solidBrush, anglePoints);

}

///<summary>

///
Рисуем границы сектора

///g - Объект Graphics

///pen - Перо для рисования сегмента

///x,y - Центр сегмента

///width - Ширина сегмента

///height - Высота

///startAngle - Значение начального угла

///endAngle - Значение конечного угла

///</summary>

private void DrawPie(Graphics g, Pen pen, int x, int y,

 int width, int height, double startAngle, double endAngle) {

 double[] xAngle = new double[12];

 double[] yAngle = new double[12];

 double angleIncrement = (endAngle - startAngle) / 10;

 double angle = startAngle;

 for (int i = 0; i <= 10; i++) {

xAngle[i] = x + (Math.Cos(angle * (Math.PI / 180)) * (width /2));

yAngle[i] = y + (Math.Sin(angle * (Math.PI / 180)) * (height / 2));

angle += angleIncrement;

 }

 xAngle[11] = x + (Math.Cos(endAngle * (Math.PI / 180)) * (width / 2));

 yAngle[11] = y + (Math.Sin(endAngle * (Math.PI / 180)) * (height /2));

 Point[] anglePoints = {

new Point(x, y),

new Point((int)xAngle[0], (int)yAngle[0]),

new Point((int)xAngle[1], (int)yAngle[1]),

new Point((int)xAngle[2], (int)yAngle[2]),

new Point((int)xAngle[3], (int)yAngle[3]),

new Point((int)xAngle[4], (int)yAngle[4]),

Поделиться с друзьями: