Windows Mobile 5.0

Первый взгляд

Устройства под управлением Windows Mobile, к которым относятся КПК и смартфоны, все глубже вторгаются в нашу жизнь. Эти уст­ройства очень быстро эволюционируют, обзаводятся более совершен­ными экранами, увеличивают размер своей дисковой памяти, снаб­жаются фотокамерами и получают поддержку новых сетевых технологий. Операционная система Windows Mobile 5.0 сделала еще один шаг в развитии этих маленьких, но умных устройств

В новой платформе появилась поддержка двухмерных и ЗО-изоб — ражений, появилось больше возможностей обработки мультиме­дийных файлов, намного проще стало взаимодействовать с фото­камерами и устройствами позиционирования GPS. Причем эта поддержка осуществлена на программном уровне с помощью но­вых классов и расширения функциональности старых классов.

Компания Microsoft уделяет большое внимание данной платфор­ме, предоставляя разработчикам подробнейшую документацию, примеры и инструменты разработки. Главная страница для Window Mobile 5.0 находится на сайте Windows Mobile по адресу msdn. micro — soft. com/mobility/windowsmobile/default. aspx.

На сайте можно скачать необходимые пакеты SDK, позволяющие работать с устройствами под управлением Windows Mobile 5.0. В этой главе будут рассматриваться новые возможности, заложен­ные в систему Windows Mobile 5.0, которые будут интересны про­граммистам.

Улучшенная продуктивность

В системе Windows Mobile 5.0 появились нововведения, которые увеличивают продуктивность труда программиста. Основные воз­можности перечислены в следующем списке.

□ Появились новые API, связанные с отображением графики, уп­равлением контактами и взаимодействием с GPS.


□ Продолжено стирание граней между КПК и мобильными теле­фонами. Код программы, написанный для КПК, легко портиру — ется на смартфоны.

□ Улучшена и добавлена поддержка технологий передачи данных, в том числе прием и посылка SMS и телефонных звонков.

□ В Visual Studio 2005 добавлена поддержка устройств под управ­лением новой платформы с помощью SDK. Работа с данными более прозрачна, улучшен отладчик ошибок, изменен дизайн гра­фического интерфейса, который позволяет менять ориентацию экрана и его разрешения.

□ Переработан эмулятор.

Поддержка мультимедиа

Теперь программисты могут использовать классы, взаимодействую­щие с фотокамерами. Это позволяет расширить область приложе­ния камер и использовать их в работе с изображениями и видеозапи­сями в приложениях. Разработчики могут использовать возможности музыкального плеера Windows Media Player 10 Mobile в своих при­ложениях. Технология Direct3D позволяет разработчикам создавать более совершенные игры, а библиотека DirectDraw позволяет рабо­тать с графикой на более высоком уровне.

Поддержка управляемого кода

Система Windows Mobile 5.0 обеспечивает первоклассную поддерж­ку программистов, работающих с управляемым кодом. Основные нововведения перечислены в следующем списке.

□ Все устройства под управлением Windows Mobile 5.0 поставля­ются с исполняемой средой. NET Compact Framework 1.0 Service Pack 3, которая записана в независимую память.

□ При помощи управляемого кода осуществляется работа с SMS — сообщениями, контактами Outlook Mobile и телефонными воз­можностями устройства.

Windows Mobile 5.0 API

Система Windows Mobile 5.0 обзавелась новыми функциями API. Программисты получили в свое распоряжение новое пространство имен Microsoft. WindowsMobile с множеством классов, перечислений и делегатов. Кроме того, появились такие пространства имен, как Configuration, Forms, PocketOutlook, PocketOutlook. Messagelnterception, Status и Telephony.

Устройства под управлением Windows Mobile постоянно улучша­ются. И разработчики требуют новых возможностей для написания красивых и сложных игр. Поэтому в состав системы включена биб­лиотека Direct3D Mobile. Ее можно считать аналогом библиотеки Direct3D API, которая используется в настольных компьютерах.

Для доступа к памяти, улучшенной работе со сложной графикой и видеоматериалами система Windows Mobile 5.0 предлагает вос­пользоваться DirectDraw АРІ. Эта библиотека также может быть востребована для разработки игр, она является аналогом библио­теки DirectDraw API настольного компьютера.

Все больше устройств выпускается со встроенными камерами. Раз­работчики могут воспользоваться библиотекой DirectShow АРІ для доступа к возможностям камеры. С помощью соответствующих функций программист может управлять работой камеры, записы­вать, а потом отображать и проигрывать картинки и видеоматериа­лы. Библиотека поддерживает множество форматов и является ана­логом DirectShow настольного компьютера.

Кроме того, в устройствах все чаще стали использоваться прием­ники GPS. Раньше писать приложения, работающие с технология­ми GPS, было довольно трудно. Нужно было использовать для ра­боты serial API, что требовало хорошего знания основ сетевого программирования. Система Windows Mobile 5.0 во многом облег­чила эту задачу при помощи технологии GPS Intermediate Driver. Эта технология предоставляет набор простых функций для досту­па к данным GPS. В следующем списке приведены основные функ­ции для работы с GPS Intermediate Driver:

.□ GPSOpenDevice — соединение с GPS Intermediate Driver;

□ GPSC1 oseDevi се — разрыв связи от GPS Intermediate Driver;

□ GPSGetPosi ti on — получение текущих координат;

□ GPSGetDeviceState — получение информации о текущем состоя­нии устройства.

Взаимодействие с ActiveSync

Разработчики теперь могут запускать и останавливать процесс синхронизации ActiveSync, используя методы ActiveSyncStart и ActiveSyncStop.


Windows Mobile 5.0Новые возможности системы

После выхода системы Windows Mobile 2005 разработчикам стали доступны многие системные возможности, что намного упростило разработку приложений с использованием передовых технологий.

В этом разделе были упомянуты некоторые новые возможности, которые появились в Windows Mobile 5.0. Но их надо рассмот­реть на примерах, чтобы лучше понять преимущества новой плат­формы.

Подготовка к работе

Прежде чем создавать приложения для устройств под управлени­ем системы Windows Mobile 5.0, нужно установить необходимые пакеты SDK. Компания Microsoft предлагает заказать специальный диск с набором всех необходимых пакетов, сделав заказ на страни­це их сайта, которая располагается по адресу msdn. microsoft. com/ mobility/windowsmobile/howto/resourcekit/default. aspx, или самостоя­тельно скачать эти пакеты с сайта (рис. 10.1).

.WfittoW* 5 £«»*4ар«нт ft И Лі*

http //msdn. ftftarsecft ssVK fc % % is*)**»»** !Я

…. A…… _______________________________________________

msdrr. щ

.r„,- ->■.

MSDrt «от» Deve oper earners! Library c-wwr>‘ce0*>, Hov to виу і Suoscribers wondw

>, елк;.л? а»ч.’

r iot І

MSDN Home > Mobile Developer Center > Windows Mobile > Hefp and How To > Windows Mobile 5 0 Developer Resource Kit

D ІОрбҐ

Center

WebCftSt

Getting

Started

Understanding

Mobile

Framewerk

.NET compact

EVERYTHING YOU NPEO



Windows

Mobile

all in one place.



SQL Mobile

Other

Technolog es

Samofes


Следует обратить внимание на то, что существуют отдельные версии SDK для карманных компьютеров и смартфонов. После завершения установки пакеты автоматически интегрируются в среду разработки Visual Studio 2005. В результате разработчик получает новые эмуля­торы под Windows Mobile 5.0, в систему будут добавлены новые клас­сы, а справочная система пополнится новыми статьями и примерами.

Также можно скачать локализованные версии эмуляторов. К при­меру, страница для загрузки локализованной версии Windows Mobile 5.0 Pocket PC Emulator Images находится по адресу www. microsoft. com/downloads/details. aspx? familyid=EEC33AE3-C129- 4C25-ABAA-18E8E842178F&displaylang=en.

Чтобы воочию увидеть особенности Windows Mobile 5.0, надо раз­работать соответствующее приложение. Для этого следует запус­тить среду разработки Visual Studio 2005 и создать новый проект. При этом надо выбрать пункт Smart Device project, чтобы создать приложение для мобильного устройства. Затем надо выбрать плат­форму Pocket PC под управлением Windows Mobile 5.0 (рис. 10.2). После создания проекта Visual Studio 2005 отобразит пустую фор­му с установленными реальными размерами устройства.

tiev* rWj«st

* с h

jsual Ossie visual Stmflo Instaled templates ІШ

Jj — Windows

Smart Device Дн Ijjpf

І — Starter Kits 91 ї Class Library Controi Library Console Empty Project

:/ther Languages AppScetion

Vsust C#

З >■ Windows s j “™8 ■■

1 H Smart Device ЩУ

J ‘ Pocket PC 2003 Щ:| Device Class Library Console Empty Project

Jj : ■ Smartphone 2003 Яіі *.ppiicah,.. {1.0} App-kati… (1.0)

I Windows CE 5.0

идти

Windows Mobile 5.0 Smartp My Templates

I Database •<. |

I ‘ Starter Kits j||| >’ШІ

* zzi. ______________________ _ ___________ _ __

4»yn™ ireapng g. r<£f Ccmpea am* .г.. formsappltcaoon^ . мооле эфтооэй ‘’Cenoiater

Система Windows Mobile 5.0 предоставляет разработчику множе­ство новых пространств имен, классов, свойств и событий, с помо-

I Ok JI Cancel


щью которых он может получить доступ ко многим возможностям, которые ранее приходилось реализовывать только при помощи очень сложного и громоздкого кода на C++ с применением Windows API. Теперь разработчики могут для этих целей применять управ­ляемый код. NET Compact Framework. Имеет смысл поближе по­знакомиться с этими возможностями.

Microsoft.WindowsMobile. PocketOutlook

С помощью пространства имен Mi crosof t. Wi ndowsMobi 1 e. PocketUut 1 ook разработчик получает доступ к модели Pocket Outlook Object Model (РООМ). А имея доступ к РООМ, можно легко получить данные из объектов Контакты, Встречи и Задачи. Также можно получить электронные адреса из адресной книги, номера отправки SMS и со­общения. В следующем списке указаны наиболее часто используе­мые классы.

□ Out 1 ockSessi on — представляет собой объект Pocket Outlook для работы с контактами, встречами и задачами. Также можно по­лучить доступ к учетным записям электронной почты и SMS.

□ Appointment — класс, отвечающий за работу с назначенными встречами. С помощью данного класса можно редактировать данные записи и тип применяемого сигнала.

□ Contact — класс для работы с контактами. Данный класс поддер­живает более 60 свойств.

□ Task — класс для работы с задачами.

В следующих разделах применение пространства имен Micro­soft. Wi ndowsMobi 1 е. PocketOut 1 ook будет рассматриваться на конкрет­ных примерах.

Встречи (Appointment)

При помощи объектной модели Pocket Outlook Object Model разра­ботчик может добавить новую запись в список намечаемых встреч. Сначала надо создать тестовый проект. Чтобы получить доступ к объектам Pocket Outlook, нужно добавить ссылку на соответству­ющие сборки. Для этого следует выполнить команду Project ► Add Reference. В диалоговом окне Add Reference нужно выбрать строки Microsoft. WindowsMobile. Forms и Microsoft. WindowsMobile. PocketOutlook (рис. 10.3).



•лАг Reference

m


NET ‘ Projects 5 діям ^ Часові’



2.0.0.0

1.0Д.0

8.0. 0л

2.0. 0.0



1.0.0.Q



vl.1.4322

7 0.C G



! MtoosoftVvlikUwrtMoblfa. Ccmfiguration -0.0.0 iduvvaMcLil; .Oil cCtX 2.G.0.C



Срттря N«r«j4 і CustomMarshalers ■ tistiflffActions і Microsaft. VlsualBasic S MkTosoft.»VindcwsCE. FeriT! s



I [Microsoft. WindowsMobiie



2 С С и C:Procram F#esMi І

V2.0.50727 СДРгодгзт Riesf|||

*2.0.50727 C:Pr09ram FSasWe

2.C.0.0 C:Pro^rzrri Flitra — Alt к



C. (Progretr FiiesW‘i С iProgism F8esW || C;procrair Ff=£M 1



vl.1.4322




j Microsoft WtndowsMoblte ‘tatus 3 0.0 0

і Mlcrosoft. WindcweMobi1′ Telephony 1.0.0.0



" ?. .s



Рис. 10.3. Подключение к проекту сборок



Windows Mobile 5.0



vl.1.4322 С iPnctn FI*?-,Vi

Vl.1.4322 C:Pr0gr9m Ft*^.VI

2.0.0.0 C:Program Files’v>

v2.0.50727 C:Prwjram Fi&sxO; f

V2.0.50727 C:Pr05ram FB«sOfJ V2.0.50727 C:Prc5r1m Ft! IS’.Oi. |



ІтзсогІіЬ 2.0.0.G

OpenNETCF 2.0.0.0

OpenMETCF. DatB 2.0.0.C

CpenNETCF. DrawIng 2.0.0.0



После нажатия кнопки 0К выбранные ссылки должны появиться в списке ссылок Solution Exolorer, как показано на рис. 10.4.

Windows Mobile 5.0

Appototment_CS

ф Ш Properties ф Ш References

; — ал Mfro»OVV*tovsMoble. Forra ‘aHfcrosdtWndo*eMofcte. Poctetcxidook ~сз rescodfc • — a System ■a System. Data •a System. Dravsfing — із System. Whdows. Forms Systen. Xmi


*’

■ Program. cs

Рис. 10.4. Окно Solution Explorer

Теперь в редакторе кода следует добавить объявления для про­странств имен Microsoft. WindowsMobile. Forms и Microsoft. WindowMo — bile. PocketOutlook сразу после существующих объявлений. В этом случае появляется возможность работы с различными классами Pocket Outlook. Например, чтобы получить доступ к настройкам


для встреч, используется класс Appoi ntment, как показано в лис­тинге 10.1.

Листинг 10.1

usi ng Mi crosoft. Wi ndowsMobi1e. Forms;

usi ng Mi crosoft. Wi ndowsMobi1e. PocketOutlook;

private void buttonl_Click(object sender. EventArgs e)

{

// Создаем встречу и устанавливаем детали Appointment appt = new AppointmentO;

// Тема для встречи

appt. Subject = "Встреча с тещей";

// Время встречи — 8 марта 2007 в 22 часа

appt. Start = new DateTime(2007, 03, 08, 22, 00, 00):

// Продолжительность встречи — 3 минуты appt. Duration = new TimeSpan(00, 03, 00);

// Использовать виброзвонок для напоминания appt. ReminderVibrate = true;

// Повторять напоминание, пока пользователь не отреагирует appt. ReminderRepeat = true:

// Создаем сессию Outlook

// добавляем встречу в папку встреч Outlook

using (OutlookSession session = new OutlookSessionO)

{

session. Appointments. Items. Add(appt); session. DisposeO;

}

>

Windows Mobile 5.0



Работа с адресной книгой

185

Нужно запустить программу и нажать кнопку Добавить встречу. Пос­ле этого можно закрыть приложение, так как свою работу оно закон­чило. Теперь следует открыть программу Календарь, которая встрое­на в систему. В календаре нужно найти дату, которая использовалась в программе. В текущем примере встреча была запланирована на 8 марта 2007 года. Если все сделано правильно, то в указанной дате должна присутствовать запись о новой встрече (рис. 10.5).

Работа с адресной книгой

В этом разделе будет рассмотрен пример, в котором будет добавле­на новая запись в объект Контакты. Для этого надо, как и прежде, добавить в проект ссылки на соответствующие сборки М і с rosoft. Wi п — dowsMobile. Forms и Mi crosoft. WindowsMobile. PocketOutlook. А в редак­торе кода надо добавить объявления для пространств имен Micro­soft. Wi ndowsMobi1е. Forms и Mi crosoft. Wi ndowMobi1e. PocketOut1ook сразу после существующих объявлений.

Теперь можно обращаться к Контактам через объект Outl ookSessi on. Чтобы добавить новый контакт в коллекцию Контакты, надо раз­местить на форме кнопку с именем butAddContact и написать код, приведенный в листинге 10.2.

Листинг 10.2

private OutlookSession session; public FormlO {

Ini tі alі zeComponent():

// Создаем экземпляр сессии Pocket Outlook session = new OutlookSession();

}

private void butAddContact_Click(object sender. EventArgs e)

{

Contact contact = new ContactO; contact. FirstName = "Билл”; contact. LastName = "Гейтс";

contact. Emai1lAddress = "billgatesPmicrosoft. com"; contact. Birthday = new DateTime(1955,10.28); contact. CompanyName = "Microsoft"; contact. WebPage = new Uri("http://www. microsoft. com"); session. Contacts. Items. Add(contact);

}

Код очень прост и практически не требует комментариев. В начале работы создается переменная contact, в которой можно задавать самые различные параметры. В этом примере использовались толь­ко основные свойства. Были указаны имя, фамилия, электронный адрес, день рождения, имя компании и ее веб-страница. После того как новый контакт будет добавлен в список, нужно закрыть сессию при помощи метода Dispose().

После запуска приложения следует нажать кнопку Добавить в Кон­такты. В результате этого в списке Контакты появится новая запись (рис. 10.6).

■ИЯНІ^ІНД^

Биля Гейтс

Microsoft

©

Просмотр веб-страницы

http://www. microsoft. conV 28.10.55 Дон рожд.

Windows Mobile 5.0

Рис. 10.6. Просмотр списка контактов


Но разработчик может не только добавлять, но и получать информа­цию из имеющегося элемента списка. Для этого на форму надо по­местить список 1st Contacts и кнопку butGetlnfo. Прежде чем полу­чить информацию о нужном нам человеке, нужно сначала получить сам список контактов. И только потом, выбрав из этого списка нуж­ную запись, можно получить дополнительную информацию. Для получения полного списка контактов нужно добавить код в обработ­чик события Form_Load, как это показано в листинге 10.3.

Листинг 10.3

private void Forml_Load(object sender. EventArgs e)

{

// Получаем список контактов IstContacts. DataSource = session. Contacts. Items:

}

Теперь при загрузке формы список автоматически будет заполнен. Пользователь может выбрать любую запись и получить дополни-

Работа с адресной книгой

187

тельную информацию о выбранном контакте. Для этого в событии butGetlnfo Cl ick создается код, приведенный в листинге 10.4.

Листинг 10.4

private void butGet I nfoCl ick (object sender, EventArgs e)

{

// Получим информацию о выбранном контакте session. Contacts. Items[lstContacts. Selectedlndex].ShowDialogO; }

Когда пользователь выделит интересующую его запись и нажмет кнопку Получить информацию, на экран будет выведено стандартное диалоговое окно с информацией о выбранной записи.

Удалить контакт из списка еще проще, чем создать его. На форму надо добавить еще одну кнопку butDel Contact, с которой будет свя­зан код, приведенный в листинге 10.5.

Листинг 10.5

private void butDel ContactCl ick (object sender. EventArgs e)

{

// Удаляем выбранный контакт

sessi on. Contacts. Iterns[1stContacts. Selectedlndex].Delete();

}

Также из приложения можно вызвать стандартное окно выбора контакта, используемое программой Pocket Outlook. Теперь совсем не обязательно закрывать нашу программу и открывать окно кон­тактов, как это было сделано при добавлении новой записи в спи­сок контактов.

Стандартное окно имеет некоторые дополнительные возможности, которые моїут пригодиться разработчикам. Доступ к данному окну осуществляется через класс ChooseContactDialog, как показано в ли­стинге 10.6.

Листинг 10.6

private void butShowContactsCl ick (object sender, EventArgs e)

{

ChooseContactDialog contactDialog = new ChooseContactDi alog();

// Прячем пункт меню Новый контакт contactDialog. HideNew — true;

// Выводим диалоговое окна на экран продолжение &

Листинг 10.6 (продолжение)

contactDialog. ShowDialog();

// Показываем выбранный контакт

MessageBox. Show(contactDi alog. SelectedContactName.

"Выбранный

контакт”);

}

Электронная почта

Кроме получения доступа к списку контактов и добавления новых встреч, разработчик может также отсылать сообщения по электрон­ной почте или через SMS.

Для этих целей используются соответствующие пространства имен Mi crosoft. Wi ndowsMobi 1 е. PocketOutl ook. Emai 1 Account и Mi crosoft. Wi n — dowsMobi 1 e. PocketOutl ook. SmsAccount. Классы из этих пространств имен позволяют легко интегрировать отправку сообщений в ваши прило­жения. Например, класс Email Account позволяет создавать электрон­ные письма и присоединять к ним файлы.

В следующем примере демонстрируется вызов диалогового окна ChooseContactDialog для выбора нужного адресата из списка контак­тов, которому будет отправлено электронное письмо. Приложение создаст сообщение, в коде будет указана и тема письма.

Также в письмо будет добавлен вложенный файл, после чего сооб­щение будет отправлено выбранному ранее лицу. Все эти действия проиллюстрированы листингом 10.7.

Листинг 10.7

private void butSendEmail_Click(object sender. EventArgs e)

{

ChooseContactDialog contactDialog = new ChooseContactDi alog(); contactDialog. Тіtie = "Выберите контакт для отправки email"; if (contactDialog. ShowDialogO = DialogResult. OK)

{

Email Message message = new EmailMessageO; message. To. Add( new

Reci pi ent(contactDi alog. SelectedContact. Emai1lAddress)); message. Subject — "С днем рождения";


message. BodyText =

"Уважаемый Владимир Владимирович! Поздравляю вас с днем рождения! Посылаю вам открытку с видами Петербурга. Ваша Люда".; message. Attachments. Add(

new Attachment(@"My Documentspiter. jpg")); using (OutlookSession session = new OutlookSessionO)

{

session. EmailAccounts[0].Send(message); session. DisposeO;

}

}

}

После запуска программы и нажатия кнопки Послать письмо будет открыто стандартное окно Контакты, где можно выбрать адресата. После выбора получателя по его электронному адресу будет отправ­лено электронное письмо с заданным содержанием.

Если надо отправить электронное письмо адресату, который не вне­сен в адресную книгу, то пример надо переработать. Новый код при­веден в листинге 10.8.

Листинг 10.8

private void butSendEmail2_Click(object sender, EventArgs e)

{

Recipient recipient = new Reci pi ent("alexander. klі moff@gmai1.com");

Email Message msg =» new Email MessageO;

// Кому письмо

msg. To. Add(reci pi ent):

// Тема письма

msg. Subject = "О вашей книге”;

// Текст письма

msg. BodyText = "Спасибо за книгу"; msg. Send("ActiveSync");

}

SMS-сообщения

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

Листинг 10.9.

private void butSendSMSClick(object sender, EventArgs e)

{

ChooseContactDialog contactDialog = new ChooseContactDialogO: contactDialog. Тіtie = "Выберите получателя": if (contactDialog. ShowDialogO = DialogResult. OK)

{

// Создаем SMS-сообщение

SmsMessage message = new SmsMessage(

contactDi alog. SelectedContact. Mobi1eTelephoneNumber,

"Купи хлеба. Жена"); message. RequestDelіveryReport = true;

// Посылаем сообщение message. SendO;

}

}

В этом примере SMS-сообщение отсылалось адресату, чья запись уже имелась в адресной книге. Если же требуется отправить сооб­щение, не используя окно Контакты, то придется воспользоваться другим кодом.

Здесь я хочу сделать небольшое отступление и открыть вам боль­шой секрет. Разработчик может посылать SMS-сообщения самому себе при помощи эмулятора! Если послать SMS-сообщение из эму­лятора на телефонный номер 4250010001, то оно вернется на эму­лятор (рис. 10.7).

Итак, необходимо отправить SMS-сообщение человеку, чья учет­ная запись не отражена в списке Контакты. Для этого используется код, приведенный в листинге 10.10.

ПРИМЕЧАНИЕ——————————————————————————-

При отладке приложения в эмуляторе надо использовать целевое ус­тройство типа «Phone Edition*. Если проверять пример в обычном эмуляторе, то будет отображено сообщение об ошибке *Could not load sms. dlh. Впрочем, это не удивительно. Если эмулятор не имеет телефонных функций, то как можно отправлять SMS-сообщение?

Листинг 10.10

private void butSendSMS2_Click(object sender. EventArgs e) {

SmsMessage message = new SmsMessageO;

// Номер получателя

message. To. Add(new Recipient("4250010001"));

// Текст сообщения

message. Body = "Позвони домой";

// Посылаем сообщение message. SendO;

}

Результат выполнения этого кода приведен на рис. 10.7.

Windows Mobile 5.0

Рис. 10.7. Прием SMS-сообщения


Прием и обработка SMS-сообщений

Итак, мы научились отправлять SMS-сообщения из своей програм­мы. Но было бы неплохо научить приложения принимать подоб­ные сообщения. Для приема сообщений существует пространство имен Messagelnterception, которое находится в сборке Microsoft. Win — dowsMobi1е. PocketOutlook.

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

С этой возможностью стоит познакомиться ближе. После создания нового проекта I ntercepti onSMS_CS, нужно добавить на форму кноп­ку для отсылки SMS-сообщения, флажок chkAlert для установки


флага срочности и текстовое поле, в котором будет содержаться текст SMS-сообщения. Затем надо задать ссылки на уже применяв­шиеся ранее сборки Mi с rosoft. Wi ndowsMobi 1е и М і crosoft. Wi ndows­Mobi le. PocketOutl ook, Код, отвечающий за обработку принятых со­общений, приведен в листинге 10.11.

Листинг 10.11

using Microsoft. WindowsMobile:

usi ng Mi crosoft. Wi ndowsMobi1e. PocketOutlook;

using

Mi crosoft. Wi ndowsMobi1e. PocketOutlook. Messagelntercepti on;

// Объявляем переменную

private Messagelnterceptor smsInterceptor:

private void smsInterceptor MessageReceived(object sender. MessageInterceptorEventArgs e)

{

// Обработка входящего сообщения MessageBox. ShowC’K вам пришло срочное сообщение");

}

private void butSendSMS_Click(object sender, EventArgs e)

{

SmsMessage message = new SmsMessageO;

// Номер получателя

message. To. Add(new Recipient("4250010001"));

// Текст сообщения if (chkAlert. Checked)

{

// Если взведен флажок, то добавляем слово Срочно! message. Body = "Срочно! " + txtSMSText. Text;

}

else

{

message. Body = txtSMSText. Text;

}

// Посылаем сообщение message. SendO;

}

private void Forml_Load(object sender, EventArgs e)

{

smsInterceptor = new

MessageInterceptor(Interceptі onAction. Noti fyAndDelete. true):

smsInterceptor. MessageCondition = new MessageCondition( MessageProperty. Body,

MessagePropertyCompari sonType. StartsWi th,

"Срочно”, true): smsInterceptor. MessageReceived += new MessagelnterceptorEventHandler (sms I nter ceptor MessageRecei ved);

}

При помощи ключевого слова usl ng было объявлено несколько про­странств имен, также была добавлена переменная sms Interceptor, после чего можно было объявлять функцию обработки сообщения sms Interceptor MessageReceived. При получении SMS-сообщения с определенным текстом эта функция выводит соответствующую строку.

Но самое интересное происходит в событии Form_Load. Как только устройство принимает SMS-сообщение, оно перехватывается при­ложением для дальнейшей обработки. Если сообщение начинается словом «Срочно», то пользователь предупреждается о прибытии важного сообщения, после чего это сообщение удаляется. Подоб­ное поведение обеспечивает параметр Noti fyAndDel ete.

После запуска приложения на форме будут отображены текстовое поле и флажок. После ввода текста сообщения нужно нажать кноп­ку Послать SMS. Код отправки сообщения позаимствован из преды­дущего примера. Система должна отреагировать на прибытие но­вого сообщения с помощью специального уведомления, которое мы видели при разборе предыдущего примера (см. рис. 10.7).

Теперь следует повторить операцию. Только на этот раз надо взвес­ти флажок Пометить как срочное. В этом случае при отправке сообще­ния в начало текста вставляется дополнительное слово «Срочно». После нажатия кнопки приложение должно перехватить прибытие SMS-сообщения, так как теперь оно содержит ключевое слово, кото­рое определялось в параметре StartWith. Как только это произойдет, сообщение будет удалено, а пользователь получит уведомление о прибытии срочного сообщения (рис. 10.8). Но следует помнить, что для перехвата сообщения приложение должно быть запущено.

Данный пример предоставляет разработчику весьма широкие воз­можности. Представьте себе, что ваша компания рассылает своим

7-2873
сотрудникам особым образом отформатированные сообщения. Про­грамма может обработать эти сообщения и автоматически создать новые записи в списках Контакты или Встречи. И теперь сотруд­нику достаточно только взглянуть на экран, чтобы увидеть прият­ную новость, что сегодня компания выдает премию, за которой нуж­но подъехать в офис.

Windows Mobile 5.0

0 Пометить как срочное

ПОЭВ — V „0“Л ‘



Windows Mobile 5.0

Рис. 10.8. Прием срочного сообщения


К ван пришло сро<»«« сообщение

.Tuuwiea-fc

ВНИМАНИЕ————————————————————————————-

Для примеров, связанных с SMS-сообщениями, нужно использовать эмуляторы и устройства, имеющие возможность работы с SMS.

Телефония

Разработчик может использовать возможности телефонии при по­мощи класса Mi crosoft. WindowsMobile. Telephony. Phone. Используя ме­тод этого класса Talk, можно программно набрать нужный телефон­ный номер. При использовании класса Phone перед началом работы нужно установить ссылку на сборку Mi crosoft. Wi ndowsMobi 1 e. Tel ephony. Пример использования этого метода приведен в листинге 10.12.

Листинг 10.12

usi ng Mi crosoft. Wi ndowsMobi1e. Telephony;

// Объявляем переменную Phone phone = new PhoneO;

// Набираем номер

// Перед набором запрашиваен подтверждение phone. Talk("4255551212". true);


Обратите внимание на набираемый номер. С помощыр данного но­мера разработчик может делать звонок на эмуляторе. Эмулятор сначала запросит подтверждение набора номера (рис. 10.9) и затем будет звонить по указанному номеру.

Windows Mobile 5.0

Рис. 10.9. Запрос набора указанного номера


После подтверждения будет установлено соединение с неизвест­ным абонентом 4255551212 (рис. 10.10)

*• * -■■■

mm

Рис. 10.10. Соединение с абонентом


State and Notifications Broker

В Windows Mobile 5.0 появилась новая технология, получившая название State and Notifications Broker. Использование данной тех­нологии позволяет управлять состоянием устройства. Раньше для доступа к системным настройкам приходилось использовать неуп­равляемый код. Но теперь можно использовать возможности тех­нологии State and Notification Broker.

При помощи этой технологии можно обрабатывать информацию о различных состояниях устройства и постоянно отслеживать изме­нения этих состояний. Если будут обнаружены какие-либо изме­нения, то система сообщит об этом приложению. Использование данных технологий открывает широкие возможности для увеличе­ния функциональности программ. Например, разработчик сможет определять силу сигнала от сотовой станции, значение текущего заряда батареи, узнать, подключен ли крэдл, отслеживать состоя­ние ActiveSync, определять наличие подключаемой клавиатуры, фотокамеры и гарнитуры. Также с помощью этой технологии мож­но определять число Bluetooth-соединений, отображать список те­кущих сетевых соединений, получать информацию об ориентации экрана. Разработчик может получать информацию о следующей назначенной встрече (Appointment), обрабатывать информацию о проигрываемом музыкальном файле, получать информацию о контактах и количестве не прочитанных электронных писем, SMS — сообщений и пропущенных телефонных звонков.

Чтобы использовать возможности State and Notifications Broker в приложениях, надо добавить ссылку на сборку Mi crosoft. Win­dowsMobile. Status. Также необходимо добавить ссылку на сборку Mi crosoft. Wi ndowsMobi 1 е. После этого программа готова использовать классы пространства имен Mi crosoft. Wi ndowsMobi 1 e. Status.

Конечно, без наглядного примера обойтись просто нельзя. Предпо­ложим, что нас интересует информация о владельце устройства и необходимо отслеживать изменение этой информации. Для этого надо создать новый проект и добавить на форму элемент Label. Этого вполне достаточно для работы примера. Также необходимо доба­вить ссылки на сборки Mi crosoft. WindowsMobile и Microsoft. Win­dowsMobile. Status при помощи команды меню Project ► Add Reference. Нас интересует изменение электронного адреса владельца устрой­ства. Для этого используется код, приведенный в листинге 10.13.

Листинг 10.13

usi ng Mi crosoft. Wi ndowsMobi1e. Status;

private SystemState sysState;

sysState = new SystemStateCSystemProperty. OwnerEmail. true);

sysState. Changed += new ChangeEventHandler(sysState Changed);

private void sysState_Changed(object sender, ChangeEventArgs args)

{

lblOwnerEmail. Text * SystemState. OwnerEmai1;

}

Протестируем пример. После запуска приложения с ним не нужно ничего делать. Следует нажать кнопку Пуск и выбрать пункт меню Настройка. На вкладке Личные нужно активировать пиктограмму Данные о владельце. В соответствующем текстовом поле Эл. почта следует изменить указанный адрес электронной почты. Если теперь вернуться к приложению, то можно будет увидеть, что изменилось содержимое надписи lblOwnerEmail. Таким образом, программа ав­томатически отреагировала на изменение данных в настройках си­стемы. Конечно, можно получать данные об электронном адресе владельца в принудительном порядке. Для этого используется код, приведенный в листинге 10.14.

Листинг 10.14

private void butGetEmail_Click(object sender. EventArgs e)

{

//Получим email владельца устройства lblOwnerEmail. Text * SystemState. OwnerEmai1;

}

Да, с помощью этого кода можно получить интересующие данные, но в этом случае нельзя узнать, когда эти данные изменятся. При­дется через определенные промежутки времени проверять, не из­менился ли адрес у владельца устройства.

Но стоит вернуться к примеру уведомления об изменении элект­ронного адреса владельца устройства. Отслеживанием изменений в системе занимается класс 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. OwnerEmai1;

}

Пример с электронным адресом был приведен лишь для ознаком­ления. На самом деле, с помощью соответствующих свойств можно получить доступ более чем к ста системным настройкам. Наиболее внимательные читатели могут заметить, что State и Notifications Broker порой дублируют функциональность, которую можно вос­произвести при помощи других средств. Например, текущую ори­ентацию экрана можно узнать с помощью функции API Get — SystemMetrics или с помощью вызова Screen. PrimaryScreen. Bounds. А информацию о заряде батареи можно узнать с помощью функ­ции GetSystemPowerStatusEx.

Но зачем понадобилось создавать еще одну дополнительную воз­можность извлечения информации? Причин для такого шага было несколько. Прежде всего, новые возможности удобны и просты. В предыдущем примере было показано, что для получения элект­ронного адреса владельца устройства достаточно вызвать одно со­ответствующее свойство. Для получения других значений также вы­зываются соответствующие свойства. Причем названия этих свойств говорят сами за себя и не требуют наличия под рукой спра­вочной литературы.

Для закрепления материала нужно дополнить программу еще не­сколькими примерами получения различных свойств. Можно до­бавить отображение уровня заряда батареи, текущего состояния батареи, наличия радиоприемника и фотокамеры, названия сото­вого оператора и определение текущей ориентации экрана. Все это делает код, приведенный в листинге 10.15.

Листинг 10.15

private void butGetInfo_Click(object sender. EventArgs e)

{

lstlnfo. Items. Add("Название оператора: " +

SystemState. PhoneOperatorName); lstlnfo. Items. Add("Наличие радио: " +

SystemState. PhoneRadioPresent); lstlnfo. Items. Add("Наличие камеры: " + SystemState. CameraPresent); lstlnfo. Items. Add("Ориентация экрана " +

SystemState. Di splayRotati on);

}

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. Chargi ng) 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 стало поразительно легко работать с коллекцией фотографий и рисунков. При помощи стандартного диалогового окна выбора рисунка можно легко выб­рать нужный рисунок. Доступ к стандартному окну выбора рисунка осуществляется при помощи класса Mi crosoft. Wi ndows Mobi 1 e. Forms. Se — lectPictureDialog.

Но лучше работу с диалоговым окном выбора картинки рассмот­реть на примере. На форме надо разместить метку 1Ы Se l ectedPi cture и графическое поле pi cSelectImage. Не забудьте перед началом со­здания приложения установить ссылку на пространство имен Mi crosoft. Wi ndowsMobi 1 е. Forms. Соответствующий код приведен в ли­стинге 10.16.

Листинг 10.16

private void butSelectPicture_Click(object sender, EventArgs e) {

SelectPictureDialog selectPictureDialog =* new SelectPi ctureDi alog():

// Задаем фильтр

selectPictureDialog. Filter =

"Рисунки(*.ВМР;*.JPG)|*.BMP;*.JPG";

// Задаем папку для обзора

selectPictureDialog. InitialDirectory = Windows

// Заголовок для диалогового окна selectPictureDialog. Title = "Выберите рисунок";

if (selectPictureDialog. ShowDialogO = Dial ogResul t. OK && selectPictureDialog. FileName. Length > 0)

{

// Получим расширение выбранного файла string fileExtension *

Path. GetExtensi on(selectPi ctureDi alog. Fi1eName);

// Выводим путь выбранного файла lblSelectedPicture. Text = "Выбранный файл: " + selectPi ctureDi alog. Fi1eName;

// Если выбран файл JPG. то выводим на экран if (fileExtension. ToLowerO = ".jpg") picSelectedlmage. Image = new

Bi tmap(selectPi ctureDi alog. Fi1eName);

>

}

В начале работы создается объект SelectPictureDialog, а затем для него задаются нужные свойства. С помощью свойства Fi 1 ter огра­ничивается выбор файлов. Пользователь может загружать изоб­ражения с расширениями. BMP и .JPG. Затем указывается старто­вая папка. Строго говоря, в Windows Mobile для хранения картинок используется папка Мои картинки. Но приложение, ра­ботающее с изображениями, может использовать свою собствен­ную папку.

Windows Mobile 5.0

Рис. 10.11. Выбор изображения


Потом в заголовке диалогового окна выводится текст, поясняю­щий пользователю дальнейшие действия Это был минимально необходимый при использовании класса SelectPictureDialog код.

Если пользователь выбрал картинку и нажал на кнопку ОК, то надо распознать выбранный файл. С помощью метода Path. GetExtension можно получить расширение файла. В текстовой метке lblSelec — tedPicture отображается полный путь к выбранному файлу, а в гра­фическом поле pi cSel ectedImage размещается сама картинка. Но для этого она должна иметь расширение JPG (рис. 10 11)

Следует обратить внимание на то, что диалоговое окно выбора рисунка позволяет выбирать картинки из любой папки устрой­ства.

Работа с фотокамерой

Мобильные устройства все чаще снабжаются фотокамерами. При­чем многие пользователи отсутствие камеры на смартфоне счита­ют очень большим недостатком. Система Windows Mobile 5.0 пред­лагает поддержку работы с камерой, чтобы разработчики могли использовать ее возможности в своих приложениях.

Диалоговое окно захвата изображения позволяет интегрировать фотографии и видеоматериал в приложения. При этом разработ­чик получает возможность управлять поведением камеры. Доступ к возможностям камеры осуществляется при помощи класса Mi crosoft. Wi ndowsMobi 1 е. Forms. CameraCaptureDi al og. Класс CameraCap — tureDialog очень похож на класс Sel ectPi ctureDi alog.

Свойство Mode позволяет управлять режимом съемки. Камера мо­жет работать, как обычный фотоаппарат, что задается значением CameraCaptureMode. Sti 11, или записывать видеоролик. Диалоговое окно вызывается методом ShowDi а 1 од, который возвращает значение, показывающее, как было закрыто окно. Если пользователь выбрал кнопку 0К, то возвращается значение Di alogResul t. ОК. Имя выбран­ной картинки записывается в свойство FileName. В листинге 10.17 приведен пример работы с фотокамерой.

Листинг 10.17

private void butPhotoMake_Click(object sender. EventArgs e)

{

CameraCaptureDialog cameraCaptureDialog = new CameraCaptureDialog(); cameraCaptureDialog. Owner = this; cameraCaptureDialog. Title = "Фотограф"; cameraCaptureDialog. Mode * CameraCaptureMode. Sti11;


Работа с фотокамерой

203

if CcameraCaptureDialog. ShowDialogC) = DialogResult. OK && cameraCaptureDialog. FileName. Length > 0)

{

pictureBox. Image = new Bitmap (cameraCaptureDi alog. Fi1eName);

MessageBox. Show("Снято!");

}

}

Для записи видеоролика используется аналогичный способ, но надо поменять режим съемки. Так, для записи видеоматериала вместе со звуком используется режим VideoWithAudio. Пример записи ви­деоролика приведен в листинге 10.18.

Листинг 10.18

private void butCapture_Click(object sender, EventArgs e)

{

CameraCaptureDialog cameraCapture = new CameraCaptureDi alog(): cameraCapture. Owner — null;

cameraCapture. InitialDirectory = @"My Documents”: cameraCapture. DefaultFileName = @"test.3gp"; cameraCapture. Title — "Камера — Демонстрация"; cameraCapture. VideoTypes — CameraCaptureVi deoTypes. Messagi ng;

cameraCapture. Resolution = new Size(176, 144);

// Лимит в 10 секунд для видео

cameraCapture. VideoTimeLimit * new TimeSpan(0, 0. 10); cameraCapture. Mode = CameraCaptureMode. VideoWithAudio; if (DialogResult. OK — cameraCapture. ShowDialogO)

{

MessageBox. Show("Картинка или видео успешно записаны в:п{0}",

cameraCapture. FileName);

}

}

Легко заметить, что эти два примера практически идентичны. Су­ществует еще режим записи видео без звукового сопровождения. В этом случае для свойства Mode задается значение CameraCap — tureMode. VideoOnly. Если перед вызовом метода ShowDialog использо­вать свойство Defaul tFi 1 eName, то указанное имя будет использовать­ся как имя файла для записи новых фотографий или видеоматериа­ла. Свойство Initial Directory позволяет указать папку, в которой будут сохраняться отснятые материалы. Свойство Resolution позво­
ляет задать разрешение снимаемого материала, что иллюстрирует следующая строка кода:

cameraCaptureDialog. Resolution = new Size(320. 240);

Свойство StillQuality позволяет установить качество сжатия для фотографий при помощи перечисления CameraCaptureSti 11 Quality. Используемые значения перечислены в следующем списке:

□ Hi gh — указывает на наилучшее качество картинки с минималь­ным сжатием;

□ Normal — среднее качество картинки;

□ Low — высокая степень сжатия, плохое качество.

Свойство VideoTimeLimit позволяет установить максимальную про­должительность записи видеоматериала. По умолчанию использу­ется нулевое значение, что означает отсутствие временного огра­ничения. В этом случае запись съемки будет вестись до тех пор, пока позволяют ресурсы системы. Свойство VideoTypes позволяет выбрать тип видеоматериала. На устройствах под управлением Windows Mobile 5.0 используется видеоматериал двух типов — Multimedia Messaging Service (MMS) и Windows Media Video (WMV).

Повторение пройденного

Примеры доступа к объектам Pocket Outlook рассматривались при­менительно к карманным компьютерам. Но теперь надо воссоздать их, опираясь уже на смартфоны. Сам код примеров останется прак­тически неизменным. Но при этом изменится логика управления программой. Как уже говорилось ранее, управление в смартфонах сводится к обработке событий для пунктов меню.

Windows Mobile 5.0

Сначала рассмотрим пример с использованием объекта Pocket Outlook. На этот раз надо получить доступ к списку встреч (Appoint­ment). Перед началом изучения примера вам нужно убедиться, что список событий имеет хотя бы одну запись. Если там ничего нет, то следует создать несколько записей самостоятельно.

После создания нового проекта на форме надо разместить элемент Li stVi ew. Свойство Vi ew должно получить значение Detai 1 s. В коллек­ции Columns надо задать заголовки Дата, Время иТема (рис. 10.12). Преж­де всего потребуется задать переменную для экземпляра сессии Out­
look. Сразу же после вызова метода Initia — 1 і zeComponent в конструкторе формы объяв­ляем экземпляр для сессии PocketOutl ook, как показано в листинге 10.19.

Windows Mobile 5.0

■ ofttfecti_CS Microsoft Visual Si,

Fcxroi :cs*’?Forml. cs [Design]* ]

Mobile No Phone:

Рис. 10.12. Внешний вид приложения

Листинг 10.19

private OutlookSession session; public FormlO {

Ini ti alі zeComponent();

// Создаем экземпляр сессии Pocket Outlook

session — new OutlookSessionO;

}

Теперь программист получил доступ к коллекции событий через объект Out­lookSession. Для коллекции Appointment со­здается соответствующая переменная, при помощи которой можно получить каждый элемент коллекции, что иллюстрирует код, приведенный в листинге 10.20.

Листинг 10.20

private void menuAppointmentsCl ick (object sender, EventArgs e) {

AppAppts = session. Appointments. Items;

// Проходим через все элементы коллекции foreach (Appointment appt in AppAppts)

{

// Создаем объект ListViewItem lvltems = new ListViewItemO;

// Разделяем полученные результаты по колонкам lvltems. Text = appt. Start. ToShortDateString();

1vlterns. Subitems. Add(appt. Start. ToShortTimeStri ng());

1vIterns. Subitems. Add(appt. Subject):

// Добавляем в ListView 1vContacts. Iterns. Add(lviterns):

}

// He забываем закрыть сессию PocketOutlook session. DisposeO;

}

Также мы можем получить информацию об имеющихся контактах. Но в этом случае рассматривать код не нужно, так как он полнос­тью повторяет пример для КПК.

Отсылка письма

Рассматриваемый пример покажет, как можно посылать электрон­ное письмо любому человеку, чья запись присутствует в списке Контакты. При этом разработчик может присоединять к отправля­емому сообщению файл.

В этом примере будет применен другой подход к дизайну програм­мы. Так как средства навигации в смартфоне довольно скудны, же­лательно сводить к минимуму число нажатий на клавиши. Напри­мер, одна и та же клавиша может запускать разные функции.

После создания нового проекта SendEma і 1 Sma rtphone CS на форме надо разместить текстовое поле txtContact, в котором будет отображать­ся выбранный электронный адрес.

Также потребуется изменить код из предыдущего примера. Нужно переместить код из обработчика события menuSoftKeyl Click в от­дельный метод SelectContact(). Это делается для того, чтобы мож­но было более гибко настраивать программу под свои нужды. Со­ответствующий код приведен в листинге 10.21.

Листинг 10.21

private void SelectContactO {

// Создаем экзмемпляр окна выбора контактов ChooseContactDialog contactDi al — new ChooseContactDialogO; // а также убираен возможность создания новых контактов contactDial. HideNew = true;

// выводим диалоговое окно на экран if (contactDial. ShowDialogO — DialogResult. OK)

{

selContact * contactDial. SelectedContact; txtContact. Text = selContact. FileAs; menuSoftKeyl. Text = Послать;

}

}

Следует обратить особое внимание на строку menuSoftKeyl. Text = "Послать";


Когда пользователь выберет пункт Контакты, а затем нужный кон­такт, то текст в пункте меню menuSoftKeyl меняется на строчку По­слать. Также надо добавить новый пункт меню для очистки тексто­вых полей. Это позволит пол ьзователю выбрать новый контакт для отправки письма. Надо открыть файл Forml. cs в дизайнере формы. На правой стороне меню к уже имеющемуся пункту Выход следует добавить новый пункт меню Очистить. Созданный пункт получит имя mnuClear. Код для метода mnuCl earCl іck приведен в листинге 10.22.

Листинг 10.22

private void mnuClear_Click(object sender. EventArgs e)

{

txtContact. Text = string. Empty; menuSoftKeyl. Text = "Контакты";

}

Это позволить очистить текстовое поле и в пункте меню menuSoftKeyl отобразить строку Контакты.

Теперь можно писать функцию, отправляющую электронное пись­мо. В примере сообщение будет отправляться с вложенными фай­лами. Для примера можно использовать одну из картинок, входя­щих в состав Windows Mobile 5.0.

Для отправки письма используется класс Email Message. Чтобы ис­пользовать этот класс в нашем примере, надо сначала установить ссылку на пространство имен System. Messaging, выполнив команду меню Project ► Add Reference. После этого можно пользоваться дан­ным пространством имен при помощи ключевого слова using:

using System. Messaging;

Код метода SendEmai 10, который будет отвечать за отправку пись­ма, приведен в листинге 10.23.

Листинг 10.23

private void SendEmailO {

// Создаем экземпляр класса EmailMessage Email Message message = new EmailMessageO;

// Тема письма

message. Subject * "Поздравление";

// Текст письма

message. BodyText = "Поздравляю с Днем Варенья Г;

// Выбираем адресата

Recipient client = new Recipient(selContact. EmaillAddress); message. To. Add(client)'; a ^

продолжение jV

Листинг 10.23 (продолжение)

// добавляем в письмо вложенный файл Attachment image =

new Attachment(@"My DocumentsXMy PicturesFlower. jpg"): message. Attachments. Add(image); message. Send("Actі veSync"): txtContact. Text — string. Empty; menuSoftKeyl. Text — "Контакты";

}

Итак, в методе SendEmai1 объявляется и создается экземпляр класса EmailMessage. В свойствах Subject и BodyText задаются тема и текст письма. Электронный адрес из выбранного контакта записывается в свойстве Email Message. То. Для этого создается экземпляр класса Reci pi ent и передается свойство sel Contact. Emai 1 lAddress.

Теперь можно добавить в письмо вложенный файл. Для этого со­здается экземпляр класса Attachment, которому в конструктор пере­дается полное имя выбранного файла. После этого свойству Email Message. Attachment передается значение экземпляра.

Теперь для отправки письма все готово. Следует вызвать метод message. Send и очистить текстовое поле. Также надо восстановить в меню строку Контакты. Так как для menuSoftKeyl используются два метода, SendEmai 1 и SelectContact, то нужно определиться, когда ка­кой метод следует использовать. Для этого нужно получить значе­ние свойства menuSoftKeyl. Text, как показано в листинге 10.24.

Листинг 10.24

private void menuSoftKeyl Click(object sender, EventArgs e)

{

if (menuSoftKeyl. Text — "Послать")

SendEmailO; el se

SelectContactO:

}

Настало время проверить нашу программу. После запуска приложе­ния надо выбрать адресата, которому предназначено письмо. Для отображения окна выбора контакта следует нажать кнопку Soft Key 1. Можно выбрать любой контакт из имеющегося списка. После этого в текстовом поле появится выбранный контакт. При этом пункт меню обретет название Послать.

Затем надо снова нажать кнопку Soft Key 1. Кнопка Soft Keyl примет первоначальный вид, в меню будет отображаться строка Контакт, а текстовое поле будет очищено. Выходим из программы. Но нам надо убедиться, что письмо было отправлено. Поэтому следует пе­рейти на экран Сегодня и нажать кнопку Пуск, после чего активиро­вать пиктограмму Сообщения. В появившемся списке надо выбрать пункт Эл. п. Outlook, а из пункта Меню перейти в подменю Папки. За­тем осталось перейти в папку Исходящие. В ней должно находиться новое сообщение.

Мелочь, а приятно

В блоге blogs. msdn. com/anthonywong/, который ведет Энтони Вонг (Anthony Wong), я нашел несколько интересных заметок, расска­зывающих об исправленных ошибках или улучшенных возможно­стях, которые стали доступны в Windows Mobile 5.0.

Метод Directory. Exists

На устройствах под управлением Windows СЕ 4.Х метод Directo­ry. Exists О по-разному обрабатывал имена путей, которые закан­чивались обратным слэшем. В качестве примера можно рассмот­реть следующее выражение:

Di rectory. ExistsCWtemp");

Это выражение возвращает значение True, если папка temp суще­ствует. Добавим в предыдущее выражение символ обратной черты.

Di rectory. Exi sts( "WtempW")

Теперь данный метод возвратит Fal se, даже если папка существует. На устройствах под управлением Windows Mobile 5.0 платформа. NET Compact Framework исправила это противоречие, и теперь метод Di rectory. Exi sts() возвращает True вне зависимости от нали­чия замыкающего обратного слэша.

Метод Bitmap. Save()

На старых устройствах также отсутствовали конвертеры графичес­ких изображений, что не позволяло сохранять изображения в фор­матах GIF, JPG или PNG. Разработчикам приходилось довольство­ваться только форматом BMP. Причем при написании программы среда разработки позволяла писать неправильный код, выводя со­ответствующие подсказки. Однако при вызове этого метода про­грамма выводила сообщение об ошибке. В Windows Mobile 5.0 те­перь поддерживаются все четыре формата.


Leave a reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Confirm that you are not a bot - select a man with raised hand: