Однажды мой друг, далекий от программирования, попросил меня написать простенький текстовый редактор для карманного компьютера. Его не совсем устраивало приложение Word Mobile, которое используется для работы с текстовыми файлами в операционной системе Windows Mobile. Заказчик хотел получить только основные функции стандартного Блокнота из Windows XP, то есть копирование, вырезание, вставку и удаление текста. Также он хотел обойтись без установки .NET Compact Framework 2.0, так как устаревшая модель его карманного компьютера обладала малой емкостью памяти.
В рамках решения поставленной задачи и была написана программа Блокнотик, которая и будет рассматриваться в этом разделе главы.
Единственная сложность при написании данного текстового редактора состояла в том, что библиотека .NET Compact Framework 1.0 не поддерживает работу с буфером обмена на уровне управляемого кода. Поэтому пришлось прибегать к вызовам функций Windows API.
Данный пример можно использовать в качестве основы для тех, кто хочет написать свой текстовый редактор для .NET Compact Framework 1.0. Надо заметить, что если бы я стал писать свой пример с использованием .NET Compact Framework 2.0, то справиться с задачей было бы гораздо легче, так как вторая версия библиотеки поддерживает буфер обмена, который так необходим при операциях с текстом.
После запуска Visual Studio .NET 2005 надо создать новый проект. При выборе типа проекта надо указать, что будет использоваться .NET Compact Framework 1.0. Для начала на форме следует разместить текстовое поле с именем txtEditor
. Для свойства Multiline
надо задать значение True
, а свойство ScrollBars
получит значение Both
.
Так как текстовое поле обычно занимает все пространство формы, его нужно вручную растянуть до нужного размера. Учитывая, что я писал программу для конкретной модели мобильного устройства, большой ошибки в моих действиях не было. Но не будем забывать, что существуют другие устройства, размеры экрана у которых будут другими. Поэтому стоит устанавливать размеры элементов программно в соответствии с текущими размерами формы.
Также на первом этапе разработки надо указать позицию текстового поля и установить в нем фокус. Соответствующий код был добавлен в обработчик события Form_Load
, что иллюстрирует листинг 7.30.
Листинг 7.30
private void MainForm_Load(object sender, EventArgs e) {
// устанавливаем позицию текстового поля
txtEditor.Location = new Point(0, 0);
// Приравниваем размеры текстового поля к размерам формы
txtEditor.Width = this.Width;
txtEditor.Height = this.Height;
// Устанавливаем фокус
txtEditor.Focus();
}
Если бы программа создавалась для настольного компьютера, то написанный код не вызывал бы никаких сомнений. Но у КПК нет внешней клавиатуры, и для ввода текста используется панель ввода SIP. Поэтому на форму надо добавить элемент inputPanel
. Так как при активации панель ввода закроет часть формы, то надо написать код для вычисления высоты текстового поля для этого случая и соответствующим образом изменить обработчик события Form_Load
, как показано в листинге 7.31.
Листинг 7.31
private void MainForm_Load(object sender, EventArgs e) {
...
// Высоту текстового поля устанавливаем в зависимости от SIP
//txtEditor.Height = this.Height;
SetTextBoxHeight();
}
// устанавливаем размеры текстового поля в зависимости от
// активности SIP
private void SetTextBoxHeight() {
if (SIP.Enabled)
txtEditor.Height = SIP.VisibleDesktop.Height + 2;
else
txtEditor.Height = this.Height;
}
private void SIP_EnabledChanged(object sender, EventArgs e) {
SetTextBoxHeight();
}
Стандартные операции с текстом
На данной стадии уже создан первый прототип приложения. После запуска программы пользователь может вводить и удалять текст с помощью SIP. Но этого недостаточно для комфортной работы с текстом.
Пользователь должен иметь возможность манипулировать текстом, то есть копировать часть текста, вырезать его, удалять и вставлять в нужную позицию. Для этого надо создать меню при помощи элемента mainMenu
. В подменю Правка
надо добавить стандартные команды редактирования текста — Отменить
, Вырезать
, Копировать
, Вставить
. Если бы приложение создавалось для среды исполнения .NET Compact Framework 2.0, то можно было бы использовать класс Clipboard
. Но так как используется .NET Compact Framework 1.0, то придется обратиться к функциям Windows API и использовать неуправляемый код, что иллюстрирует листинг 7.32.
Читать дальше