Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре
Шрифт:
Интервал:
Закладка:
//Задать родительский объект
m_filteredTextBox.Parent =this;
//Выделить элемент управления
m_filteredTextBox.Focus();
//Сделать данную кнопку недоступной, чтобы поверх данного объекта
//не был создан второй объект
SocialSecurityTextBox button1.Enabled = false;
}
//----------------------------------------------------------------
//ОБРАБОТЧИК СОБЫТИЙ: Этот обработчик подключается динамически при
// создании элемента управления
//----------------------------------------------------------------
private void textBox_TextChanged(object sender, System.EventArgs e) {
if (m_filteredTextBox.IsFullValidInput == true) {
label1.Text = "FULL SOCIAL SECURITY NUMBER!!!";
} else {
label1.Text = "Not full input yet...";
}
}
Использование прозрачных областей растровых изображений
Растровые изображения с масками прозрачности полезны по многим причинам. При написании игр растровые изображения с областями прозрачности могут использоваться разработчиками для вывода на экран игрового поля и перемещения по нему изображений, форма которых не является прямоугольной. В картографических приложениях растровые изображения с масками прозрачности могут использоваться для вывода изображений поверх карт, генерируемых другими источниками; в качестве хорошего примера можно привести отображения на карте маркера, отмечающего текущее местоположение объекта. Наконец, встраивание изображений непрямоугольной формы в другую графику может с успехом использоваться для создания привлекательных пользовательских интерфейсов и бизнес-графики.
Растровые изображения, или битовые образы, являются, по сути, двумерными массивами целых чисел, где каждое число представляет цвет пикселя в определенной точке. В силу этого растровые изображения по самой своей природе имеют прямоугольную форму. Представление не являющегося прямоугольным изображения на прямоугольной битовой карте можно обеспечить, объявляя один цвет фоновым и заполняя пиксели, лежащие за пределами интересующего нас непрямоугольного изображения, этим цветом. Работа с правильными прямоугольными массивами обладает целым рядом преимуществ, не самым последним из которых является легкость копирования части одного изображения на часть другого; в случае прямоугольных областей для этого требуются самые простые алгоритмы. В результате копирования прямоугольной части одного растрового изображения на другое происходит простая замена информации об изображении, относящейся к соответствующей прямоугольной области. Это означает, что прямоугольные битовые карты, содержащие непрямоугольные изображения с единственным цветом фона, копируются в место назначения в виде непрозрачных прямоугольников изображений переднего и заднего планов. Результат выглядит совсем не привлекательно. В качестве альтернативного решения можно исходить из фонового изображения и создать на нем рисунок всех непрямоугольных изображений, используя функции рисования (например, DrawLine(), FillCircle()) или устанавливая пиксельные данные по одному пикселю за один раз. Оба эти способа приводят к хорошим визуальным результатам, но работают медленно и требуют написания сложных функций. Что нам необходимо сделать — так это скопировать одно растровое изображения на другое, не копируя фоновый цвет.
На рис. 13.10 представлено простое растровое изображение для игры; битовая карта является прямоугольной, но само изображение, которое мы хотим нарисовать — нет. Чтобы нарисовать это изображение без его прямоугольного фона, мы должны сообщить функции, осуществляющей копирование, о том, что копировать пиксели, цвет которых совпадает с установленным нами фоновым цветом, не следует. В .NET Compact Framework это достигается за счет использования класса ImageAttributes.
Класс ImageAttributes имеет метод SetColorKey(), используя который ваш код может устанавливать цвет маскирования. Указанный класс может передаваться в качестве параметра в одну из перегруженных версий функции Graphics.DrawImage(); получение этого параметра поддерживается только одной из перегруженных версий этой функции.
Функция DrawImage() получает в качестве параметров исходную битовую карту изображения, которое мы хотим копировать, размеры и местоположения областей, из которых и в которые должно осуществляться копирование, и объект ImageAttributes, указывающий, какая цветовая маска будет определять прозрачность в исходном изображении. Далее, на битовую карту назначения копируется информация обо всех пикселях исходного растрового изображения за исключением тех, цвет которых согласуется с цветом маски, определенным в объекте ImageAttributes.
Пиксели исходного растрового изображения, которые имеют тот же цвет, что и маска, не копируются. Благодаря этому существовавшие до этого пиксели изображения назначения "проступают" сквозь прозрачные области той битовой карты, которую мы копируем. Такая операция копирования выполняется медленнее, чем простое копирование прямоугольного изображения, но все же достаточно быстро, что делает этот вариант привлекательным при работе с непрямоугольными изображениями.
Рис. 13.10. Простое растровое изображение с передним планом непрямоугольной формы и одноцветным фоном
Если известно, что необходимость в рисунках возникнет вновь или будет возникать регулярно, то имеет смысл глобально кэшировать объект ImageAttributes, который может использоваться по всему приложению в вашем коде рисования изображений неправильной формы с прозрачным фоном; это избавит вас от необходимости многократно распределять память для объектов ImageAttributes, а затем освобождать ее, и избавит от накопления "мусора" в памяти вашего приложения.
Пример использования растровых изображений с областями прозрачностиНа рис. 13.11 показан пример того, как использование прозрачных областей дает возможность получать изображения, отвечающие повышенным запросам. На первом из снимков представлено изображение заднего плана. В данном случае оно состоит из черного текста на белом фоне. На втором снимке представлено другое изображение, в качестве которого используются графические объекты в виде синего фона с нарисованными поверх него прямоугольником и двумя эллипсами желтого цвета. На третьем снимке показано второе изображение, нарисованное поверх первого, но с использованием желтого цвета в качестве прозрачного. Результат таков, что когда второе изображение копируется на первое, то все пиксели желтого цвета не копируются, в результате чего исходные пиксели первого изображения, находящиеся в соответствующих позициях, видны в конечном изображении.
Рис. 13.11. Приложение, иллюстрирующее процесс рисования с использованием прозрачного фона
Приложение, представленное на рис. 13.11, можно создать с помощью кода, приведенного в листинге 13.5. Для создания и запуска приложения потребуется выполнить перечисленные ниже действия:
1. Запустите Visual Studio .NET (2003 или более позднюю версию) и выберите в качестве типа приложения C# Smart Device Application.
2. Выберите в качестве целевой платформы Pocket PC. (Для вас будет автоматически создан проект, и на экране появится окно конструктора форм Pocket PC.)
3. Добавьте в форму элемент управления Button (ему будет присвоено имя button1) и переименуйте его в buttonDrawBackground.
4. Дважды щелкните на кнопке в окне конструктора форм и введите для нее код функции buttonDrawBackground_Click(), листинг которой приводится ниже.
5. Добавьте в форму элемент управления Button и переименуйте его в buttonDrawForeground.
6. Дважды щелкните на кнопке в окне конструктора форм и введите для нее код функции buttonDrawForeground_Click(), листинг которой приводится ниже.
7. Вернитесь к форме Form1 в окне конструктора форм.
8. Добавьте в форму элемент управления Button и переименуйте его в buttonDrawBackgroundPlusForeground.
9. Дважды щелкните на кнопке в окне конструктора форм и введите для нее код функции buttonDrawBackgroundPlusForeground_Click(), листинг которой приводится ниже.
10. Введите оставшуюся часть кода, приведенного в листинге ниже.
11. Вернитесь в окно конструктора форм.
12. Установите для свойства MinimizeBox формы значение false. Благодаря этому во время выполнения в верхней правой части формы появится кнопка OK, с помощью которой вы легко сможете закрыть форму и выйти из приложения. Эта возможность оказывается очень полезной при многократном тестировании приложения
13. Полученные вами результаты должны воспроизводить те, которые показаны на рис. 13.11.
Дополнительные эффекты с использованием прозрачных изображенийВыбор желтого цвета в качестве прозрачного был сделан совершенно произвольно. Точно так же в качестве прозрачного цвета можно было выбрать синий цвет и позволить скопироваться в изображении переднего плана всему, что имеет желтый цвет, а синий цвет трактовать как прозрачный. Кроме того, не сложно поменять местами битовые карты переднего и заднего планов, сделав желтые и синие прямоугольники и эллипсы задним планом, а черный и белый текст — передним; в этом случае нам потребовалось бы выбрать в качестве прозрачного черный или белый цвет, и, в зависимости от нашего решения, прозрачными были бы либо текст, либо его фон. Прозрачность — мощная штука, и ее можно с большим успехом применять в растровых изображениях самых различных видов.