Предположим, что нужно создать специальное окно авторизации пользователя для доступа к программе. В состав проекта нужно включить новую форму, которая будет реализована как диалоговое окно проверки имени пользователя LogonForm. Это будет маленькое окно без четко очерченной границы. В нем надо разместить текстовое поле и две кнопки. Затем надо задать значения свойств FormBorderStyle, Size и Location. При загрузке основной формы и обработке события Load создается новый экземпляр объекта LogonForm и вызывается как диалоговое окно. Данное окно может вернуть значения DialogResult.OK, если пользователь ввел имя, или DialogResult.Cancel, если он просто закрыл форму. Если было введено правильное имя, то главная форма продолжает свою работу. В противном случае приложение следует закрыть. Соответствующий код приведен в листинге 7.3.
ВНИМАНИЕ
Чтобы элементы управления диалогового окна были доступны вызывающей форме, их надо объявить с модификатором public. По умолчанию используется модификатор private.
Листинг 7.3
private void Form1_Load(object sender, EventArgs e) {
LogonForm LogonFrm = new LogonForm();
if (LogonFrm.ShowDialog() == DialogResult.Cancel) {
LogonFrm.Dispose();
this.Close();
} else {
this.Text += " - " + LogonFrm.txtCheck.Text;
LogonFrm.Dispose();
}
}
После того как форма авторизации будет отображена на экране, нужно обработать события Click для нажатия кнопки проверки введенного имени пользователя или кнопки отмены. Первая кнопка проверяет правильность ввода имени. Если проверка завершилась успешно, то возвращается значение DialogResult.OK. Это иллюстрирует код, приведенный в листинге 7.4.
Листинг 7.4
private void butOK_Click(object sender, EventArgs e) {
if (txtCheck.Text == "Alex") {
this.DialogResult = DialogResult.OK;
} else {
MessageBox.Show("В доступе отказано. Попробуйте еще раз",
"Вход в программу");
}
}
Если пользователь не знает имени для доступа к программе, то ему придется нажать кнопку Отмена. В этом случае обработчик события butCancel_Click, код которого приведен в листинге 7.5, возвращает значение DialogResult.Cancel в главную форму, которая закрывает приложение.
Листинг 7.5
private void butCancel_Click(object sender, System.EventArgs e) {
this.DialogResult = DialogResult.Cancel;
}
Создание заставки Splash Screen
Многие программы имеют так называемые заставки (splash screen). При загрузке формы сначала отображается окно с логотипом компании, названием продукта и дополнительной информацией. Следует реализовать приложение с подобным экраном, чтобы научиться использовать эту технологию.
Прежде всего надо создать новый проект и добавить к уже имеющейся форме еще одну форму с именем Splash. При запуске приложения заставка появится во весь экран с заданным текстом в центре экрана. Эта форма будет отображаться в течение трех секунд, а затем она автоматически закроется и на экране останется основная форма.
Создание подобного окна практически не отличается от предыдущего примера. Но в этом примере надо использовать таймер, который будет отвечать за появление и закрытие начальной заставки. Эта же форма будет использоваться как диалоговое окно для стандартного пункта меню О программе.
Итак, надо создать дополнительную форму AboutForm и задать значения всех необходимых свойств окна. На форме надо расположить таймер, интервал срабатывания которого будет равен 3 с. Код, реализующий подобное поведение программы, приведен в листинге 7.6.
Листинг 7.6
protected override void OnPaint(PaintEventArgs e) {
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
Graphics g = e.Graphics;
g.DrawString(".NET Compact Framework", this.Font,
new SolidBrush(Color.Blue), Screen.PrimaryScreen.Bounds, sf);
}
private void timer1_Tick(object sender, EventArgs e) {
this.Close();
}
В событии OnPaint формы AboutForm нужно установить свойства для вывода текста. При желании можно добавить отображение логотипа. Через заданный интервал таймер просто закроет это окно. Код для основной формы MainForm приведен в листинге 7.7.
Листинг 7.7
public MainForm() {
InitializeComponent();
#if DEBUG
MinimizeBox = false;
#else
MinimizeBox = true;
#endif
AboutForm about = new AboutForm();
about.ShowDialog();
}
private void mnuAbout_Click(object sender, EventArgs e) {
AboutForm about = new AboutForm();
about.ShowDialog();
}
Теперь при запуске приложения на экране сначала будет отображаться заставка. После истечения трех секунд она исчезнет, и пользователь увидит основную форму.
Устройства с операционной системой Pocket PC 2003 Second Edition и старше обрели долгожданную возможность поворачивать содержимое экрана. Раньше пользователям приходилось устанавливать дополнительные программы для достижения такого эффекта. А разработчики получили возможность управлять поворотами экрана управляемыми методами только в .NET Compact Framework 2.0. Но зато теперь это можно сделать буквально одной строкой кода. Тем, кто по ряду причин должен по-прежнему использовать .NET Compact Framework 1.0, придется задействовать сложный код с вызовами функций API, который приведен в листинге 7.8. Сначала надо установить ссылку на пространство имен Microsoft.WindowsCE.Forms. После этого следует просто использовать нужные свойства класса SystemSettings.
Листинг 7.8.
using Microsoft.WindowsCE.Forms;
// запоминаем настройки экрана
ScreenOrientation initialOrientation = SystemSettings.ScreenOrientation;
private void butRot90_Click(object sender, EventArgs e) {
// поворачиваем экран на 90 градусов
SystemSettings.ScreenOrientation = ScreenOrientation.Angle90;
}
private void butRestore_Click(object sender, EventArgs e) {
// восстанавливаем старую ориентацию
if (SystemSettings.ScreenOrientation != initialOrientation) {
try {
SystemSettings.ScreenOrientation = initialOrientation;
} catch (Exception) {
// Невозможно вернуться к старым настройкам
MessageBox.Show("He могу восстановить " +
"предыдущую ориентацию экрана.");
}
}
}
Рекомендации по дизайну форм
Компания Microsoft выработала определенные рекомендации по дизайну форм, которых следует придерживаться. Эти рекомендации можно найти в документации MSDN. Так, например, в одной из статей указывается, что в некоторых случаях пользователь предпочитает пользоваться пальцами вместо стилуса. Поэтому, если форма содержит кнопки, то они должны быть достаточно большими, чтобы было удобно нажимать на них.
Рекомендуемые размеры кнопок для Pocket PC составляют 21×21 пикселов, если пользователь применяет стилус, и 38×38 пикселов, если он предпочитает нажимать кнопки пальцами. Также надо предусмотреть свободное пространство между элементами, чтобы избежать ошибочных нажатий. Если маленькие кнопки для копирования и удаления файлов находятся рядом, то пользователи не раз вспомнят вас недобрым словом при неаккуратном нажатии на кнопки.
В то же время следует группировать часто используемые элементы, чтобы пользователю не пришлось часто перемещать стилус. Это тоже достаточно утомительно. Понятно, что к играм эти рекомендации не относятся. В них действуют свои законы.
До сих пор мы с вами изучали примеры, которые могли бы стать частью настоящих программ. Но сейчас пришло время написать несколько приложений, которые уже можно использовать в реальной жизни. Так получилось, что первые две программы были написаны для смартфонов, о которых речь пойдет в дальнейших главах. Но при помощи этих примеров можно получить представление о программировании для этого класса устройств. К тому же, на их основе можно написать аналогичный пример для карманных компьютеров, что поможет увидеть сходство в написании приложений для разных типов устройств.
Файловый менеджер для смартфона
Смартфоны под управлением Windows Mobile 2005 не имеют в составе системы приложения, которое позволяет просматривать содержимое папок и файлов. В этом разделе будет рассматриваться аналог Проводника для смартфона. Основой данного примера послужил великолепный проект с открытым исходным кодом, который находится на сайте www.businessanyplace.net/?p=spfileman. Автор проекта Кристиан Форсберг (Christian Forsberg) любезно разрешил использовать его программу в качестве учебного пособия для этой книги.
Интересна история создания этого приложения. Сам автор оригинальной версии писал программу еще на Visual Studio .NET 2003 для смартфонов под управлением системы Smartphone 2003. Когда я скачал исходный код и попытался запустить его, то среда разработки Visual Studio .NET 2005 предложила конвертировать проект. Я согласился, в результате получил новую версию проекта. Теперь, после переделки, проект запускался в Visual Studio 2005 и использовал эмулятор Smartphone 2003. Но мне захотелось использовать пример для смартфонов Windows Mobile 2005. Для этого достаточно было в свойствах проекта выбрать другую платформу. Снова несколько минут раздумий, и Visual Studio выдает еще раз переделанный проект. Но и этого мне мало. Проект по-прежнему использует .NET Compact Framework 1.0. После выбора нужных значений свойств проекта, он стал использовать .NET Compact Framework 2.0. Осталось лишь перевести некоторые команды на русский язык и ввести новые возможности .NET Compact Framework 2.0 вместо старых конструкций, которые применялись для .NET Compact Framework 1.0.