Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре
Шрифт:
Интервал:
Закладка:
Способы интеграции графики с кодом пользовательского интерфейса
Существует несколько способов интеграции низкоуровневого графического кода с высокоуровневым кодом пользовательского интерфейса. Очень важно выбрать такой способ, который лучше всего соответствует характеру задач, стоящих перед вашим приложением. Тремя наиболее распространенными способами сопряжения кодов графики и пользовательского интерфейса являются следующие:
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);
//Создать сплошную кисть
System.Drawing.Brush myBrush;
//-----------------------
//Нарисовать текст кистью
//-----------------------
myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
//Примечание: Мы используем объект Font из формы
myGfx.DrawString("Hello!",this.Font, myBrush, 2, 10);
//------------------------------
//Важно! Очистить все после себя
//------------------------------
myGfx.Dispose();
myPen.Dispose();
myBrush.Dispose();
//-------------------------------------------------------------------
//Указать объекту pictureBox, на необходимость отображения растрового
//изображения, которое мы только что создали и нарисовали.
//-------------------------------------------------------------------
pictureBox1.Image = myBitmap;
}
Рисование непосредственно в формеДля рисования в форме существует два способа:
1. Создайте объект Graphics для формы и используйте этот объект для создания нужных рисунков.
2. Подключитесь к функции OnPaint() для формы и получите объект Graphics, который можно будет использовать для рисования.
Создание объекта Graphics для формы и рисование на нем обычно применяются лишь изредка, поскольку в этом случае любой созданный вами рисунок не существует постоянно. Форма с удовольствием предоставит вашему приложению свою поверхность для рисования всего, что вам заблагорассудится, но не будет запоминать нарисованное. Это означает, что если форма по какой-либо причине будет перерисована, то все, что нарисовал ваш код, исчезнет. Поэтому данный метод не годится для графики, которую вы хотите сохранять на экране в течение длительных периодов времени. Так, описанный способ плохо подходит для вычерчивания диаграмм, которые пользователь будет просматривать на своем мобильном устройстве, поскольку ваше приложение не в состоянии контролировать, когда именно отображаемая картинка будет частично или полностью перекрыта другим изображением. Вместе с тем, данный метод может оказаться полезным в тех случаях, когда все экранное изображение все время полностью перерисовывается, как это происходит, например, в играх. Если изображение перерисовывается несколько раз в секунду, то не имеет никакого значения, является ли оно постоянно существующим или нет.
Эта методика рисования проиллюстрирована в листинге 11.7. Для создания и запуска данного приложения необходимо выполнить следующие действия:
1. Начните новый проект Smart Device в Visual Studio .NET и выберите в качестве целевой платформы Pocket PC.
2. Добавьте в форму Form кнопку Button.
3. Дважды щелкните на кнопке Button1 в окне конструктора форм; в результате этого будет создан и подключен к кнопке приведенный ниже обработчик событий button1_Click. Введите приведенный в листинге 11.7 код, который реагирует на это событие.
4. Скомпилируйте пример и запустите его на выполнение. Щелкните на кнопке Button1.
Листинг 11.7. Создание объекта Graphics для формы//----------------------------------------------------------
//Создает объект Graphics для формы и осуществляет рисование
//----------------------------------------------------------
private void button1_Click(object sender, System.EventArgs e) {
//Создать объект Graphics для формы
System.Drawing.Graphics myGfx;
myGfx = this.CreateGraphics();
//Создать кисть
System.Drawing.Brush myBrush;
myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.DarkGreen);
//Заполнить прямоугольник