Александр Климов - Программирование КПК и смартфонов на .NET Compact Framework
File.Move(clipboardFileName, dest);
break;
case ClipboardAction.Copy:
File.Copy(clipboardFileName, dest, false);
break;
}
clipboardAction = ClipboardAction.None;
clipboardFileName = string.Empty;
fillList();
}
Перед тем как вставить файл в другую папку, нужно удостовериться, что в ней нет файла с таким именем. Если же такой файл существует, то надо предупредить пользователя и узнать, что он хочет сделать. Код для команды Вставить ярлык приведен в листинге 7.15.
Листинг 7.15private void pasteShortcutMenuItem_Click(object sender, System.EventArgs e) {
int i = 2;
string s = string.Empty;
string dest;
while(true) {
dest = path + "Shortcut" + s + " to " +
Path.GetFileName(Path.GetFileNameWithoutExtension(clipboardFileName) +
".lnk");
if (!File.Exists(dest)) break;
s = " (" + i.ToString() + ")";
i++;
}
StreamWriter sw = new StreamWriter(dest);
s = clipboardFileName;
if(s.IndexOf(" ") > 0)
s = """ + s + """;
s = s. Length.ToString() + "#" + s;
sw.WriteLine(s);
sw.Close();
fillList();
}
В этом коде создается уникальное имя ярлыка, которое затем записывается в виде файла с добавлением. К имени ярлыка добавляется расширение .LNK.
Код для команды Переименовать приведен в листинге 7.16.
Листинг 7.16private void renameMenuItem_Click(object sender, System.EventArgs e) {
Cursor.Current = Cursors.WaitCursor;
istViewItem lvi = listView.Items[listView.SelectedIndices[0]];
bool isFolder = lvi.ImageIndex = 0;
string s;
if (isFolder)
s = "папку";
else s = "файл";
NameForm nameForm =
new NameForm(this, "Переименовать " + s, lvi.Text,
new SetNameDelegate(SetRename));
if (nameForm.ShowDialog() = DialogResult.OK) fillList();
listView.Focus();
}
Сначала обрабатывается текущий выделенный элемент. Если пользователь выделил папку, то для формы nameForm задается соответствующий заголовок Переименовать папку. Также из этой формы передается в основную форму новое имя папки или файла с помощью метода Set Rename, как это показано в листинге 7.17.
Листинг 7.17/// <summary>
/// Метод для переименования папки или файла
/// </summary>
/// <param name="name">Имя папки или файла</param>
public void SetRename(string name) {
ListViewItem lvi = listView.Items[listView.SelectedIndices[0]];
bool isFolder = lvi.ImageIndex == 0;
string itemName = path + lvi.Text;
string destName =
Path.GetDirectoryName(itemName) +
Path.DirectorySeparatorChar.ToString() + name;
if (isFolder)
Directory.Move(itemName, destName);
else
File.Move(itemName, destName);
}
После того как будет получена информация о выделенном элементе, он переименовывается. Для реализации команды Удалить используется код, приведенный в листинге 7.18.
Листинг 7.18private void deleteMenuItem_Click(object sender,
System.EventArgs e) {
ListViewItem lvi = listView.Items[listView.SelectedIndices[0]];
bool isFolder = lvi.ImageIndex == 0;
string s = "Are you sure you want to delete " + lvi.Text;
if (isFolder)
s += " and all its content";
s += "?";
if (MessageBox.Show(s, this.Text, MessageBoxButtons.YesNo,
MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) ==
DialogResult.Yes) {
if (isFolder)
Directory.Delete(path + lvi.Text, true);
else
File.Delete(path + lvi.Text);
fillList();
}
Перед удалением папки или файла запрашивается подтверждение действий пользователя. Для создания новой папки используется следующий код, приведенный в листинге 7.19.
Листинг 7.19private void newFolderMenuItem_Click(object sender, System.EventArgs e) {
Cursor.Current = Cursors.WaitCursor;
ListViewItem lvi = listView.Items[listView.SelectedIndices[0]];
NameForm nameForm = new NameForm(this, "Новая папка", "",
new SetNameDelegate(SetNewName));
if (nameForm.ShowDialog() == DialogResult.OK) fillList();
listView.Focus();
}
В результате действия этой функции отображается форма NameForm с заголовком Новая папка. Эта форма также передает информацию в главную форму при помощи метода SetNewName, который приведен в листинге 7.20.
Листинг 7.20/// <summary>
/// Устанавливает новое имя для папки
/// </summary>
/// <param name="name">Имя для папки</name>
public void SetNewName(string name) {
Directory.CreateDirectory(path + name);
}
Метод создает папку с заданным именем. Как видно, код его чрезвычайно прост.
Код для выполнения команды Свойства приведен в листинге 7.21.
Листинг 7.21private void propertiesMenuItem_Click(object sender, System.EventArgs e) {
Cursor.Current = Cursors.WaitCursor;
ListViewItem lvi = listView.Items[listView.SelectedIndices[0]];
FileInfo fi = new FileInfo(path + lvi.Text);
PropertiesForm propertiesForm =
new PropertiesForm(this, fi, new SetNameDelegate(SetRename),
new SetAttributesDelegate(SetAttributes));
if (propertiesForm.ShowDialog() == DialogResult.OK) fillList();
listView.Focus();
}
Этот код вызывает форму PropertiesForm, которая отображает атрибуты выбранного файла или папки. Также в этой форме пользователь может изменять атрибуты файла при помощи метода SetAttributes, код которого приведен в листинге 7.22.
Листинг 7.22public void SetAttributes(FileAttributes fileAttributes) {
ListViewItem lvi = listView.Items[listView.SelectedIndices[0]];
bool isFolder = lvi.ImageIndex = 0;
if (isFolder) {
DirectoryInfo di = new DirectoryInfo(path + lvi.Text);
di.Attributes = fileAttributes;
} else {
FileInfo fi = new FileInfo(path + lvi.Text);
fi.Attributes = fileAttributes;
}
}
Для создания градиентной заливки соответствующего элемента интерфейса применяется метод, код которого приведен в листинге 7.23.
Листинг 7.23public static void SetGradient(System.Windows.Forms.ListView listView) {
// Новый вариант
// Для .NET Compact Framework 2.0
SendMessage(listView.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE,
LVS_EX_GRADIENT);
listView.Refresh();
}
Итак, основные трудности реализации программы рассмотрены. Кроме того, в примере присутствуют вызовы функций Windows API для работы с табличным списком ListView. Эти примеры рассматривались в главе 4, поэтому не стоит повторять их разбор. На самом деле эту программу можно улучшать до бесконечности, добавляя новые функциональные возможности. Надеюсь, у вас это получится. Буду рад, если вы пришлете свои варианты примеров, которые, на ваш взгляд, украсят программу.
Диспетчер задач
Но мы с вами не расстаемся с программами, написанными Кристианом Форсбергом. На его сайте можно найти еще одну полезную программу, необходимую как разработчику, так и пользователю. Это Диспетчер задач (Task Manager). Программа подобного рода тоже отсутствует в стандартной поставке Windows Mobile. А ведь эта программа очень полезна в работе. Владелец смартфона под управлением системы Windows Mobile может узнать много нового о своей системе после запуска этой утилиты. Диспетчер задач покажет все программы, которые размещаются в памяти смартфона, отбирая системные ресурсы. Диспетчер задач также позволяет удалять из памяти ненужные программы и процессы. Не случайно, многие производители сами снабжают свои устройства программами подобного типа. Если вам не повезло и у вас нет такой программы, то вы можете сами написать Диспетчер задач.
Как и предыдущий пример, оригинальная версия программы была написана на Visual Studio 2003 для смартфонов под управлением Windows Mobile 2003 на платформе .NET Compact Framework 1.0. Следуя нашей традиции, я с согласия автора конвертировал проект для Visual Studio 2005 для целевой системы Windows Mobile 5.0 и с применением .NET Compact Framework 2.0.
Графический интерфейс программы
Диспетчер задач при запуске показывает список запущенных программ (рис. 7.5).
Рис. 7.5. Внешний вид программы
С помощью меню, размещенного в левой части окна, можно активировать выбранное приложение. При этом сам менеджер задач закрывается. Меню, расположенное в правой части окна, предоставляет пользователю несколько больше возможностей. Команды этого меню приведены в следующем списке:
□ Обновить — обновляет список запущенных программ;
□ Процессы — показывает список запущенных процессов;
□ Остановить — останавливает выбранную программу;
□ Остановить все — останавливает все запущенные программы;
□ Вид — показывает информацию о процессе;
Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Александр Климов - Программирование КПК и смартфонов на .NET Compact Framework, относящееся к жанру Программирование. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.


