На этом шаге мы рассмотрим несколько примеров решения задач, в которых используется графический интерфейс.
Здесь мы рассмотрим несколько программ, в которых используются рассмотренная на предыдущих шагах обработка исключений.
Задание 1. Напишите программу, в которой открывается окно с раскрывающимся списком. Список содержит названия цветов (красный, желтый, зеленый и так далее). Также окно содержит область, закрашенную тем цветом, который выбран в списке. При выборе в списке нового цвета область закрашивается этим цветом автоматически.
Раскрыть/скрыть решение и комментарии.
Решение этой задачи основано на приложении из 276 шага:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace pr284_1 { // Класс окна является производным от класса Form: class MyForm : Form { // Закрытое поле является текстовьм массивом // с названиями цветов: private string[] names = { "Красный", "Синий", "Зеленый", "Желтый" }; // Закрытое поле - значение индекса для выбранного // элемента из массива: private int index = 0; // Закрытое поле - ссылка на объект метки: private Label pict; // Закрытое поле - ссылка на объект // раскрывающегося списка: private ComboBox list; // Конструктор: public MyForm() : base() { // Заголовок окна: this.Text = "Цвета"; // Размеры окна: this.Size = new Size(300, 155); // Окно фиксированных размеров: this.FormBorderStyle = FormBorderStyle.FixedSingle; // Окно нельзя развернуть на весь экран: this.MaximizeBox = false; // Создание объекта метки: pict = new Label(); // Положение и размеры метки: pict.SetBounds(5, 5, 154, 104); // Тип рамки вокруг метки: pict.BorderStyle = BorderStyle.FixedSingle; // Цвет фона для метки: pict.BackColor = Color.Red; // Добавление метки в окно: this.Controls.Add(pict); // Создание объекта для списка: list = new ComboBox(); // Содержимое списка: list.Items.AddRange(names); // Тип списка: list.DropDownStyle = ComboBoxStyle.DropDownList; // Индекс выбранного в списке элемента: list.SelectedIndex = index; // Положение списка: list.Left = pict.Right + 5; list.Top = pict.Top; // Размеры списка: list.Size = new Size(110, 50); // Шрифт для списка: list.Font = new Font("Courier New", 12, FontStyle.Bold); // Регистрация метода обработчиком для события, // связанного с выбором нового элемента в списке: list.SelectedIndexChanged += OnItemChanged; // Добавление списка в окно: this.Controls.Add(list); // Создание объекта кнопки: Button btn = new Button(); // Название кнопки: btn.Text = "Выход"; // Положение кнопки: btn.Left = list.Left; btn.Top = list.Bottom + 10; // Размеры кнопки: btn.Width = list.Width; btn.Height = 30; // Шрифт для кнопки: btn.Font = list.Font; // Регистрация метода обработчиком события, // связанного со щелчком по кнопке: btn.Click += OnButtonClick; // Добавление кнопки в окно: this.Controls.Add(btn); } // Метод для обработки события, связанного с выбором // в списке нового элемента: private void OnItemChanged(object obj, EventArgs ea) { // Индекс выбранного в списке элемента: int index = list.SelectedIndex; // Новый фон для метки: switch (index) { case 0: pict.BackColor = Color.Red; break; case 1: pict.BackColor = Color.Blue; break; case 2: pict.BackColor = Color.Green; break; case 3: pict.BackColor = Color.Yellow; break; } } // Метод для обработки события, связанного со щелчком // по кнопке: private void OnButtonClick(object obj, EventArgs ea) { // Завершение выполнения приложения: Application.Exit(); } } class Program { [STAThread] // Главный метод: static void Main() { // Отображение окна: Application.Run(new MyForm()); } } }
Главное отличие этой программы от приложения на 276 шаге заключается в методе для обработки события, связанного с выбором в списке нового элемента. Здесь в переменной index размещается номер выбранного элемента, а затем в переключателе switch устанавливается новый цвет фона у метки pict.
Результат работы приложения приведен на рисунках 1 и 2.
Рис.1. Внешний вид программы послее ее запуска
Рис.2. Выбор цвета
Раскрыть/скрыть решение и комментарии.
Главное отличие этого приложения от программы, приведенной на 276 шаге, заключается в наличии еще двух кнопок:
В обработчиках этих кпонок реализованы похожие операции: номер изображения увеличивается/уменьшается. Если номер выходит за границу, то номер изображения становится 0/равным максимальному.
Вот текст приложения:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace pr284_2 { // Класс окна является производным от класса Form: class MyForm : Form { // Закрытое поле является текстовым массивом // с названиями файлов с изображениями: private string[] files = { "wolf.jpg", "fox.jpg", "bear.jpg", "raccoon.jpg" }; // Закрытое поле содержит путь к каталогу с файлами: private string path = ""; // Закрытое поле - значение индекса для выбранного // элемента из массива: private int index = 0; // Закрытое поле - ссылка на объект метки: private Label pict; // Конструктор: public MyForm() : base() { // Заголовок окна: this.Text = "Циклическая смена картинок"; // Размеры окна: this.Size = new Size(300, 155); // Окно фиксированных размеров: this.FormBorderStyle = FormBorderStyle.FixedSingle; // Окно нельзя развернуть на весь экран: this.MaximizeBox = false; // Создание объекта метки: pict = new Label(); // Положение и размеры метки: pict.SetBounds(5, 5, 154, 104); // Тип рамки вокруг метки: pict.BorderStyle = BorderStyle.FixedSingle; // Изображение для метки: pict.Image = Image.FromFile(path + files[index]); // Добавление метки в окно: this.Controls.Add(pict); // Создание объекта кнопки Выход: Button btn = new Button(); // Название кнопки: btn.Text = "Выход"; // Положение кнопки: btn.Left = pict.Right + 5; btn.Top = pict.Bottom - 30; // Размеры кнопки: btn.Width = 110; btn.Height = 30; // Шрифт для кнопки: btn.Font = new Font("Courier New", 12, FontStyle.Bold); // Регистрация метода обработчиком события, // связанного со щелчком по кнопке: btn.Click += OnButtonClick; // Добавление кнопки в окно: this.Controls.Add(btn); // Создание объекта кнопки Назад: Button btnPrev = new Button(); // Название кнопки: btnPrev.Text = "<"; // Положение кнопки: btnPrev.Left = pict.Right + 5; btnPrev.Top = pict.Top; // Размеры кнопки: btnPrev.Size = new Size(50, 30); // Шрифт для кнопки: btnPrev.Font = btn.Font; // Регистрация метода обработчиком события, // связанного со щелчком по кнопке: btnPrev.Click += OnButtonPrevClick; // Добавление кнопки в окно: this.Controls.Add(btnPrev); // Создание объекта кнопки Вперед: Button btnNext = new Button(); // Название кнопки: btnNext.Text = ">"; // Положение кнопки: btnNext.Left = pict.Right + 55; btnNext.Top = pict.Top; // Размеры кнопки: btnNext.Size = new Size(50, 30); // Шрифт для кнопки: btnNext.Font = btn.Font; // Регистрация метода обработчиком события, // связанного со щелчком по кнопке: btnNext.Click += OnButtonNextClick; // Добавление кнопки в окно: this.Controls.Add(btnNext); } // Метод для обработки события, связанного со щелчком // по кнопке Выход: private void OnButtonClick(object obj, EventArgs ea) { // Завершение выполнения приложения: Application.Exit(); } // Метод для обработки события, связанного со щелчком // по кнопке Назад: private void OnButtonPrevClick(object obj, EventArgs ea) { // Выбор картинки: index--; if (index < 0) index = 3; // Изображение для метки: pict.Image = Image.FromFile(path + files[index]); } // Метод для обработки события, связанного со щелчком // по кнопке Вперед: private void OnButtonNextClick(object obj, EventArgs ea) { // Выбор картинки: index++; if (index == files.Length) index = 0; // Изображение для метки: pict.Image = Image.FromFile(path + files[index]); } } // Главный класс: class Program { [STAThread] // Главный метод: static void Main() { // Отображение окна: Application.Run(new MyForm()); } } }
Результат работы приложения изображен на рисунке 3.
Рис.3. Результат работы приложения
Раскрыть/скрыть решение и комментарии.
Текст этой программы несложный. Он базируется на решении первой задачи и приложения, приведенного на 281 шаге. Надеемся, что приведенных комментариев будет достаточно для понимания работы приложения.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace pr284_3 { // Класс окна является производным от класса Form: class MyForm : Form { // Закрытое поле - ссылка на объект метки: private Label pict; // Конструктор: public MyForm() : base() { // Заголовок окна: this.Text = "Выбор цвета"; // Размеры окна: this.Size = new Size(300, 155); // Окно фиксированных размеров: this.FormBorderStyle = FormBorderStyle.FixedSingle; // Окно нельзя развернуть на весь экран: this.MaximizeBox = false; // Создание объекта метки: pict = new Label(); // Положение и размеры метки: pict.SetBounds(5, 5, 154, 104); // Тип рамки вокруг метки: pict.BorderStyle = BorderStyle.FixedSingle; // Цвет фона для метки: pict.BackColor = Color.Red; // Добавление метки в окно: this.Controls.Add(pict); // Объект контекстного меню: ContextMenuStrip menu = new ContextMenuStrip(); // Добавление команд в контекстное меню: menu.Items.Add("Красный"); menu.Items.Add("Синий"); menu.Items.Add("Зеленый"); menu.Items.Add("Желтый"); // Перебор элементов из контекстного меню: for (int k = 0; k < menu.Items.Count; k++) { // Обработчик для команды из контекстного меню: menu.Items[k].Click += (x, y) => { // Название команды: string txt = ((ToolStripMenuItem)x).Text; // Установка цвета фона: if (txt == "Красный") pict.BackColor = Color.Red; else if (txt == "Синий") pict.BackColor = Color.Blue; else if (txt == "Зеленый") pict.BackColor = Color.Green; else pict.BackColor = Color.Yellow; // Заголовок окна: this.Text = "Цвет: " + txt; }; } // Контекстное меню для метки: pict.ContextMenuStrip = menu; // Создание объекта кнопки: Button btn = new Button(); // Название кнопки: btn.Text = "Выход"; // Положение кнопки: btn.Left = pict.Right + 5; btn.Top = pict.Bottom - 30; // Размеры кнопки: btn.Width = 110; btn.Height = 30; // Шрифт для кнопки: btn.Font = new Font("Courier New", 12, FontStyle.Bold); // Регистрация метода обработчиком события, // связанного со щелчком по кнопке: btn.Click += OnButtonClick; // Добавление кнопки в окно: this.Controls.Add(btn); } // Метод для обработки события, связанного со щелчком // по кнопке: private void OnButtonClick(object obj, EventArgs ea) { // Завершение выполнения приложения: Application.Exit(); } } // Главный класс: class Program { [STAThread] // Главный метод: static void Main() { // Отображение окна с полем ввода: Application.Run(new MyForm()); } } }
Результат работы приложения приведен на рисунках 4 и 5.
Рис.4. Внешний вид программы послее ее запуска
Рис.5. Выбор цвета
Со следующего шага мы начнем изучать разные интересные вещи, не попавшие в уже изученные разделы.