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

ЖАНРЫ

Программирование мобильных устройств на платформе .NET Compact Framework
Шрифт:
Четырехминутный практикум по работе с графикой в .NET Compact Framework

В документации к .NET Framework и .NET Compact Framework содержится обширная информация по работе с графикой, с которой вам обязательно стоит ознакомиться. Ниже приведены лишь самые основные сведения.

Рабочей лошадкой графики в NET является объект System.Drawing.Graphics. Если вы знакомы с методами разработки приложений в собственных кодах Windows, считайте, что это — объектно-ориентированная версия hDC (Device Context, контекст устройства). Чтобы нарисовать что-либо (например, фигуру, линию, текст, растровое изображение) на поверхности битовой карты, ваш код должен вызвать соответствующий метод объекта Graphics. Не менее важно знать о том, что после того как вы закончите работать с созданным перед этим объектом Graphics, необходимо освободить память от этого объекта при помощи вызова функции Dispose, иначе он будет занимать драгоценные системные ресурсы. Для того чтобы постоянно держать под рукой какой-либо из объектов Graphics, у вас должны быть веские причины.

Если объект Graphics не создается, а передается, то обычно этот объект вам предоставляет вызывающая функция. В подобных случаях забота о том, чтобы освободить память от этого объекта с помощью метода Dispose, обычно лежит не на вашем коде; при вызове метода Dispose объекта, который все еще используется другим кодом, возникают проблемы. Наиболее распространенные ситуации, в которых объект Graphics передается другой функции, возникают, когда вы пишете обработчик Paint для нестандартного элемента управления или подключаетесь к обработчику Paint для формы или стандартного элемента управления. В этих случаях вы выполняете нужные операции рисования при помощи передаваемого вам объекта Graphics.

Перья (Pen), кисти (Brush), шрифты (Font), растровые изображения (Bitmap) также должны создаваться. Эти объекты не принадлежат какому-то одному объекту Graphics; одни и те же объекты могут использоваться различными объектами Graphics. Когда работа с этими объектами в вашем коде закончена, для них также необходимо вызывать метод Dispose. Тем не менее, в случае мобильных приложений использование глобальных объектов Pen, Brush, Font или Bitmap, если они часто используются, может оказаться полезным и эффективным. Производительность приложения можно значительно повысить, применяя тщательно продуманную стратегию кэширования объектов.

Для указания атрибутов рисования визуализируемых объектов используется класс ImageAttributes. Он передается при помощи перегруженных методов Graphics.DrawImage и позволяет вашему приложению устанавливать прозрачный цвет для битовых образов, копируемых на другую поверхность. Использование класса ImageAttributes на платформе .NET Compact Framework позволяет вашему приложению назначать один из цветов битового образа в качестве прозрачного; благодаря этому ваш код получает возможность визуализировать на битовых образах объекты, форма которых отличается от прямоугольной. Такая возможность оказывается очень полезной при написании игр. Как и в случае других классов, объекты ImageAttributes по окончании работы должны вызывать метод Dispose.

Способы интеграции графики с кодом пользовательского интерфейса

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

1. Отображение растровых изображений в элементе управления PictureBox.

2. Рисование непосредственно в форме.

3. Реализация пользовательских элементов управления.

Перечисленные способы описываются ниже с использованием иллюстративных примеров их применения.

Отображение растровых изображений в элементе управления PictureBox

Рисование графики на внеэкранных битовых картах и отображение полученных битовых образов в элементе PictureBox на форме является самым простым и наиболее мощным способом работы с пользовательской графикой. В силу своей простоты такой подход великолепно подходит для работы почти с любыми видами деловой графики и даже для многих игр.

Чтобы использовать этот подход, вашему приложению достаточно создать объект Bitmap и соответствующий ему объект Graphics, а затем использовать этот объект Graphics для рисования всего, что необходимо, на битовой карте, прежде чем назначить ее свойству Image элемента управления PictureBox. Элемент управления PictureBox позаботится обо всем остальном. Он проверяет, обновлено ли изображение на экране, и при необходимости перерисовывает его; если элемент управления PictureBox временно перекрывался, частично или полностью, другим элементом управления или окном, PictureBox самостоятельно перерисует его, когда он вновь окажется открытым. PictureBox осуществляет проверку того, что выводимое изображение идентично тому, которое хранится в битовой карте; предусматривать в приложении какую-либо дополнительную логику для этого не требуется.

В силу своей простоты такая методика прекрасно подходит для отображения графических данных, которые не претерпевают ежесекундных изменений. Он также обеспечивает достаточную эффективность, поскольку элементу управления PictureBox известно, когда он должен сам себя перерисовать. Элементы управления PictureBox могут предоставлять также некоторые события (например, Click), к которым ваше приложение может подключаться, что позволяет наделять их некоторой дополнительной интерактивностью, что делает этот подход еще более полезным

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

Рис. 11.5. Рисование на внеэкранной битовой карте и передача ее в элемент управления PiсtureBох

1. Начните новый проект Smart Device в Visual Studio .NET и выберите в качестве целевой платформы Pocket PC.

2. Добавьте в форму Form в окне конструктора форм элементы управления PictureBox и Button.

3. Дважды щелкните на кнопке Button1 в окне конструктора форм; в результате этого будет создан и подключен к кнопке приведенный ниже обработчик событий button1_Click. Введите приведенный в листинге 11.6 код, который реагирует на это событие.

4. Скомпилируйте пример и запустите его на выполнение. Щелкните на кнопке Button1.

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

Листинг 11.6. Создание изображения на внеэкранной растровой поверхности и передача его в элемент управления PictureBox

//--------------------------------------------------------------------

//Создать рисунок на растровой поверхности. Переслать его в PictureBox

//--------------------------------------------------------------------

private void button1_Click(object sender, System.EventArgs e) {

//Создать новую битовую карту

System.Drawing.Bitmap myBitmap;

myBitmap = new System.Drawing.Bitmap(pictureBox1.Width, pictureBox1.Height);

//--------------------------------------------------------------------------

//Создать объект Graphics, чтобы иметь возможность рисовать на битовой карте

//--------------------------------------------------------------------------

System.Drawing.Graphics myGfx;

myGfx = System.Drawing.Graphics.FromImage(myBitmap);

//Закрасить нашу битовую карту желтым цветом

myGfx.Clear(System.Drawing.Color.Yellow);

//Создать перо

System.Drawing.Pen myPen;

myPen = new System.Drawing.Pen(System.Drawing.Color.Blue);

//-----------------

//Нарисовать эллипс

//-----------------

myGfx.DrawEllipse(myPen, 0, 0, myBitmap.Width - 1, myBitmap.Height -1);

//Создать сплошную кисть

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