Александр Климов - Программирование КПК и смартфонов на .NET Compact Framework
- Название:Программирование КПК и смартфонов на .NET Compact Framework
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:978-5-91180-270-7
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Александр Климов - Программирование КПК и смартфонов на .NET Compact Framework краткое содержание
Мобильные устройства все активнее вторгаются в нашу жизнь. Карманные компьютеры и смартфоны давно утратили статус дорогих игрушек и перекочевали в разряд необходимых устройств. Значит, для них необходимо создавать программное обеспечение. Так почему вы должны оставаться в стороне?
Прочитав эту книгу, вы получите знания, которые позволят вам уверенно создавать программы для карманных компьютеров и смартфонов. А огромное количество разнообразных примеров поможет быстро совершенствоваться и развиваться, обогащая свой опыт работы.
Книга предназначена для начинающих программистов.
Программирование КПК и смартфонов на .NET Compact Framework - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Bitmap bmp = new Bitmap(150, 90);
Graphics g = Graphics.FromImage(bmp);
Метод OnPaint
класса Form
получает в качестве параметра объект PaintEventArgs
. Одним из членов данного объекта является объект Graphics
, связанный с формой. Переопределяя метод OnPaint
класса Form
, можно получить доступ к объекту Graphics
из параметра PaintEventArgs
, после чего можно работать с графикой в клиентской области формы. Вызов этого метода показан в листинге 6.11.
Protected override void OnPaint(PaintEventArgs e) {
Graphics g = e.Graphics;
}
Получив любым из перечисленных способов доступ к объекту Graphics
, программист может рисовать фигуры, линии, кривые, изображения и текст при помощи различных методов. Самые распространенные графические методы будут рассмотрены в этом разделе главы.
Метод DrawImage
рисует заданный объект Image
в указанной позиции экрана. Всего существует четыре перегруженные версии метода. Но в самой простой его версии достаточно указать координаты выводимой картинки, как показано в листинге 6.12.
g.DrawImage(myImage, 10, 10);
С помощью метода DrawImage
можно выводить на экран не все изображение, а только его часть. В этом случае надо указать размеры прямоугольника, который определяет размеры выводимой области картинки, как показано в листинге 6.13. В примере используется перечисление GraphicsUnit.Pixel
, которое позволяет указывать единицы измерения.
Bitmap myBMP = new Bitmap(@"\windows\banner.gif");
Rectangle portion = new Rectangle(1, 1, 150, 25);
g.DrawImage(myBMP, 20, 220, portion, GraphicsUnit.Pixel);
Метод FillRectangle
уже применялся при рассмотрении кистей. Метод DrawRectangle
использует перо вместо кисти, поэтому на экран выводится незакрашенный прямоугольник.
Чтобы нарисовать достаточно сложную фигуру, можно задать массив точек и соединить их прямыми отрезками, после чего можно закрасить получившуюся фигуру. Для этого разработчик может использовать методы DrawPolygon
и FillPolygon
. В листинге 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.
///
///Рисуем закрашенный сектор
///Параметры функции
///g - Объект Graphics
///solidBrush - Кисть для закраски сегмента
///x,y - Координаты центра
///width - Ширина сегмента
///height - Высота сегмента
///startAngle - Значение начального угла
///endAngle - Значение конечного угла
///
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);
}
///
/// Рисуем границы сектора
///g - Объект Graphics
///pen - Перо для рисования сегмента
///x,y - Центр сегмента
///width - Ширина сегмента
///height - Высота
///startAngle - Значение начального угла
///endAngle - Значение конечного угла
///
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]),
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.DrawPolygon(pen, anglePoints);
}
private void Form1_Paint(object sender, PaintEventArgs e) {
// Выводим несколько секторов на экран
DrawPie(e.Graphics, new Pen(Color.Red), 130, 165, 100, 100, 0, 45);
FillPie(e.Graphics, new SolidBrush(Color.Green),
120, 160, 100, 100, 46, 90);
FillPie(e.Graphics, new SolidBrush(Color.Yellow),
120, 160, 100, 100, 91, 120);
FillPie(e.Graphics, new SolidBrush(Color.Blue),
120, 160, 100, 100, 121, 260);
FillPie(e.Graphics, new SolidBrush(Color.Red),
120, 160, 100, 100, 261, 360);
}
Результат работы этой программы показан на рис. 6.2.

Рис. 6.2. Создание секторов
Создание фонового рисунка для формы
К сожалению, .NET Compact Framework не поддерживает свойство BackgroundImage
, которое создает фоновый рисунок для формы. Но каждый программист может восполнить данный пробел, переопределяя метод OnPaint
.
Нужно создать новый проект и разместить на форме какой-нибудь элемент управления, например кнопку. Кнопка не будет выполнять никаких функций. Она потребуется лишь для демонстрации технологии. Также надо добавить в проект изображение, которое будет использоваться в качестве фона для формы. В нашем примере картинка будет внедрена в программу как ресурс, хотя можно загрузить ее из обычного графического файла. Чтобы все работало так, как запланировано, необходимо переопределить метод OnPaint()
. Новый код метода приведен в листинге 6.16.
Интервал:
Закладка: