выф. Ответы к защите 3 лабы по ООП. Лабораторная работа 3 Разработка gui. Создание sdiприложений
Скачать 0.87 Mb.
|
ЛАБОРАТОРНАЯ РАБОТА 3 Разработка GUI. Создание SDI-приложений. Обработка событий Цель работы: изучить принципы разработки графического интерфейса пользователя в приложениях для ОС Windows в Visual Studio; освоить использование элементов графического интерфейса для управления работой приложения. освоить принципы построения иерархических меню, создания диалоговых окон; изучить модель обработки событий в языке C#. Задания к лабораторной работе Создать учебные приложения Программа 2 –5 и разобрать принцип их работы. Создать типовое SDI-приложение Windows (Single Document Interface, одно-документный интерфейс) с элементами ввода и отображения для полей классов из задания к лабораторной работе 2. Использовать различные элементы управления: текстовые поля, списки, независимые переключатели и радиокнопки, панели для группировки элементов управления. Все созданные объекты отображать в виде таблицы. Ввод новых данных осуществлять через дополнительную диалоговую форму. При вводе данных запрашивать подтверждение на сохранение объекта. В случае неполных или ошибочных данных сообщать об ошибке. При редактировании объекта данные выбранного объекта из таблицы отображать в полях формы редактирования. Обязательно выполнять верификацию вводимых данных. Объекты сохранять в одной коллекции. Для просмотра выбранного из таблицы объекта использовать форму для редактирования объекта. При просмотре данные для изменения недоступны. Удалять выбранный объект из таблицы и коллекции с подтверждением. Добавить на форму меню с пунктами: добавить, просмотреть, удалить, редактировать, выход, справка. Дублировать основные операции панелью инструментов. Краткие теоретические сведения Средством взаимодействия пользователя с программой является графический пользовательский интерфейс (Graphical User Interface, GUI). На практике программирование Windows-приложений с GUI предполагает экстенсивное использование различных инструментальных средств и мастеров, которые намного упрощают этот процесс. Windows Forms — это часть каркаса .NET Framework, которая поддерживает создание приложений со стандартным GUI на платформе Windows. Форма — это экранный объект, обеспечивающий функциональность программы. Как правило, приложение содержит главное окно, которое реализовано с помощью некоторого класса MyForm, производного от класса Form. Запускаем Visual Studio .NET, создаем новый проект, для которого выбираем тип Windows Forms Application, задаем имя проекта — FirstForm и сохраняем его в папку, определяемую полем Location. На экране появилась пустая Windows-форма (рисунок 3.1). Рисунок 3.1 - Главное окно программы в режиме разработки приложения с GUI Окно Object Browser (проводник объектов, View —> Object Browser) является средством получения информации о свойствах объектов. Можно получать краткое описание любого метода, класса или свойства, просто щелкнув на нем, — на информационной панели немедленно отобразится краткая справка. Окно Class View (обзор классов, View —> Class View), позволяет перемещаться в коде по выбранному объекту; содержит методы, классы, данные всего листинга проекта. Для перехода, например, в class Form1 щелкаем на соответствующем названии в окне Class View. Окно свойств Properties — основной инструмент настройки формы и ее компонент. Содержимое этого окна представляет собой весь список свойств выбранного в данный момент компонента или формы. Вызывается окно несколькими способами, чаще на выбранном объекте щелкаем правой кнопкой мыши и в контекстном меню пункт Properties. Когда вы только создали проект, в окне Properties отображаются свойства самой формы (см. табл. 3.1, 3.2). Таблица3.1 - Описание интерфейса окна Properties
Окончание таблицы3.1
В таблице3.2 приводится описание некоторых свойств формы, обычно определяемых в режиме дизайна. Таблица 3.2 - Некоторые свойства формы
Окончание таблицы3.2
Кнопка Events переключает окно Properties в режим управления обработчиками различных событий (например, мыши, клавиатуры) и одновременно выводит список всех событий компонента. Двойной щелчок мыши в поле значения события генерирует обработчик для него и переключает в режим кода. Окно Toolbox (панель инструментов, View —> Toolbox) содержит компоненты Windows-форм, называемые элементами управления, которые размещаются на форме. Оно состоит из нескольких закладок. Наиболее часто употребляемой закладкой является All Windows Forms. Для размещения нужного элемента управления достаточно просто щелкнуть на нем в окне Toolbox или, ухватив, перетащить его на форму. Режимы дизайна и кодаПри создании нового проекта запускается режим дизайна — форма представляет собой основу для расположения элементов управления. Для работы с программой следует перейти в режим кода. Это можно сделать нескольким способами: щелкнуть правой кнопкой мыши в любой части формы и выбрать View Code, в окне Solution Explorer сделать то же самое на компоненте Form1. После перехода в режим кода в этом проекте появится вкладка Form1.cs*, нажимая на которую, тоже можно переходить в режим кода. Рассмотрим некоторые программные блоки: 1. Первый блок определяет, какие пространства имен используются в этом проекте: using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; и т.д. Далее определяется собственное пространство имен, имя которого совпадает с названием проекта: namespace FirstForm. При необходимости это название можно менять. 2. Класс формы Form1, наследуемый от System.Windows. Forms.Form, содержит в себе почти весь код программы: namespace FirstForm{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } } } 3. Метод Main в файле Program.cs реализует главную точку входа в программу —место, откуда начинается выполнение написанного нами кода: namespace FirstForm{ static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } }} При отладке больших программ удобно использовать нумерацию строк, которую можно включить в пункте меню Tools/Options…/Text Editor/C# — на форме General — галочка Line Numbers. При запуске приложения в папке bin\Debug внутри папки проекта возникает файл FirstForm.exe и файлы, необходимые для отладки. Файл FirstForm.exe и представляет собой готовое приложение. Для распространения приложения его необходимо скомпилировать в режиме Release (Build.Butch Build)— тогда появится папка bin\Release, которая будет содержать только FirstForm.exe. Вы можете просто скопировать его на другой компьютер, и если там имеется .NET Framework, все будет работать. Элементы управленияЭлементы управления — это компоненты, обеспечивающие взаимодействие пользователя с программой. Среда Visual Studio предоставляет большое количество элементов, которые можно сгруппировать по нескольким функциональным группам. Таблица 3.3 - Основные группы элементов управления
Базовым классом всех интерфейсных элементов является класс Control, содержащийся в пространстве имен System.Windows.Forms. В этом классе определены общие для всех интерфейсных элементов свойства, события и методы. Наиболее важные из них: Cursor, Font, BackColor, ForeColor — свойства, значения которых элемент управления наследует от содержащего его контейнера, если значение этого свойства в явном виде не установлено и не определено в родительском классе; Top, Left, Width, Height, Size, Location — свойства, отвечающие за размер и местоположение элемента относительно контейнера (для формы контейнером является экран); Anchor и Dock — свойства, определяющие, согласно каким принципам перемещается и меняет размеры интерфейсный элемент при изменении размеров контейнера; Text, ImeMode, RightToLeft — свойства, определяющие надпись или текст в элементе управления, а также направление текста и способ его редактирования; Enabled, Visible — свойства, определяющие, доступен ли пользователю интерфейсный элемент и отображается ли он; Parent — свойство, указывающее, какой из интерфейсных элементов является контейнером для данного элемента. Обработка событий в Windows Forms GUI управляется событиями. Приложение выполняет действия в ответ на события, вызванные пользователем, например, на щелчок кнопкой мыши или выбор пункта меню. В Windows Forms применяется модель обработки событий .NET, в которой делегаты используются для того, чтобы связать события с обрабатывающими их методами. В классах Windows Forms используются групповые делегаты. Групповой делегат содержит список связанных с ним методов. Когда в приложении происходит событие, управляющий элемент возбуждает событие, вызвав делегат для этого события, который вызывает связанные с ним методы. Для того чтобы добавить делегат к событию используется перегруженный оператор +=. Например: this.MouseClick += new MouseEventHandler(this.Form1_MouseClick); Объявление обработчика для этого события: private void Form1_MouseClick(object sender, MouseEventArgs e) { } В качестве параметра обработчик событий получает объект класса МоuseEventArgs (производный от класса EventArgs). Свойства этого объекта содержат информацию, связанную с данным событием. Button (Кнопка) определяет, какая кнопка была нажата, Clicks (Щелчки) определяет, сколько раз была нажата и отпущена кнопка, Свойство Delta (Дельта) является счетчиком оборотов колесика мыши; X и Y — координаты точки, в которой находился указатель в момент нажатия кнопки мыши Внесем изменения в FirstForm, чтобы при щелчке кнопкой мыши строка с приветствием перемещалась на место щелчка. Программа 1: Отображает перемещение приветствия по щелчку мыши. public partial class Form1 : Form { float x, y; // координаты Brush pStdBrush; // Кисть Graphics poGraphics; public Form1() { InitializeComponent(); x=10; y=20; pStdBrush = new SolidBrush(Color.Black); poGraphics = this.CreateGraphics(); this.Text = "Программа 1"; this.Show(); poGraphics.DrawString("Hello, Window Forms", this.Font, pStdBrush, x, y); } private void Form1_MouseClick(object sender, MouseEventArgs e) { // координаты точки щелчка мыши x = (float)e.X; y = (float)e.Y; poGraphics.DrawString("Hello, Window Forms", this.Font, pStdBrush, x, y); } } Параметры метода DrawString: выводимая строка; шрифт (Font— свойство класса Form, которое определяет шрифт, по умолчанию применяемый для вывода текста в форму); используемая кисть; координаты в пикселях. Метод Form1_MouseClick устанавливает координаты текста, х и у, равными координатам точки, в которой находился указатель в момент щелчка. Несколько обработчиков для события. Реализуем два обработчика события MouseClick. Второй обработчик по щелчку кнопкой мыши просто отображает окно сообщения. Метод ShowClick подключается к событию в ручную аналогично методу Form1_MouseClick в файле Form1.Designer.cs. Программа 2: Два обработчика событий для MouseClick public partial class Form1 : Form { . . . private void Form1_MouseClick(object sender, MouseEventArgs e) { x = (float)e.X; y = (float)e.Y; poGraphics.DrawString("Hello, Window Forms", this.Font, pStdBrush, x, y); } void ShowClick (object pSender, MouseEventArgs e) MessageBox.Show("Mouse clicked!!'"); } Введем в пример обработку события KeyPress, а также покажем, как в событии MouseDown различать, какая кнопка была нажата, левая или правая (программа 3). Обработка событий от правой и левой кнопкои мыши. Для того чтобы определить, какая кнопка мыши была нажата используем свойство Button параметра MouseEventArgs. Перепишем методы обработчика событий: private void Form1_MouseClick(object sender, MouseEventArgs e) { // если левая кнопка if (e.Button == System.Windows.Forms.MouseButtons.Left) { x = (float)e.X; y = (float)e.Y; poGraphics.DrawString("Hello, Window Forms", this.Font, pStdBrush, x, y); } } void ShowClick (object pSender, MouseEventArgs e) { // если правая кнопка if (e.Button == System.Windows.Forms.MouseButtons.Right) MessageBox.Show("Mouse clicked!!'"); } Событие Keypress. При нажатии пользователем на клавишу, в конец строки приветствия будет добавлен соответствующий символ. Вместо класса String используется класс StringBuilder, который более эффективен в этой ситуации. public partial class Form1 : Form { StringBuilder pStr; String s; public Form1() { . . . pStr = new StringBuilder("Hello, Window Forms"); s = pStr.ToString(); poGraphics.DrawString(s, this.Font, pStdBrush, x, y); } private void Form1_KeyPress(object sender, KeyPressEventArgs e) { pStr.Append(e.KeyChar); // Добавляем в конец s = pStr.ToString(); poGraphics.DrawString(s, this.Font, pStdBrush, x, y); } } Программа 4: Создадим шуточную программу, представляющую собой диалоговое окно с двумя кнопками. Назовем его SocOpros. Из окна Toolbox перетаскиваем на форму две кнопки Button и надпись Label и устанавливаем следующие свойства элементов управления и формы (табл. 3.4): Таблица 3.4 - Описание формы приложения
Щелкаем дважды по кнопке "Да". В обработчике этой кнопки вставляем следующий код: void btnyes_Click(object sender, EventArgs e){ MessageBox.Show("Мы и не сомневались, что Вы так думаете!"); } Выделяем кнопку "Нет". Открываем окно Properties. Переключаемся в окно событий и дважды щелкаем в поле MouseMove. В обработчике связываем движение мыши с координатами кнопки и устанавливаем координаты, куда она будет возвращаться, если во время своего движения выйдет за указанную область: private void Btnno_MouseMove(object sender, MouseEventArgs e) { Btnno.Top -= e.Y; Btnno.Left += e.X; if (Btnno.Top < -10 || Btnno.Top > 100) Btnno.Top = 60; if (Btnno.Left < -80 || Btnno.Left > 250) Btnno.Left = 120; } Создание меню Добавим в приложение SocOpros простое меню для выхода из программы, пункт меню File / Exit. 1. Откройте панель инструментов Toolbox и перетащите управляющий элемент MenuStrip на форму приложения. 2. Для создания выпадающего меню File с пунктом Exit, введите File и Exit, как на рис. 3.2. В окне Properties измените названия этих пунктов меню на MenuFile и MenuExit. 3. Добавте код в обработчик события File / Exit. private void MenuExit_Click(object sender, EventArgs e) { Application.Exit(); } Рисунок 3.2 – MenuStrip для добавления в форму меню Выбор пункта меню сочетанием клавиш. В свойстве ShortcutKeys в окне Properties для пункта меню выбрать из появившегося окна нужное сочетание клавиш, для отображения рядом с названием пункта меню. Дополнительные возможности меню. В классе MenuStrip определены свойства, при помощи которых можно, устанавливать флажок напротив пункта меню, прятать пункты меню, делать некоторые пункты меню недоступными и т. п. Таблица 3.5 – Свойства MenuItem, обеспечивающие дополнительные возможности меню
Закрытие формы Существует несколько способов закрыть окно: щелкнуть на кнопке "X" (Закрыть) в правом верхнем углу окна; закрыть окно из системного меню в левом верхнем углу окна; закрыть окно с помощью комбинации клавиш Alt+F4, выйти из приложения с помощью меню File / Exit Когда закрывается форма можно остановить процедуру завершения: private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("Do you want to close", "SocOpros", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) Application.Exit(); } Для того чтобы закрыть главное окно и не выходить из приложения обработчик меню File / Exit должен вызвать метод Сlose. private void MenuExit_Click(object sender, EventArgs e) { Close(); } Диалоговые окна Диалоговое окно — это набор управляющих элементов, с помощью которых упрощается процесс ввода данных. Для создания простых диалоговых окон используется класс MessageBox. Более сложные диалоговые окна создаются на основе форм. Создание модального диалога Программа 5: 1. Cоздайте новое приложение AdminForm. На форме расположите кнопки Add и Exit и 4 элемента Label для отображения информации (рис. 3.3). По щелчку на кнопке Add отображается пустая форма AddHotelDialog.cs. Это обычная форма. 2. Откройте файл AddHotelDialog.cs в режиме конструктора. В окне Properties установите значение свойства FormBorderStyle равным FixedDialog. 3. Установите значение свойств ControlBox, MinimizeBox и MaximizeBox равным false. 4. Добавьте на форму текстовые поля TextBox и Label, содержащие информацию о гостинице. Кроме того, необходимо добавить кнопки ОК и Cancel (рис. 3.4). 5. Установите значения и имена элементов в соответствии с табл. 3.6. 6. Установите значение свойства DialogResult кнопки ОК равным ОК. Точно так же установите значение этого свойства кнопки Cancel равным Cancel. Рисунок 3.3 - Окно приложения Рисунок 3.4 – Диалоговое окно AdminForm ввода информации о гостинице Таблица 3.6 - Значения свойств текстовых полей и кнопок диалога AddHotelDialog.cs
7. В файле AdminForm.cs временно добавьте к обработчику cmdAdd_Click код, который отвечает за отображение окна диалога. Диалоговое окно отображается с помощью метода ShowDialog, а не метода Show, который используется для обычных форм. private void cmdAdd_Click (object sender, EventArgs e) { AddHotelDialog dlg = new AddHotelDialog(); dlg.ShowDialog(); } 8. Скомпонуйте и запустите пример. Теперь диалоговое окно уже можно открыть с помощью кнопки Add, а закрыть— с помощью любой из кнопок ОК или Cancel. Можно проверить, что диалоговое окно является модальным, пощелкав мышью где-нибудь еще в приложении. 9. Закрыть приложение можно кнопкой Exit, добавив обработчик события: private void cmdExit_Click(object sender, EventArgs e) { if(MessageBox.Show("Do you want to close", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { Application.Exit(); } Передача данных между диалогом и родительской формой Для этих целей в классах .NET Framework нет встроенного механизма. В классе диалога для каждого сообщения, которое будет передаваться между родительской формой и диалогом, нужно определить свойство. Добавим в класс AddHotelDialog свойства City, HotelName, Rate (Стоимость) и NumberRooms. public String City { get { return txtCity.Text; } set { txtCity.Text = value; } } public String HotelName { get { return (txtHotelName.Text); } set { txtHotelName.Text = value; } } public int Rooms { get { return Convert.ToInt32(txtNumberRooms.Text); } set { txtNumberRooms.Text = value.ToString(); } } public double Rate { get { return Convert.ToDouble(txtRate.Text); } set { txtRate.Text = value.ToString(); } } private void cmdOk_Click(object sender, EventArgs e) { Close(); } Теперь можно использовать эти свойства при закрытии диалогового окна с помощью кнопки ОК. private void cmdAdd_Click(object sender, EventArgs e) { AddHotelDialog dlg = new AddHotelDialog(); dlg.ShowDialog(); if (dlg.HotelName != "") { label1.Text = dlg.City; label2.Text = dlg.HotelName; label3.Text = dlg.Rooms.ToString(); label4.Text = dlg.Rate.ToString(); } else { MessageBox.Show("Введите данные", "Hotel Broker Administration", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } } Создание панели инструментов Кнопки панели инструментов обеспечивают пользователям более легкий доступ к возможностям, которые определены в меню. Для этого используется класс ToolStrip. Для добавления объекта панель инструментов: перетащить объект ToolStrip с панели Toolbox; растянуть на форме, расположив в нужной части окна; по умолчанию будет сформировано метка на панели для выбора типа объектов панели инструментов; выберите объект Button. Появится заготовка для кнопки с изображением. Для добавления изображения на кнопку, нужно щелкнуть по кнопке правой клавишей мыши и выбрать пункт Set Image. В появившемся окне нажать кнопку Import и выбрать путь к рисунку. Список элементов ListBox Добавьте в проект класс, описывающий объект гостиница. class Hotel { public Hotel(String city, String name, int r, double m) { City = city; HotelName = name; Rooms = r; Rate = m; } public String City, HotelName; public int Rooms; public double Rate; } При запуске программы AdminForm в процессе инициализации метод Form1_Load осуществляет начальную загрузку списка элементов hotellist, — в него загружается список гостиниц. public partial class Form1 : Form { ArrayList list = new ArrayList(); // список гостиниц public Form1() { InitializeComponent(); } … private void Form1_Load(object sender, EventArgs e) { Hotel ob1=new Hotel("Москва","Россия",200,1500); list.Add(ob1); Hotel ob2=new Hotel("Москва","Прага",200,3000); list.Add(ob2); Hotel ob3=new Hotel("Новосибирск","Объ",150,1500); list.Add(ob3); Hotel ob4=new Hotel("Новосибирск","Тратата",300,1200); list.Add(ob4); hotellist.Items.Clear(); if (list == null) { return; } foreach(Hotel hotel in list) { // строка для записи в элемент ListBox hotellist String city = hotel.City.Trim(); String name = hotel.HotelName.Trim(); String rooms = hotel.Rooms.ToString(); String rate = hotel.Rate.ToString(); String str = city + "," + name + "," + rooms + "," + rate; hotellist.Items.Add(str); } } } ListBox содержит свойство Items, которое поддерживает коллекцию объектных ссылок. Сначала вызываем метод Items.Clear() для очистки списка. Потом с помощью цикла перебираем гостиницы в списке и создаем строку из полей структуры гостиницы, разделенных запятыми. Добавляем эту строку в список элементов методом Items .Add(). Для выбора элемента из списка нужно щелкнуть на нем. Выбор вызовет событие SelectedIndexChanged. Доступ к выбранному элементу можно получить с помощью свойств SelectedIndex и SelectedItem. Если никакой элемент не выбран, значение SelectedItem будет равно -1. Ниже приведен код обработчика события SelectedIndexChanged. private void hotellist_SelectedIndexChanged(object sender, EventArgs e) { if (hotellist.SelectedIndex != -1) { String selected = hotellist.SelectedItem.ToString(); String[] fields; fields = selected.Split(','); // поля разбить; label1.Text = fields[0]; label2.Text = fields[1]; label3.Text = fields[2]; label4.Text = fields[3]; } else { label1.Text = ""; } } Добавление объектов, вводимых на дополнительной форме AddHotelDialog, в коллекцию и элемент hotellist осуществляется в обработчике события при нажатии на кнопку Add: private void cmdAdd_Click(object sender, EventArgs e) { . . . String s=dlg.City+"," +dlg.HotelName+"," +dlg.Rooms.ToString()+"," +dlg.Rate.ToString(); hotellist.Items.Add(s); Hotel ob=new Hotel(dlg.City,dlg.HotelName,dlg.Rooms,dlg.Rate); list.Add(ob); } Вопросы к защите лабораторной работы Что такое окно приложения? Окно — основное понятие оконного интерфейса, интерфейсный контейнер. Кроме дочерних элементов интерфейса, окно также может содержать элементы управления самим окном. Важная особенность окон — возможность перекрываться, то есть располагаться поверх друг друга, полностью или частично закрывая нижнее окно. Окно приложения обеспечивает взаимодействие пользователя с программой во время ее выполнения. Что такое форма и ее назначение? Форма – это, как правило, экранный объект, прямоугольной формы, который можно применять для предоставления информации пользователю и для обработки ввода информации от пользователя. Что такое элементы управления? На какие группы они делятся? Элементы управления — это компоненты, обеспечивающие взаимодействие пользователя с программой. Среда Visual Studio предоставляет большое количество элементов, которые можно сгруппировать по нескольким функциональным группам. Таблица 3.3 - Основные группы элементов управления
Что такое классы-контейнеры? Для чего используются при построении GUI? Приведите примеры классов-контейнеров. Для организации элементов управления в связанные группы существуют специальные элементы - контейнеры. Например, Panel, FlowLayoutPanel, SplitContainer, GroupBox. Ту же форму также можно отнести к контейнерам. Использование контейнеров облегчает управление элементами, а также придает форме определенный визуальный стиль. Базовым классом всех интерфейсных элементов является класс Control, содержащийся в пространстве имен System.Windows.Forms. В этом классе определены общие для всех интерфейсных элементов свойства, события и методы. Наиболее важные из них: • Cursor, Font, BackColor, ForeColor — свойства, значения которых элемент управления наследует от содержащего его контейнера, если значение этого свойства в явном виде не установлено и не определено в родительском классе; • Top, Left, Width, Height, Size, Location — свойства, отвечающие за размер и местоположение элемента относительно контейнера (для формы контейнером является экран); • Anchor и Dock — свойства, определяющие, согласно каким принципам перемещается и меняет размеры интерфейсный элемент при изменении размеров контейнера; • Text, ImeMode, RightToLeft — свойства, определяющие надпись или текст в элементе управления, а также направление текста и способ его редактирования; • Enabled, Visible — свойства, определяющие, доступен ли пользователю интерфейсный элемент и отображается ли он; • Parent — свойство, указывающее, какой из интерфейсных элементов является контейнером для данного элемента. Как установить элемент управления на форму и задать его свойства? Большинство форм создается путем добавления элементов управления на поверхность формы для определения пользовательского интерфейса. |