Программирование КПК и смартфонов на .NET Compact Framework - Александр Климов
Шрифт:
Интервал:
Закладка:
private void button1_Click(object sender, EventArgs e) {
listBox1.SelectedIndex =
SendMessage(listBox1.Handle, LB_FINDSTRINGEXACT, -1, "ball");
}
ListView
Возможно, вы замечали, что в некоторых программах используется элемент ListView с градиентной заливкой. Например, такое оформление интерфейса можно увидеть в списке контактов. Оказывается, совсем не сложно применить такую раскраску в своем приложении. Но для этого надо использовать стиль LVS_GRADIENT, как показано в листинге 4.7.
Листинг 4.7using System.Runtime.InteropServices;
[DllImport("coredll.dll")]
static extern int SendMessage(IntPtr hwnd, uint msg, int wParam, int lParam);
const int LVS_EX_GRADIENT = 0x20000000;
const int LVM_SETEXTENDEDLISTVIEWSTYLE = 0x1000 + 54;
// Создаем градиентный фон для ListView
private void CreateGradientListView(ListView listView) {
// Получим дескриптор ListView
IntPtr hLV = listView.Handle;
// Устанавливаем расширенный стиль
SendMessage(hLV, (uint)LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRADIENT);
// Обновляем вид
listView.Refresh();
}
private void Form1_Load(object sender, EventArgs e) {
CreateGradientListView(listView1);
}
Создание кнопки, содержащей изображение
В статье «How to: Create a Custom Image Button Control», которую можно отыскать по адресу msdn2.microsoft.com/en-us/library/ms172532(VS.80).aspx, описывается процесс создания кнопки, которая может содержать в качестве фона любое изображение. В первых версиях .NET Compact Framework кнопку вообще нельзя было сделать цветной, так как не существовало свойства BackColor. Потом данный недостаток был исправлен, но стандартными средствами пока не получится отобразить на кнопке рисунок. С помощью примера, который приводится в статье, можно обойти это ограничение.
Список с расширенными возможностями
В другой статье — «How to: Create an Owner-Drawn List Box», расположенной по адресу msdn2.microsoft.com/en-us/library/ms229679(VS.80).aspx, — описывается создание списка ListBox с расширенными возможностями. В этом примере показано, как можно использовать графику и различные шрифты для отображения элементов списка.
Текстовое поле для ввода чисел
Очень часто программистам необходимо создавать текстовые поля, в которых можно указывать только числа. В статье «How to: Create a Numeric Text Box», которую можно найти по адресу msdn2.microsoft.com/en-us/library/ms229644(VS.80).aspx, рассказывается об одном из таких способов. Прочитав статью, вы поймете, как создавать текстовые поля, допускающие ввод только чисел, минуса, пробела и разделителя десятичных чисел.
Сортировка элементов ListView
Элемент управления ListView в .NET Compact Framework не поддерживает метод Sort, который позволил бы отсортировать элементы списка. В документации MSDN есть статья «How to: Sort ListView Items», в которой рассказывается о том, как решить эту проблему при помощи метода Sort класса ArrayList и интерфейса IComparer.
Использование элемента DateTimePicker
Элемент управления DateTimePicker появился только в последней версии .NET Compact Framework 2.0. В документации MSDN есть ряд замечательных статей о том, как создать собственный элемент DateTimePicker для программ, работающих на платформе .NET Compact Framework 1.0. Стоит ознакомиться со статьями «Adding Designer Support to the .NET Compact Framework DateTimePicker Control» и «Microsoft .NET Compact Framework-based DateTimePicker Control».
Глава 5
Мышь и клавиатура
Мышь и стилус
Взаимодействие с программой пользователь осуществляет с помощью стилуса или аппаратных кнопок на самом устройстве. А где же мышь и клавиатура? Ну, предположим, что клавиатуру можно заменить ее виртуальным аналогом на экране КПК. Она имеет практически ту же функциональность, что и настоящая клавиатура. Кроме того, следует помнить, что существуют КПК с настоящей, хоть и маленькой, клавиатурой. Что же касается мыши, то ее роль с успехом выполняет стилус.
Но стоит заметить, что у стилуса нет возможности эмулировать нажатие правой кнопки мыши. Когда пользователь применяет стилус, то генерируются события MouseDown, MouseMove, MouseUp и Click. Первые три события могут сообщить о позиции курсора, как и события из настольной версии Windows.
Курсоры
Так как пользователь при работе использует стилус, то Windows Mobile не отображает на экране устройства стандартную стрелку курсора. Предполагается, что пользователь может самостоятельно попасть острым концом стилуса в маленькую кнопку или другой элемент. Но у мобильных систем курсоры все же есть. Первый из них является аналогом песочных часов в настольной версии Windows и выглядит как анимированный круг с разноцветными секторами. Второй курсор можно увидеть при вызове контекстного меню. Он выглядит как множество маленьких красных кружков, которые постепенно появляются вдоль воображаемой окружности.
Песочные часы
При выполнении длительных ресурсоемких операций нужно показать пользователю, что устройство работает, а не зависло. Лучше всего вывести на экран устройства курсор ожидания. В карманных компьютерах в качестве такого курсора используются не песочные часы, как в настольных компьютерах, а анимированный разноцветный круг, Установить данный тип курсора в приложении очень просто, что иллюстрирует фрагмент кода, приведенный в листинге 5.1.
Листинг 5.1// Устанавливаем курсор ожидания
Cursor.Current = Cursors.WaitCursor;
// возвращаем курсор по умолчанию
Cursor.Current = Cursors.Default;
На рис. 5.1 показано приложение с соответствующим курсором.
Рис. 5.1. Отображение курсора ожидания
Обработка события Tap-and-Hold
Так как в карманных компьютерах не используется правая кнопка мыши, то для вызова контекстного меню используется операция Tap-and-Hold. Пользователь касается стилусом экрана и некоторое время удерживает нажатие. Если элемент, на поверхности которого находится стилус, связан с элементом ContexMenu, то на экране появится контекстное меню. А что делать, если мы хотим создать собственный обработчик события Tap-and-Hold? В этом случае надо добавить в проект таймер и написать код для обработки событий Mouse_Down, Mouse_Up и timer1_Tick. Для таймера следует задать интервал, необходимый для инициирования события. Сам код приведен в листинге 5.2.
Листинг 5.2private 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.3private 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). Если протестировать пример на устройстве с настоящей клавиатурой, то можно заметить, что приложение правильно обрабатывает нажатие на встроенные клавиши со стрелками.