52628.fb2
В этой главе мы научимся создавать приложения для смартфонов под управлением системы Windows Mobile 5.0. Так получилось, что в России смартфоны под управлением Smartphone 2003 поначалу не получили широкого признания. Признанными лидерами на рынке «умных» телефонов были такие марки, как Nokia, Siemens и Sony Ericsson, которые использовали в телефонах операционную систему Symbian. И если на рынке КПК компании Microsoft удалось потеснить своего вечного конкурента PalmOs, то в сфере мобильной связи основная борьба еще впереди.
Небольшие изменения начались, когда в продаже появились смартфоны под управлением Windows Mobile 5.0, выпускаемые азиатскими компаниями. В этой главе мы только познакомимся с основными особенностями программирования для смартфонов, а в следующей главе более подробно изучим платформу Windows Mobile 5.0.
Если .NET Compact Framework можно считать подмножеством полной версии .NET Framework, то смартфоны можно считать подмножеством карманных компьютеров. Причем разница между ними стремительно стирается. Но, тем не менее, между двумя типами мобильных устройств есть существенные различия. Во-первых, смартфоны являются прежде всего мобильными телефонами, предназначенными для телефонных разговоров. Во-вторых, размер экрана у смартфонов меньше, чем у стандартных карманных компьютеров, и составляет 176×220 пикселов, тогда как у КПК размер экрана 240×320 пикселов.
В последнее время все чаще выпускаются смартфоны с разрешением 240×320 пикселов. А КПК стали все чаще стали делать с экраном 480×640 пикселов.
Еще одной отличительной и, пожалуй, главной чертой смартфонов является отсутствие стилуса. Следовательно, тип экрана также отличается от экрана карманного компьютера. Пользователь может взаимодействовать с приложением только при помощи кнопок телефона. И хотя «умные» телефоны используют такую же версию .NET Compact Framework, эти различия заставляют применять совсем иные приемы программирования.
В состав Visual Studio 2005 уже входят эмулятор для Smartphone 2003 и необходимые шаблоны проектов. Пора приступить к созданию приложения для смартфона. Самый первый пример будет сделан для устройства Smartphone 2003, а остальные — для Windows Mobile 5.0. И хотя речь о Windows Mobile 5.0 пойдет только в следующей главе, я решил сразу тестировать программы именно для этой платформы. В этом случае вам придется скачать дополнительный пакет Windows Mobile 5.0 SDK Smartphone, который содержит дополнительные эмуляторы для этого класса устройств.
В главе 7 уже создавался проект, рассчитанный на работу с смартфоном. Мы тогда немного забежали вперед. Настало время вернуться к истокам и начать изучение с самого начала.
Запустите Visual Studio 2005 для создания нового проекта. Надо выбрать тип проекта Smartphone 2003. Для этого типа применяется только .NET Compact Framework 1.0. Сразу после создания надо запустить эмулятор при помощи команды меню Debug►Start Debugging
. На экране будет отображено окно Deploy
со списком имеющихся эмуляторов. Нужно выбрать эмулятор и нажать кнопке Deploy
. Если все прошло нормально, то эмулятор будет загружен с пустой формой. В первом упражнении надо лишь проверить возможности работы с эмулятором. Поэтому надо закрыть приложение (но не эмулятор!) и продолжить работу с приложением в режиме проектирования.
Так как у приложений для смартфонов нет кнопки закрытия окна, то непонятно, как можно закрыть программу. Можно нажать кнопку Stop Debugging. Если на эмуляторе нажать кнопку с красным телефоном, то окно программы будет свернуто, а не закрыто, и все равно придется воспользоваться первым способом для закрытия приложения.
Практически все программы для смартфонов работают при помощи команд меню. Поэтому надо получить базовые навыки работы с этим элементом управления. В режиме проектирования формы следует щелкнуть мышью в левой части голубой полоски, которая расположена в нижней части экрана. Эта полоска является элементом меню, которое вызывается нажатием кнопки Soft Key1
, находящейся под экраном. На форме появится текст Type Here
(рис. 9.1).
Рис. 9.1. Создание меню
В этой области нужно ввести слово Привет
и нажать клавишу Enter
. Введенный текст появится в левой части формы, и будет активирована Soft Key 2
с той же надписью Type Here
. В этой области нужно ввести слово Закрыть
. Теперь можно вводить текст для подменю. Новый пункт меню получит заголовок Выход
. Перед словом Выход
появится единица. Среда разработки Visual Studio 2005 автоматически вставляет цифры в создаваемое меню. Эти цифры являются номерами кнопок-клавиш телефонов. С помощью этой подсказки пользователь может быстро активировать нужный пункт меню нажатием соответствующей кнопки (рис. 9.2).
Рис. 9.2. Создание подменю
Теперь нужно перейти на форму и дважды щелкнуть на пункте созданного меню Выход
. В результате будет открыт редактор кода с заготовкой функции menuItem3_Click
. Ее код приведен в листинге 9.1
private void menuItem3_Click(object sender, EventArgs e) {
this.Close();
}
После запуска приложения следует нажать правую серую кнопку под экраном. При этом будет активирована правая часть меню и появится пункт 1 Выход
. Для выполнения этой команды можно нажать клавишу 1
или большую кнопку в центре телефона, которая выполняет функцию клавиши подтверждения. Если все было сделано правильно, то приложение закроется. Итак, только что мы создали приложение для смартфона, добавили в него меню, запустили приложение и закрыли его.
В отношении меню приложения для смартфонов установлено специальное правило. Клавиша Left Softkey
может иметь только один пункт меню, а клавиша Right Softkey
может иметь разветвленное меню. Любопытно отметить, что при попытке создания подменю для левой клавиши предыдущая версия среды разработки Visual Studio 2003 выводила ошибку. Теперь такой ошибки не выводится, и, теоретически, ничто не мешает нарушить установившуюся традицию. Например, при использовании примеров для смартфонов под управлением Windows Mobile 5.0 программист может создавать вложенные меню для левой кнопки.
Так как пользователь лишен возможности пользоваться стилусом, то многие элементы управления смартфонами не поддерживаются.
В этом легко убедиться, достаточно лишь взглянуть на панель инструментов проекта для смарфтонов, чтобы увидеть, как резко уменьшилось число поддерживаемых объектов.
Поначалу количество не поддерживаемых элементов управления приводит в замешательство. Как же писать приложения, если смартфон не поддерживает такой распространенный элемент, как кнопка? Так как в смартфонах не используется стилус, то применение кнопок просто бессмысленно. Управление объектами в приложениях для смартфонов осуществляется при помощи реальных кнопок-клавиш.
Кроме стандартных кнопок с цифрами у смартфона имеются еще так называемые softkey-клавиши. Это две дополнительные кнопки под экраном, которые выполняют очень важные функции в приложениях. Именно с помощью этих кнопок осуществляется работа с меню.
Также надо помнить, что внешний вид элементов управления зачастую отличается от вида аналогичных элементов на КПК. Возьмем, к примеру, текстовое поле. Текстовое поле TextBox
в смартфонах не имеет окантовки. Она появляется только в том случае, когда текстовое поле получает фокус. В этом нетрудно убедиться на простом примере.
Следует добавить на форму два текстовых поля. Одно из них автоматически получит фокус при загрузке приложения (рис. 9.3). Если с помощью клавиши навигации перейти на второе поле, то оно получит окантовку, а у первого поля, соответственно, окантовка пропадет.
Рис. 9.3. Окантовка у первого текстового поля, имеющего фокус
Чтобы не путать текстовые поля с элементами Label
, в надписях используют более жирный текст. На форме надо расположить два элемента Label
. На рис. 9.4 видно, что строки label1
и label2
выделяются более жирным начертанием текста. На этом различия не заканчиваются.
Рис. 9.4. Различия внешнего вида некоторых элементов управления
Стоит расположить на форме еще одно текстовое поле и для его свойства Multiline
указать значение True
. В поле надо ввести какой-нибудь длинный текст. После запуска проекта будет видно, что текстовое поле не в состоянии уместить весь текст, а показывает только несколько первых слов с завершающим маленьким треугольником.
Если установить фокус ввода на этом текстовом поле и нажать кнопку Enter
, то текст полностью будет показан в новом окне (рис. 9.5).
Рис. 9.5. Полный текст в текстовом поле
Пользователь может самостоятельно дописать слова песни в новом окне и выбрать команду Done
или отказаться от подтверждения ввода с помощью команды Cancel
.
То же самое касается и элемента ComboBox
. Данный элемент получает окантовку при получении фокуса и отображает уже два треугольника. Чтобы раскрыть список элементов, хранящихся в комбинированном окне, необходимо сначала установить фокус и нажать на кнопку Enter
. При этом будет открыто новое окно, в котором с помощью клавиш навигации пользователь может выбрать необходимый элемент и выполнить команду меню Done
.
Существует также альтернативный способ выбора элемента из ComboBox
. Для этого нужно опять установить фокус на комбинированном окне и прокручивать имеющиеся записи при помощи кнопок навигации Влево
или Вправо
.
Первые модели сотовых телефонов для отправки сообщений имели только один режима ввода. Пользователь нажимал на кнопки телефона в определенном порядке, вводя тот или иной символ. Затем появились другие режимы. В частности, сейчас поддерживается числовой режим, так называемый режим T9 и символьный режим. Поначалу библиотека .NET Compact Framework не имела поддержки режимов ввода. Поэтому для установки необходимого режима программистам приходилось использовать механизм P/Invoke для вызова функций API, как показано в листинге 9.2.
[DllImport("coredll.dll", EntryPoint = "SendMessage")]
private static extern uint SendMessage(IntPtr hWnd, uint msg,
uint wParam, uint lParam);
// Сообщение для режима ввода
const uint EM_SETINPUTMODE = 0x00DE;
// Перечисление режимов ввода
public enum InputModeAPI {
Spell = 0,
T9 = 1,
Numbers = 2,
Text = 3
}
public static void SetInputMode(Control ctrl, InputModeAPI mode) {
SendMessage(ctrl.Handle, EM_SETINPUTMODE, 0, (uint)mode);
}
private void mnuT9_Click(object sender, EventArgs e) {
SetInputMode(textBox3, InputModeAPI.T9);
}
private void mnuSpell_Click(object sender, EventArgs e) {
SetInputMode(textBox3, InputModeAPI.Spell);
}
private void mnuNumeric_Click(object sender, EventArgs e) {
SetInputMode(textBox3, InputModeAPI.Numbers);
}
private void mnuText_Click(object sender, EventArgs e) {
SetInputMode(textBox3, InputModeAPI.Text);
}
В данном примере нужный режим ввода указывается для текстового поля textBox3
с помощью системы меню (рис. 9.6).
Рис. 9.6. Выбираем режим ввода
Режим T9 в эмуляторе не работает, поэтому надо проверять код на реальном устройстве.
В библиотеке .NET Compact Framework 2.0 появилась возможность контролировать режим ввода текста с помощью класса InputModeEditor
. Данный режим распространяется только на текстовые поля.
Предположим, что в программе есть два текстовых поля. В одном поле пользователь должен ввести свое имя, а во втором — номер телефона. В первом случае пользователь будет использовать буквы, а во втором случае ему необходимы только цифры. Поэтому можно заранее задать нужный режим ввода текста для разных текстовых полей. Для этого надо указать ссылку на сборку Microsoft.WindowsCE.Forms
и задействовать класс InputModeEditor
, как показано в листинге 9.3.
private void Form1_Load(object sender, EventArgs e) {
// Устанавливаем текстовый режим ввода текста
InputModeEditor.SetInputMode(txtName, InputMode.AlphaCurrent);
// Устанавливаем числовой режим ввода текста
InputModeEditor.SetInputMode(txtPhone, InputMode.Numeric);
}
На смартфонах клавиши Soft Key 1
и Soft Key 2
используются для управления меню. Если попробовать переопределить эти клавиши для других задач, то у вас ничего не получится. Дело в том, что события Key_Down
не распознаются системой для этих клавиш, если на форме присутствует компонент MainMenu
. Но если удалить этот компонент, устанавливаемый по умолчанию, то с этими кнопками можно будет связать собственные команды, как показано в листинге 9.4.
private void Form1_KeyDown(object sender, KeyEventArgs e) {
if ((e.KeyCode == System.Windows.Forms.Keys.F1)) {
// Soft Key 1
lblTest.Text = "Вы нажали на клавишу Soft Key 1";
}
if ((e.KeyCode == System.Windows.Forms.Keys.F2)) {
// Soft Key 2
lblTest.Text = "Вы нажали на клавишу Soft Key 2";
}
Если форма не умещается на экране целиком, то пользователь может прокрутить ее стилусом с помощью полос прокрутки. Особенно это полезно, если учесть, что .NET Compact Framework 2.0 теперь поддерживает свойство AutoScroll
. Но смартфоны не имеют сенсорного экрана, реагирующего на стилус. Для прокрутки формы надо искать другой вариант.
Например, можно воспользоваться обработкой события KeyDown
. В тестовом проекте надо растянуть форму так, чтобы нижнюю часть не было видно на экране смартфона. На форме надо разместить несколько надписей, причем одна из них должна располагаться в нижней части формы. Для свойства формы AutoScroll
надо задать значение True
. В листинге 9.5 приведен пример кода для прокрутки формы.
private void Form1_KeyDown(object sender, KeyEventArgs e) {
if ((e.KeyCode == System.Windows.Forms.Keys.Up)) {
// Up
this.AutoScrollPosition =
new Point(-this.AutoScrollPosition.X, -this.AutoScrollPosition.Y - 16);
}
if ((e.KeyCode == System.Windows.Forms.Keys.Down)) {
// Down
this.AutoScrollPosition =
new Point(-this.AutoScrollPosition.X, -this.AutoScrollPosition.Y + 16);
}
if ((e.KeyCode == System.Windows.Forms.Keys.Left)) {
// Left
this.AutoScrollPosition =
new Point(-this.AutoScrollPosition.X - 16, -this.AutoScrollPosition.Y);
}
if ((e.KeyCode == System.Windows.Forms.Keys.Right)) {
// Right
this.AutoScrollPosition =
new Point(-this.AutoScrollPosition.X + 16, -this.AutoScrollPosition.Y);
}
}
После запуска приложения можно нажимать на клавиши навигации. Написанный код позволит прокручивать форму в выбранном направлении. Но здесь нас подстерегает одна опасность. Код будет работать лишь тогда, когда форма имеет фокус. Если форма содержит элементы управления, то фокус может находиться у данного элемента. И тогда нажатия на клавиши навигации не принесут желаемого результата. Это ограничение легко обходится добавлением соответствующего обработчика события, как показано в листинге 9.6.
private void Form1_Load(object sender, EventArgs e) {
pictureBox1.Focus();
this.pictureBox1.KeyDown += new KeyEventHandler(Form1_KeyDown);
}
Теперь, даже если фокус находится не у формы, пользователь все равно сможет прокручивать форму при помощи клавиш навигации.