Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Благодарности 15 страница






Событие BeforeExpand возникает при попытке пользователя раскрыть узел дерева. В этом случае наш обработчик заполняет открываемый узел при помощи рассмотренного ранее метода GetDirs. Ссылка на узел извлекается из поля e.Node.Nodes, передаваемого обработчику событий в качестве параметра.

После создания обработчика события BeforeExpand появится возможность раскрывать узлы дерева (рис. 7-14).

Рис. 7-14. Теперь узлы дерева можно раскрывать

Добавление значков к узлам дерева

Вы можете улучшить внешний вид дерева, показанного на рис. 7-14, если добавить к его узлам значки дисковых устройств и каталогов (папок). Как правило, большинство подобных деревьев всегда «украшается» значками.

Для нашего дерева Вы можете найти подходящие значки в каталоге с названием Program Files\Microsoft Visual Studio.NET\Common7\Graphics\icons. Выберите один значок для диска, один для закрытой папки и один для открытой папки.

Далее скопируйте эти значки в каталог проекта приложения FramesApp и подключите их к проекту. Чтобы подключить флажки к проекту, выберите из меню Project системы Microsoft Visual Studio.NET строку Add Existing Item, а затем добавьте файлы значков при помощи появившегося на экране диалогового окна.

Создание списка изображений

Чтобы использовать изображения в дереве, их необходимо объединить в список класса ImageList. Добавьте этот список в приложение, перетащив значок компонента ImageList в окно проектирования формы из панели Toolbox (рис. 7-15).

Рис. 7-15. Добавили элемент управления ImageList

Выделив элемент imageList1 левой клавишей мыши, отредактируйте его свойство Images. Для редактирования будет открыто окно Image Collection Editor, показанное на рис. 7-16.

Рис. 7-16. Добавили значки диска и папок

Воспользуйтесь кнопкой Add для добавления в список файлов изображений, скопированных ранее в каталог нашего приложения. Изображения следует разместить в том порядке, в каком они показаны на рис. 7-16. А именно, первым (с индексом 0) должно идти изображение для диска, вторым (с индексом 1) — изображение закрытой папки, и, наконец, третьим (с индексом 2) — изображение открытой папки.

Подключение списка изображений к дереву

Создав и заполнив список изображений, подключите его к дереву просмотра дисков и каталогов. Для этого отредактируйте свойство ImageList элемента управления treeView1, присвоив ему ссылку на список изображений imageList1 (рис. 7-17).

Рис. 7-17. Подключили список изображений к дереву

Изменения в исходном тексте программы

Теперь для отображения значков в узлах дерева нам необходимо изменить исходный текст методов DriveTreeInit и GetDirs. Напомним, что первый из этих методов инициализирует дерево, а второй — добавляет к узлу дерева список каталогов.

Обратите внимание на конструктор класса TreeNode, создающий узлы дерева внутри тела цикла foreach:

public void DriveTreeInit()
{
string[] drivesArray = Directory.GetLogicalDrives();

treeView1.BeginUpdate();
treeView1.Nodes.Clear();

foreach(string s in drivesArray)
{
TreeNode drive = new TreeNode(s, 0, 0);
treeView1.Nodes.Add(drive);

GetDirs(drive);
}

treeView1.EndUpdate();
}

Этот конструктор имеет три параметра. Про первый параметр мы уже рассказывали — он задает текст надписи для узла дерева. Теперь настало время рассказать и про два остальных параметра.

Если к элементу управления TreeView подключен список изображений, то второй и третий параметры конструктора класса TreeNode задают индексы изображений для узла дерева. При этом второй параметр определяет изображение невыделенного узла дерева, а третий — выделенного.

Что касается метода DriveTreeInit, то расположенный в нем конструктор создает узлы, отображающий только дисковые устройства. В любом состоянии (как выделенном, так и невыделенном) нам необходимо отображать один и тот же значок дискового устройства, имеющий в нашем случае индекс 0. Поэтому второй и третий параметры конструктора передают нулевые значения.

Другое дело — метод GetDirs:

public void GetDirs(TreeNode node)
{
DirectoryInfo[] diArray;
node.Nodes.Clear();
string fullPath = node.FullPath;
DirectoryInfo di = new DirectoryInfo(fullPath);

try
{
diArray = di.GetDirectories();
}
catch
{
return;
}

foreach (DirectoryInfo dirinfo in diArray)
{
TreeNode dir = new TreeNode(dirinfo.Name, 1, 2);
node.Nodes.Add(dir);
}
}

Здесь конструктору класса TreeNode, размещенному внутри оператора цикла foreach, через второй и третий параметры мы передаем индексы значков закрытой и открытой папки, соответственно. В результате при отображении дерева папки, которые выделил пользователь, выделяются своим обозначением (рис. 7-18).

Рис. 7-18. Дерево со значками дисковых устройств и папок

Что же касается дисковых устройств, то все они отображаются одним и тем же значком.

К сожалению, среди многочисленных классов библиотеки Microsoft.NET Framework нам не удалось найти ни одного, позволяющего получить физические параметры дисковых устройств. Поэтому мы не смогли использовать отдельные значки для НГМД, сменных устройств памяти и устройств CD-ROM.

Тем не менее, средства Microsoft.NET Framework позволяют программам C# обращаться к программному интерфейсу OC Win32 API, поэтому после соответствующей доработки приложения можно будет использовать разные значки для изображения устройств внешней памяти разного типа.

Добавление флажков к узлам дерева

Присвоив свойству CheckBoxes значение True можно снабдить узлы дерева индивидуальными флажками (рис. 7-19).

Рис. 7-19. Флажками можно отмечать устройства и папки

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

Редактирование текста узлов дерева

Изменив значение свойства LabelEdit на True можно разрешить пользователям редактировать текстовые надписи, расположенные около узлов дерева (рис. 7-20).

Рис. 7-20. Редактирование текста узлов дерева

Если дерево связано, например, с файловой системой, то такая возможность пригодится для переименования папок.

Список ListView

В правом верхнем фрейме нашего приложения мы расположили элемент управления ListView. Этот элемент обладает расширенными возможностями отображения списков различных объектов, имеющих линейную структуру. В нашем случае этот элемент управления будет использован для отображения содержимого каталогов, примерно в таком же виде, как это показано в правой части окна программы Windows Explorer (рис. 7-1).

Создание и настройка списка ListView

Когда Вы перетаскиваете значок элемента управления ListView в окно приложения, дизайнер форм автоматически напишет для Вас код, создающий список как объект класса ListView. Для использования в нашем приложении необходимо настроить некоторые свойства списка.

Режимы отображения

Прежде всего, необходимо настроить свойство View. Это свойство определяет, в каком виде будет отображаться список. Если значение этого свойства равно Details, то мы увидим содержимое списка в виде детализированной таблицы. Именно это значение и потребуется нам в приложении FramesApp. Значение List задает режим отображения в виде простого списка, а значения SmallIcon и LargeIcon — в виде списка со значками маленького и большого размера, соответственно.

Итак, первым делом выделите список ListView в окне дизайнера форм и установите для свойства View значение Details.

При необходимости программа сможет динамически переключать режимы отображения, изменяя значение свойства View во время своей работы.

Создание и настройка столбцов таблицы

Так как мы будем отображать список в виде таблицы, нам необходимо создать столбцы таблицы и определить их атрибуты. Для этого необходимо отредактировать свойство Columns. Это делается при помощи редактора ColumnHeader Collection Editor, показанного на рис. 7-21.

Рис. 7-21. Редактор столбцов списка

С помощью кнопки Add добавьте в таблицу три столбца, а затем настройте свойства Text, TextAlign и Width этих столбцов.

Свойство Text задает название столбца, отображаемого в верхней части списка ListView. Первый столбец (с индексом 0) должен называться Имя, второй — Размер, а третий — Изменен.

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

Свойство TextAlign задает выравнивание заголовка столбца. По умолчанию это свойство имеет значение Left, задающее выравнивание по левой границе. При необходимости Вы можете выровнять текст по правой границе, указав значение Right, или вывести заголовки по центру с помощью значения Center.

С помощью свойства Width можно указать начальную ширину столбца в пикселах. После отображения списка пользователь сможет изменять ширину столбцов при помощи мыши.

После того как Вы создадите столбцы и определите их атрибуты, оттранслируйте приложение FramesApp и запустите его на выполнение. Теперь в правом верхнем фрейме приложения появится пустой список с заголовками (рис. 7-22).

Рис. 7-22. Появились заголовки столбцов

Сортировка содержимого списка

Свойство Sorting, задающее сортировку списка, может иметь значения None, Ascending и Descending.

В первом случае список отображает элементы в том порядке, в котором они были добавлены. Значение Ascending задает сортировку в порядке возрастания, а значение Descending — в порядке убывания.

Подключение значков к списку

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

В приложении FramesApp мы будем использовать 6 значков для отображения папок и файлов различных типов (файлы исполнимых программ, файлов справочной системы, текстовых файлов, файлов документов и пр.).

Создавая приложение, скопируйте файлы значков CLSDFOLD.BMP, DOC.BMP, EXE.BMP, HLP.BMP, TXT.BMP и WINDOC.BMP из папки Program Files\Microsoft Visual Studio.NET\Common7\Graphics\bitmaps\Outline\NoMask, а затем добавьте их к проекту приложения.

Для работы с этими значками нам потребуется еще один список изображений ImageList. Перетащите его значок их панели Toolbar в окно дизайнера форм. Новый список будет иметь идентификатор imageList2.

Отредактируйте этот список, как показано на рис. 7-23.

Рис. 7-23. Список изображений для списка каталогов и файлов

Необходимо расположить файлы списка в следующем порядке:

 CLSDFOLD.BMP;

 DOC.BMP;

 EXE.BMP;

 HLP.BMP;

 TXT.BMP;

 WINDOC.BMP

В нашем приложении список ListView отображается только в одном режиме, а именно, как детализированная таблица. Такая таблица снабжается значками только маленького размера. Если же Ваше приложение будет использовать режим LargeIcon, необходимо подготовить дополнительный список ImageList, добавив в него файлы значков большого размера.

Подготовив список изображений imageList2, подключите его к элементу управления ListView. Для этого присвойте свойствам SmallImageList, LargeImageList значение imageList2.

В том случае, если список ListView будет показывать значки и маленьких, и больших размеров, присвойте свойству SmallImageList идентификатор списка изображений маленького размера, а свойству LargeImageList — идентификатор списка изображений большого размера.

Наполнение списка ListView

В общем случае список ListView содержит элементы, каждый из которых имеет дополнительные элементы более низкого уровня, которые мы будем называть атрибутами. Сам элемент представляется текстовой строкой (и, возможно, значком) в первом столбце списка, отображаемого в виде детализированной таблицы. Значения остальных атрибутов отображаются в остальных столбцах таблицы (можно также создавать неотображаемые атрибуты элементов списка, содержащие произвольные данные).

Алгоритм наполнения списка

Алгоритм наполнения списка достаточно прост. Прежде всего, необходимо очистить список от предыдущего содержимого, т.к. наполнение одного и того же списка может происходить неоднократно. Эта операция выполняется с помощью метода Clear свойства Items списка:

listView1.Items.Clear();

Далее для добавления элемента в список нужно создать новый элемент как объект класса ListViewItem:

ListViewItem lvi = new ListViewItem(" myfile.txt");

В качестве параметра конструктору передается текстовая строка имени файла. Она отображается в первом столбце детализированной таблицы.

Далее нужно добавить атрибуты элемента. Данная операция выполняется с помощью метода SubItems.Add:

lvi.SubItems.Add(" 1024");
lvi.SubItems.Add(" 10-05-2003");

Здесь мы добавляем к элементу два атрибута, первый из которых представляет собой размер файла, а второй — дату его создания.

Если к элементу управления ListView добавлены списки изображений значков, то при создании элемента списка необходимо указать индекс нужного значка. Это делается с помощью свойства ImageIndex:

lvi.ImageIndex = 4;

После того как все атрибуты элемента определены, Вы можете добавить элемент в список при помощи метода Add:

listView1.Items.Add(lvi);

В нашем приложении FramesApp наполнение списка будет происходить в цикле.

Обработчик события AfterSelect

Теперь нашей задачей будет наполнить функциональностью список ListView. Когда пользователь выделяет диск или каталог в дереве просмотра TreeView, создается событие AfterSelect. Обработчик этого события должен определить, какой диск или какой каталог был выделен, а затем наполнить окно списка ListView именами каталогов и файлов, расположенных на этом диске или в этом каталоге.

Создайте обработчик события AfterSelect в таком виде, как это показано ниже:

private void treeView1_OnAfterSelect(object sender,
System.Windows.Forms.TreeViewEventArgs e)
{
TreeNode selectedNode = e.Node;
fullPath = selectedNode.FullPath;

DirectoryInfo di = new DirectoryInfo(fullPath);
FileInfo[] fiArray;
DirectoryInfo[] diArray;

try
{
fiArray = di.GetFiles();
diArray = di.GetDirectories();
}
catch
{
return;
}

listView1.Items.Clear();

foreach(DirectoryInfo dirInfo in diArray)
{
ListViewItem lvi = new ListViewItem(dirInfo.Name);
lvi.SubItems.Add(" 0");
lvi.SubItems.Add(dirInfo.LastWriteTime.ToString());
lvi.ImageIndex = 0;

listView1.Items.Add(lvi);
}


foreach(FileInfo fileInfo in fiArray)
{
ListViewItem lvi = new ListViewItem(fileInfo.Name);
lvi.SubItems.Add(fileInfo.Length.ToString());
lvi.SubItems.Add(fileInfo.LastWriteTime.ToString());

string filenameExtension =
Path.GetExtension(fileInfo.Name).ToLower();

switch (filenameExtension)
{
case ".com":
{
lvi.ImageIndex = 2;
break;
}
case ".exe":
{
lvi.ImageIndex = 2;
break;
}
case ".hlp":
{
lvi.ImageIndex = 3;
break;
}
case ".txt":
{
lvi.ImageIndex = 4;
break;
}
case ".doc":
{
lvi.ImageIndex = 5;
break;
}
default:
{
lvi.ImageIndex = 1;
break;
}
}

listView1.Items.Add(lvi);
}
}

Расскажем о том, как работает этот обработчик событий.

Прежде всего, метод извлекает ссылку на узел дерева, выделенный пользователем, из свойства Node параметра обработчика событий treeView1_OnAfterSelect.

TreeNode selectedNode = e.Node;

Далее, полный путь к выделенному узлу записывается в поле fullPath класса string (Вам необходимо создать такое поле в классе Form1):

fullPath = selectedNode.FullPath;

Так как наше дерево содержит только обозначения дисков и каталогов, то это будет путь либо к корневому каталогу диска, либо к одному из подкаталогов.

Далее мы создаем объект класса DirectoryInfo и получаем списки всех файлов и каталогов, располагающихся в каталоге, выделенном пользователем в дереве:

DirectoryInfo di = new DirectoryInfo(fullPath);
FileInfo[] fiArray;
DirectoryInfo[] diArray;

try
{
fiArray = di.GetFiles();
diArray = di.GetDirectories();
}
catch
{
return;
}

Для выполнения этих операций применяются методы GetFiles и GetDirectories. Перечень файлов обработчик события сохраняет в массиве fiArray, а перечень каталогов — в массиве diArray.

Вооружившись перечнями файлов и каталогов, мы приступим к добавлению элементов к нашему списку ListView, очистив предварительно содержимое списка методом Clear:

listView1.Items.Clear();

Наполнение списка именами каталогов выполняется в цикле foreach:

foreach(DirectoryInfo dirInfo in diArray)
{
ListViewItem lvi = new ListViewItem(dirInfo.Name);
lvi.SubItems.Add(" 0");
lvi.SubItems.Add(dirInfo.LastWriteTime.ToString());
lvi.ImageIndex = 0;

listView1.Items.Add(lvi);
}

Все выполняемые здесь действия были описаны ранее. С помощью конструктора класса ListViewItem мы создаем элемент списка, а затем задаем значения атрибутов этого элемента. Длина каталогов считается равной нулю, а время последнего изменения каталога извлекается при помощи метода LastWriteTime и преобразуется в текстовую строку методом ToString.

В свойство lvi.ImageIndex записывается нулевое значение — индекс значка в списке изображений imageList2 с изображением закрытой папки.

После заполнения всех атрибутов элемента списка этот элемент добавляется в список методом listView1.Items.Add.

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

foreach(FileInfo fileInfo in fiArray)
{
ListViewItem lvi = new ListViewItem(fileInfo.Name);
lvi.SubItems.Add(fileInfo.Length.ToString());
lvi.SubItems.Add(fileInfo.LastWriteTime.ToString());

string filenameExtension =
Path.GetExtension(fileInfo.Name).ToLower();

switch (filenameExtension)
{
case ".com":
{
lvi.ImageIndex = 2;
break;
}

case ".doc":
{
lvi.ImageIndex = 5;
break;
}
default:
{
lvi.ImageIndex = 1;
break;
}
}

listView1.Items.Add(lvi);
}

Размер очередного файла мы получаем с помощью свойства Length, а дату последнего изменения — с помощью свойства LastWriteTime (как и для каталогов).

Что же касается значков, то тут алгоритм немного сложнее. Нам нужно определить тип текущего файла, проанализировав расширение его имени, а затем выбрать и записать в свойство lvi.ImageIndex индекс соответствующего значка. Расширение имени файла извлекается из полного имени методом Path.GetExtension, а затем все его буквы преобразуется в прописные методом ToLower. Непосредственный выбор значка выполняется при помощи оператора switch.

Подготовленный элемент списка, описывающий текущий файл, добавляется в список методом listView1.Items.Add.

Отображение содержимого текстовых файлов

Итак, теперь наше приложение может отображать в левом фрейме дерево каталогов, а в правом верхнем фрейме — содержимое выбранных каталогов. Остался незадействованным только правый нижний фрейм, в котором расположено окно текстового редактора RichTextBox.

Предусмотрев обработчик события ItemActivate к элементу управления ListView, мы сможем отображать в окне текстового редактора содержимое текстовых файлов, отображаемых в правом верхнем фрейме. Это событие возникает, когда пользователь дважды щелкает строку в окне списка ListView.

Вот исходный текст нашего обработчика события ItemActivate:

private void listView1_OnItemActivate(object sender,
System.EventArgs e)
{
foreach(ListViewItem lvi in listView1.SelectedItems)
{
string ext = Path.GetExtension(lvi.Text).ToLower();
if(ext == ".txt" || ext == ".htm" || ext == ".html")
{
try
{
richTextBox1.LoadFile(Path.Combine(fullPath, lvi.Text),
RichTextBoxStreamType.PlainText);

statusBar1.Text = lvi.Text;
}
catch
{
return;
}
}
else if(ext == ".rtf")
{
try
{
richTextBox1.LoadFile(Path.Combine(fullPath, lvi.Text),
RichTextBoxStreamType.RichText);

statusBar1.Text = lvi.Text;
}
catch
{
return;
}
}
}
}

Получив управление, обработчик событий, прежде всего, должен получить список элементов, выделенных пользователем в окне списка. Эта операция выполняется в цикле:

foreach(ListViewItem lvi in listView1.SelectedItems)
{

}

Идентификаторы выделенных элементов хранятся в наборе listView1.SelectedItems.

В общем случае пользователь может выделить несколько элементов, однако если пользователь щелкнул строку дважды, то в результате окажется выделенной только эта строка. Поэтому наш цикл выполнит только одну итерацию.

Так как редактор RichTextBox способен отображать содержимое только текстовых файлов, нам необходимо определить тип файла, выбранного пользователем. Мы делаем это, анализируя расширение имени файла, полученное с помощью метода GetExtension (с преобразованием символов расширения в строчные символы):

string ext = Path.GetExtension(lvi.Text).ToLower();

Если расширение имени соответствует текстовому файлу или файлу HTML, то мы загружаем содержимое файла в окно редактора RichTextBox, пользуясь для этого методом LoadFile:

if(ext == ".txt" || ext == ".htm" || ext == ".html")
{
try
{
richTextBox1.LoadFile(Path.Combine(fullPath, lvi.Text),
RichTextBoxStreamType.PlainText);

statusBar1.Text = lvi.Text;
}
catch
{
return;
}
}

В качестве первого параметра методу передается полный путь к файлу, полученный комбинированием полного пути каталога fullPath, выделенного в дереве, и имени файла lvi.Text, выделенного в списке ListView.

Через второй параметр методу LoadFile передается тип загружаемого документа, заданный как RichTextBoxStreamType.PlainText (т.е. текстовый документ).

Дополнительно имя документа отображается в строке состояния главного окна приложения, для чего это имя переписывается из свойства lvi.Text в свойство statusBar1.Text.

Обработка файлов с документами типа RTF, имеющих расширение имени rtf, выполняется аналогично. При этом тип документа указывается методу LoadFile как RichTextBoxStreamType.RichText.

На рис. 7-24 мы показали внешний вид главного окна нашего приложения, когда в нижний правый фрейм загружен документ RTF.

Рис. 7-24. Просмотр документа RTF в окне нашего приложения

Приложения MDI

Многие пользователи ОС Microsoft Windows хорошо знакомы с многооконным интерфейсом MDI (Multiple Document Interface), позволяющим в одном приложении работать одновременно с несколькими документами или с разными представлениями одного и того же документа.

Этот интерфейс был впервые описан в руководстве по разработке интерфейса пользователя System Application Architecture Common User Access Advanced Interface Design Guide (SAA/CUA), созданном IBM. Интерфейс MDI использовался в ОС Microsoft Windows, начиная с версии 3.0, а также в графической оболочке Presentation Manager операционной системы OS/2. Современные версии ОС Microsoft Windows также позволяют создавать приложения с интерфейсом MDI (MDI-приложения).

В начале этой главы мы упоминали программу Registry Editor (рис. 7-3), использующую интерфейс MDI. Этим интерфейсом был снабжен и текстовый процессор Microsoft Word for Windows версии 2.0, способный предоставить пользователю два различных представления одного и того же документа. В одном окне могло отображаться, например, обычное представление документа, а в другом — представление в режиме просмотра оглавления документа.

Окна, отображающие содержимое документов внутри главного окна MDI-приложения, называются MDI-окнами.

Меню Windows

Любое MDI-приложение содержит меню Windows, предназначенное для управления окнами, отображающими различные документы или различные представления одного и того же документа.

Как правило, в меню Windows есть строки Cascade и Tile, с помощью которых пользователь может упорядочить MDI-окна, расположив их с перекрытием (друг за другом) или рядом друг с другом.

В этом меню могут быть и другие строки, управляющие расположением MDI-окон. Например, если приложение допускает минимизацию MDI-окон (когда они отображаются в виде значков), в меню Windows присутствует строка Arrange Icons. С помощью этой строки пользователь может упорядочить расположение пиктограмм свернутых окон.

Ниже разделительной черты в меню Windows обычно находятся строки, обозначающие отдельные MDI-окна. Если выбрать одну из этих строк, указанное окно будет активизировано и показано на первом плане.

Меню Windows может быть разным в различных MDI-приложениях. Однако в любом случае это меню позволяет пользователю автоматически упорядочить расположение MDI-окон и выбрать нужное окно из списка для активизации.

Двигая MDI-окна при помощи заголовка, Вы не сможете переместить их за пределы главного окна приложения. В то же время MDI-окна можно делать активными, при этом заголовок активного MDI-окна выделяется цветом.

Системное меню MDI-окна

Каждое MDI-окно имеет, как правило, системное меню и кнопки изменения размера. С помощью системного меню пользователь может изменять размеры или перемещать MDI-окно (строки Restore, Move, Size, Maximize, Minimize), закрывать окно (строка Close), передавать фокус ввода от одного MDI-окна другому (строка Next Window).

Если MDI-окно сворачивается в значок (минимизируется), то этот значок располагается в нижней части главного окна приложения.

Создание главного окна MDI-приложения

Главное окно приложения MDI и отдельные MDI-окна связывают родительские отношения. При этом главное окно MDI-приложения является родительским для дочерних MDI-окон. В этом разделе мы рассмотрим процедуру создания главного окна приложения MDI средствами Microsoft Visual Studio.NET на языке C#.

Для демонстрации способов создания приложений MDI мы создадим программу MDIApp.

Вначале необходимо создать новый проект приложения Windows Application Project, как обычно. Далее откройте окно редактирования свойств главного окна (формы) приложения и установите значение свойства IsMDIContainer, равным True (рис. 7-25).

Рис. 7-25. Установка свойства IsMDIContainer

В результате главное окно приложения превратится в контейнер для дочерних MDI-окон.

Далее, добавьте в приложение главное меню. Для этого перетащите из панели Toolbox системы Microsoft Visual Studio.NET значок главного меню MainMenu.

Создайте меню File со строками New, Close и Exit, как это показано на рис. 7-26.

Рис. 7-26. Меню File

С помощью строки New этого меню мы будем создавать новые MDI-окна с редактором текста на базе элемента управления RichTextBox. Строка Close предназначена для закрытия MDI-окон, а строка Exit — для завершения работы приложения.

Создайте также меню Edit со строками Copy и Paste, а также меню Window, предназначенное для управления MDI-окнами и показанное на рис. 7-27.

Рис. 7-27. Меню Window

Строка Cascade предназначена для каскадного расположения открытых MDI-окон, а строки Horizontally Tile и Vertically Tile — для размещения окон рядом друг с другом в горизонтальном и вертикальном направлении, соответственно.

После создания меню Window Вам необходимо выделить его, а затем в окне редактирования свойств установить значение свойства MdiList равным True (рис. 7-28). При этом во время работы приложения в меню Window будут автоматически добавлены строки списка открытых MDI-окон. В этом меню строки активных окон будут отмечены.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.027 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал