- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование КПК и смартфонов на .NET Compact Framework - Александр Климов
Шрифт:
Интервал:
Закладка:
private void butGetEmail_Click(object sender, EventArgs e) {
//Получим email владельца устройства
lblOwnerEmail.Text = SystemState.OwnerEmail;
}
Да, с помощью этого кода можно получить интересующие данные, но в этом случае нельзя узнать, когда эти данные изменятся. Придется через определенные промежутки времени проверять, не изменился ли адрес у владельца устройства.
Но стоит вернуться к примеру уведомления об изменении электронного адреса владельца устройства. Отслеживанием изменений в системе занимается класс SystemState. Данный класс содержит множество статичных свойств для получения различных настроек системы. Но кроме этого класс SystemState содержит очень важное событие Changed. Для обработки данного события нужно сначала создать экземпляр класса SystemState и передать ему соответствующее свойство:
sysState = new SystemState(SystemProperty.OwnerEmail, true);
Затем нужно присоединить делегат к новому экземпляру события Changed:
sysState.Changed += new ChangeEventHandler(sysState_Changed);
А уже после этого можно перехватывать изменение состояния нужных параметров:
private void sysState_Changed(object sender, ChangeEventArgs args) {
lblOwnerEmail.Text = SystemState.OwnerEmail;
}
Пример с электронным адресом был приведен лишь для ознакомления. На самом деле, с помощью соответствующих свойств можно получить доступ более чем к ста системным настройкам. Наиболее внимательные читатели могут заметить, что State и Notifications Broker порой дублируют функциональность, которую можно воспроизвести при помощи других средств. Например, текущую ориентацию экрана можно узнать с помощью функции API GetSystemMetrics или с помощью вызова Screen.PrimaryScreen.Bounds. А информацию о заряде батареи можно узнать с помощью функции GetSystemPowerStatusEx.
Но зачем понадобилось создавать еще одну дополнительную возможность извлечения информации? Причин для такого шага было несколько. Прежде всего, новые возможности удобны и просты. В предыдущем примере было показано, что для получения электронного адреса владельца устройства достаточно вызвать одно соответствующее свойство. Для получения других значений также вызываются соответствующие свойства. Причем названия этих свойств говорят сами за себя и не требуют наличия под рукой справочной литературы.
Для закрепления материала нужно дополнить программу еще несколькими примерами получения различных свойств. Можно добавить отображение уровня заряда батареи, текущего состояния батареи, наличия радиоприемника и фотокамеры, названия сотового оператора и определение текущей ориентации экрана. Все это делает код, приведенный в листинге 10.15.
Листинг 10.15private void butGetInfo_Click(object sender, EventArgs e) {
lstInfo.Items.Add("Название оператора: " + SystemState.PhoneOperatorName);
lstInfo.Items.Add("Наличие радио: " + SystemState.PhoneRadioPresent);
lstInfo.Items.Add("Наличие камеры: " + SystemState.CameraPresent);
lstInfo.Items.Add("Ориентация экрана " + SystemState.DisplayRotation);
}
private void butBattery_Click(object sender, EventArgs e) {
// Уровень заряда батареи
BatteryLevel batteryLevel = SystemState.PowerBatteryStrength;
BatteryState batteryState = SystemState.PowerBatteryState;
string strBatteryLevel = "Уровень заряда";
switch (batteryLevel) {
case BatteryLevel.VeryLow:
strBatteryLevel = "Уровень заряда: Очень низкий (0-20%)";
break;
case BatteryLevel.Low:
strBatteryLevel = "Уровень заряда: Низкий (21-40%)";
break;
case BatteryLevel.Medium:
strBatteryLevel = "Уровень заряда: Средний (41-60%)";
break:
case BatteryLevel.High:
strBatteryLevel = "Уровень заряда: Высокий (61-80%)";
break;
case BatteryLevel.VeryHigh:
strBatteryLevel = "Уровень заряда: Очень высокий (81-100%)";
break;
}
// Состояние батареи
string strBatteryState = "Состояние батареи: ";
if ((batteryState & BatteryState.Normal) == BatteryState.Normal)
strBatteryState += "Нормальное";
if ((batteryState & BatteryState.NotPresent) == BatteryState.NotPresent)
strBatteryState += "Батарея отсутствует ";
if ((batteryState & BatteryState.Charging) == BatteryState.Charging)
strBatteryState += "Заряжается ";
if ((batteryState & BatteryState.Low) == BatteryState.Low)
strBatteryState += "Низкий заряд ";
if ((batteryState & BatteryState.Critical) == BatteryState.Critical)
strBatteryState += "Критическое";
MessageBox.Show(strBatteryLevel + "n" + strBatteryState);
}
Мультимедиа
Система Windows Mobile 5.0 обеспечивает еще более глубокую поддержку мультимедиа, чем предыдущие версии операционных систем. Теперь разработчики имеют возможность напрямую работать с фотокамерой, встраивая в свои программы взаимодействие с камерой и обработку картинок и видеороликов. Технология Microsoft DirectShow дает возможность управлять потоковыми мультимедийными материалами. Программа Microsoft Windows Media Player 10 Mobile позволяет интегрировать функциональность музыкального плеера в собственные приложения. Технология Microsoft DirectDraw предоставляет доступ к графической системе на более высоком уровне, а библиотека Microsoft Direct3D позволяет создавать очень сложные динамические игры, используя управляемый код. Эти возможности стоит рассмотреть подробнее.
Выбор изображения
В операционной системе Windows Mobile 5.0 стало поразительно легко работать с коллекцией фотографий и рисунков. При помощи стандартного диалогового окна выбора рисунка можно легко выбрать нужный рисунок. Доступ к стандартному окну выбора рисунка осуществляется при помощи класса Microsoft.WindowsMobile.Forms.SelectPictureDialog.
Но лучше работу с диалоговым окном выбора картинки рассмотреть на примере. На форме надо разместить метку lblSelectedPicture и графическое поле picSelectImage. Не забудьте перед началом создания приложения установить ссылку на пространство имен Microsoft.WindowsMobile.Forms. Соответствующий код приведен в листинге 10.16.
Листинг 10.16private void butSelectPicture_Click(object sender, EventArgs e) {
SelectPictureDialog selectPictureDialog = new SelectPictureDialog();
// Задаем фильтр
selectPictureDialog.Filter = "Рисунки(*.BMP;*.JPG)|*.BMP;*.JPG";
// Задаем папку для обзора
selectPictureDialog.InitialDirectory = Windows";
// Заголовок для диалогового окна
selectPictureDialog.Title = "Выберите рисунок";
if (selectPictureDialog.ShowDialog() = DialogResult.OK &&
selectPictureDialog.FileName.Length > 0) {
// Получим расширение выбранного файла
string fileExtension = Path.GetExtension(selectPictureDialog.FileName);
// Выводим путь выбранного файла
lblSelectedPicture.Text = "Выбранный файл: " +
selectPictureDialog.FileName;
// Если выбран файл JPG, то выводим на экран
if (fileExtension.ToLower() == ".jpg")
picSelectedImage.Image = new Bitmap(selectPictureDialog.FileName);
}
}
В начале работы создается объект SelectPictureDialog, а затем для него задаются нужные свойства. С помощью свойства Filter ограничивается выбор файлов. Пользователь может загружать изображения с расширениями .BMP и .JPG. Затем указывается стартовая папка. Строго говоря, в Windows Mobile для хранения картинок используется папка Мои картинки. Но приложение, работающее с изображениями, может использовать свою собственную папку.
Рис. 10.11. Выбор изображения
Потом в заголовке диалогового окна выводится текст, поясняющий пользователю дальнейшие действия. Это был минимально необходимый при использовании класса SelectPictureDialog код.
Если пользователь выбрал картинку и нажал на кнопку OK, то надо распознать выбранный файл. С помощью метода Path.GetExtension можно получить расширение файла. В текстовой метке lblSelectedPicture отображается полный путь к выбранному файлу, а в графическом поле picSelectedImage размещается сама картинка. Но для этого она должна иметь расширение .JPG (рис. 10.11).
Следует обратить внимание на то, что диалоговое окно выбора рисунка позволяет выбирать картинки из любой папки устройства.
Работа с фотокамерой
Мобильные устройства все чаще снабжаются фотокамерами. Причем многие пользователи отсутствие камеры на смартфоне считают очень большим недостатком. Система Windows Mobile 5.0 предлагает поддержку работы с камерой, чтобы разработчики могли использовать ее возможности в своих приложениях.
Диалоговое окно захвата изображения позволяет интегрировать фотографии и видеоматериал в приложения. При этом разработчик получает возможность управлять поведением камеры. Доступ к возможностям камеры осуществляется при помощи класса Microsoft.WindowsMobile.Forms.CameraCaptureDialog. Класс CameraCaptureDialog очень похож на класс SelectPictureDialog.
Свойство Mode позволяет управлять режимом съемки. Камера может работать, как обычный фотоаппарат, что задается значением CameraCaptureMode.Still, или записывать видеоролик. Диалоговое окно вызывается методом ShowDialog, который возвращает значение, показывающее, как было закрыто окно. Если пользователь выбрал кнопку OK, то возвращается значение DialogResult.OK. Имя выбранной картинки записывается в свойство FileName. В листинге 10.17 приведен пример работы с фотокамерой.

