Программирование КПК и смартфонов на .NET Compact Framework — страница 8 из 41

Рис. 5.1. Отображение курсора ожидания

Обработка события Tap-and-Hold

Так как в карманных компьютерах не используется правая кнопка мыши, то для вызова контекстного меню используется операция Tap-and-Hold. Пользователь касается стилусом экрана и некоторое время удерживает нажатие. Если элемент, на поверхности которого находится стилус, связан с элементом

ContexMenu
, то на экране появится контекстное меню. А что делать, если мы хотим создать собственный обработчик события Tap-and-Hold? В этом случае надо добавить в проект таймер и написать код для обработки событий
Mouse_Down
,
Mouse_Up
и
timer1_Tick
. Для таймера следует задать интервал, необходимый для инициирования события. Сам код приведен в листинге 5.2.

Листинг 5.2

private void Form1_MouseDown(object sender, MouseEventArgs e) {

 // включаем таймер

 timer1.Enabled = true;

}


private void Form1_MouseUp(object sender, MouseEventArgs e) {

 timer1.Enabled = false;

 label1.Text = "";

}


private void timer1_Tick(object sender, EventArgs e) {

 label1.Text = "Вы нажали на экран";

}

Клавиатура

На большинстве карманных компьютеров нет стандартной клавиатуры, поэтому ввод текста осуществляется с помощью виртуальной клавиатуры SIP. В Visual Studio 2005 клавиатура SIP представлена элементом

InputPanel
. Но в последнее время стали появляться устройства с настоящей встроенной клавиатурой. Как правило, эти устройства имеют квадратный экран. Среда разработки поддерживает эмуляторы подобных моделей (рис. 5.2). Эти эмуляторы в своем названии содержат слово «Square».

Рис. 5.2. Эмулятор устройства с клавиатурой

Кроме того, на устройствах имеются клавиши навигации, клавиша

Enter
и кнопки запуска определенных приложений. Все эти клавиши могут обрабатывать стандартные события.

Клавиши навигации

Если вы в процессе создания приложения в режиме работы с формой щелкнуть мышью на любой из кнопок навигации, то среда разработки сгенерирует код для этих кнопок в событии

Form_KeyDown
. В листинге 5.3 приведен пример обработчика этого события.

Листинг 5.3

private void Form1_KeyDown(object sender, KeyEventArgs e) {

 if ((e.KeyCode == System.Windows.Forms.Keys.Up)) {

  label1.Text = "Клавиша Вверх";

 }

 if ((e.KeyCode = System.Windows.Forms.Keys.Down)) {

  label1.Text = "Клавиша Вниз";

 }

 if ((e.KeyCode == System.Windows.Forms.Keys.Left)) {

  label1.Text = "Клавиша Влево";

 }

 if ((e.KeyCode == System.Windows.Forms.Keys.Right)) {

  label1.Text = "Клавиша Вправо";

 }

 if ((e.KeyCode == System.Windows.Forms.Keys.Enter)) {

  label1.Text = "Клавиша Enter";

 }

}


Как видите, приложение определяет нажатую клавишу при помощи перечисления

System.Windows.Forms.Keys
. Если открыть виртуальную клавиатуру и нажать на клавиши со стрелками, то можно убедиться, что они тоже инициируют событие
Form_KeyDown
(рис. 5.3). Если протестировать пример на устройстве с настоящей клавиатурой, то можно заметить, что приложение правильно обрабатывает нажатие на встроенные клавиши со стрелками.

Рис. 5.3. Обработка нажатий клавиш навигации

Выключение устройства

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

keybd_event
, как показано в листинге 5.4.

Листинг 5.4

/// 

/// Функция имитирует нажатия клавиш на клавиатуре

/// 

/// Виртуальный код клавиши для имитации

/// нажатия и отпускания клавиши

/// Зарезервировано - установлено в 

// 0

/// Флаг

/// Дополнительная информация

[DllImport("coredll.dll", CharSet = CharSet.Unicode)]

public static extern void

keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);


// константа для кнопки выключения устройства

public const int VK_OEM_8 = 0xDF;


private void butOff_Click(object sender, EventArgs e) {

 // Имитируем нажатие кнопку выключения устройства

 keybd_event(VK_OEM_8, 0, 0, 0);

}

Дополнительные материалы

Если вы хотите узнать о клавиатуре еще больше, то стоит обратить внимание на блог Алекса Яхнина, который можно найти по адресу blog.opennetcf.org/ayakhnin. Там можно найти статью «Keyboard hook in the CF v2». В данной статье рассказывается о перехвате всех сообщений, которые посылаются при нажатии любых кнопок устройства. Также может быть полезна статья «Custom SIP Control for CF». Автор статьи предлагает собственную реализацию элемента

InputControl
, который содержит свою виртуальную клавиатуру. Этот пример может пригодиться при создании приложения, в котором не используется стандартная панель ввода SIP, но при этом пользователь должен иметь возможность ввода информации.

Глава 6Графика

Классы для программирования графики

Программирование графики в .NET Compact Framework опирается на те же базовые приемы, что и работа с графикой для полной версии .NET Framework. Все основные классы для работы с графикой сосредоточены в пространстве имен

System.Drawing
. С помощью этих классов можно рисовать всевозможные фигуры, отображать линии, работать с изображениями и даже манипулировать текстом. В качестве своеобразного холста для графических опытов можно использовать поверхность формы или элементов управления. Самым главным классом является класс
Graphics
, который предоставляет поверхность и методы для вывода графики. Также широко используются в графике такие классы, как
Pen
,
Brush
,
Color
,
Rectangle
,
Line
,
Image
.

Класс Pen

Класс

Pen
используется для создания пера, при помощи которого проводятся прямые и кривые линии. В отличие от полной версии .NET Framework, поддерживающей четыре перегруженных версии конструктора
Pen
, .NET Compact Framework позволяет создавать перо только с помощью двух конструкторов. При вызове метода
Pen(Color)
создается перо указанного цвета. Конструктор
Pen(Color, Single)
позволяет создавать перо указанных цвета и ширины. Но второй вариант поддерживается только в .NET Compact Framework 2.0.

В листинге 6.1 приведен пример создания перьев синего и красного цветов. Затем при помощи перьев создаются две линии.

Листинг 6.1

private void Form1_Paint(object sender, PaintEventArgs e) {

 Graphics g = e.Graphics;

 // Синее перо толщиной 1 пиксел

 Pen bluePen = new Pen(Color.Blue);

 // Красное перо толщиной 5 пикселов

 Pen redFatPen = new Pen(Color.Red, 5);

 g.DrawLine(bluePen, 10, 10, 230, 10);

 g.DrawLine(redFatPen, 10, 20, 230, 20);

}

Класс Brush