Модификация приложения WindowsForms: стандартные диалоговые окна
Расставим вторую группу элементов. Наша цель, по нажатию кнопок Изменить фон формы, вызвать стандартное окно выбора цветов. По нажатию в нём кнопки ОК меняем цвет фона. Кнопка Отмена справа возвращает фон по умолчанию. Вторая кнопка Изменить шрифт формы, меняет весь шрифт используемый на форме. Кнопка Отмена возвращает всё «как было». Дальше, здесь же поставим элемент CheckedListBox. При выборе пункта Овальность, поменяем форму нашего окна на овал. При выборе пункта Непрозрачность окна в %, окно меняет прозрачность в зависимости от числа (от 0 до 100) в NumericUpDown. Кнопка Выбор директории открывает стандартный диалог выбор папки через Проводник Windows. По нажатию кнопки ОК отобразив в текстовом поле редактирования полный путь к выбранной директории. Добавим также ещё один ProgressBar который будет отсчитывать время по секундам и обнуляться по прошествии минуты. Отсчёт времени будем вести по текущему системному.
Расставим вторую группу следующим образом:
Рис. 5. 1. Расстановка элементов второй группы (Стандартные диалоговые окна)
Кнопка Изменить фон формы:
(Name): | button5 |
Text: | Изменить фон формы |
Кнопка Отмена:
(Name): | button6 |
Text: | Отмена. |
ToolTip на Hint: | Возвращает фон формы по умолчанию |
Кнопка Изменить шрифт формы:
(Name): | button8 |
Text: | Изменить шрифт формы |
Кнопка Отмена:
(Name): | button7 |
Text: | Отмена |
ToolTip на Hint: | Возвращает шрифт формы по умолчанию |
Список с выбором флажками CheckedListBox5:
(Name): | checkedListBox1 |
ПРИМЕЧАНИЕ № 5: Для этого элемента, как и для ComboBox и ListBox можно изначально задавать «коллекцию» уже готовых элементов. Для этого в свойствах элемента ищем поле Items и добавляем новые элементы через нажатие кнопки (…). Разделителем элементов будет перевод строки в окне добавления элементов.
NumericUpDown:
(Name): | NumericAplha |
Maximum: |
^ Максимальное число.
Mininum: |
^ Минимальное число.
Increment: |
^ Шаг.
Кнопка Выбор директории:
(Name): | button9 |
Text: | Выбор директории |
Текстовое поле редактирования TextBox:
(Name): | textBox1 |
Индикатор выполнения ProgressBar:
(Name): | progressBar1 |
Добавим ещё один таймер, который активируем сразу же при запуска приложения:
Timer:
(Name): | TimerOneMinute |
Enabled: | True |
^ Запускаем таймер при инициализации приложения.
Добавим диалоговые окна с панели элементов (перетаскиванием на форму):
ColorDialog:
(Name): | ColorSelect |
FontDialog:
(Name): | FontSelect |
FolderBrowserDialog:
(Name): | SelectBrowser |
Теперь пропишем все необходимые события (в том порядке, в котором задавали свойства элементов управления):
Событие Click кнопки Изменить фон формы:
privatevoid button5_Click(object sender, EventArgs e)
{
ColorSelect.ShowDialog(); // Показываемокновыборацвета (Windows)
this.BackColor = ColorSelect.Color; // Устанавливаем в качестве текущего для фона формы
StatusLabel.Text = "Выбан цвет: " + ColorSelect.Color; // Выводит текст в строку состояния с названием цвета (если определено) или его RGB-представлением
}
СобытиеClickкнопкиОтмена:
privatevoid button6_Click(object sender, EventArgs e)
{
this.BackColor = Color.Empty; // Возвращаемпервоначальныйфон
}
Событие Click кнопки Изменить шрифт формы:
privatevoid button8_Click(object sender, EventArgs e)
{
try
{
FontSelect.ShowDialog();
this.Font = FontSelect.Font;
StatusLabel.Text = "Выбраншрифт: " + FontSelect.Font.ToString();
}
catch
{
// Ловимошибку: шрифтне TrueType
}
}
СобытиеClickкнопкиОтмена:
privatevoid button7_Click(object sender, EventArgs e)
{
this.Font = DefaultFont;
StatusLabel.Text = "Выбранпервоначальныйшрифт: " + DefaultFont.Name;
}
Событие SelectedIndexCahgedсписка с выбором флажками:
privatevoid checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
GraphicsPath G = newGraphicsPath(); // Создаёмновыйграфическийэлемент
Rectangle Rect = newRectangle(0, 0, this.Width, this.Height); // Создаёмпрямоугольник
if (checkedListBox1.CheckedItems.Contains("Непрозрачностьокнав %") == true) // Еслиэлементвыделен
{
this.Opacity = Convert.ToDouble(NumericAplha.Value) / 100; // Прозрачонть: значение NumericAplha / 100 (0 - полнапрозрачность, 1 - полнаянепрозрачность)
}
if (checkedListBox1.CheckedItems.Contains("Овальноеокно") == true)
{
G.AddEllipse(0, 0, this.Width, this.Height); // Добавляем эллипс покрывающий всю форму в графический элемент
this.Region = new System.Drawing.Region(G); // Создаём объект нового региона и меняем регион формы на эллепис
}
else
{
G.AddRectangle(Rect); // Добавляем прямоугольник
this.Region = newSystem.Drawing.Region(G); // Выбираемпрямоугольник
}
}
Событие Click кнопки Выбор директории:
privatevoid button9_Click(object sender, EventArgs e)
{
SelectBrowser.ShowDialog();
textBox1.Text = SelectBrowser.SelectedPath; // Заносимзначениепутив textBox1
}
СобытиеTickтаймера:
privatevoid TimerOneMinute_Tick(object sender, EventArgs e)
{
Byte Seconds = Convert.ToByte(DateTime.Now.Second);
progressBar1.Value = Seconds;
}
ИзменимкодметодаLWP05Main()файлаLWP05Main.cs:
public LWP05Main()
{
InitializeComponent();
/* Инициализируеммассивэлементовдля checkedListBox1 */
String[] CheckItems = { "Непрозрачность окна в %", "Овальное окно" };
checkedListBox1.Items.AddRange(CheckItems);
/* Устанавливаем режим выбора элемента с двойного нажатия на одинарный */
checkedListBox1.CheckOnClick = true;
NumericAplha.Value = 100; // Начальноезначение
progressBar1.Maximum = 60; // Граница индикаторы выполнения
}
Добавим в этом же файле два пространства имён:
using System.Drawing.Drawing2D; // Объявляем пространство имён для рисования 2D-графики
using System.IO;
Компилируем, проверяем работоспособность:
Рис. 5. 2. Окончательная работа блока стандартных диалоговых окон (другой цвет формы, результат выбора шрифта для формы и директории)
Рис. 5. 3. Окончательная работа блока стандартных диалоговых окон
(25% прозрачности на фоне рабочего стола, овальность и диалог выбора шрифта)
Единственное о чём мы забыли. Для того чтобы изменить прозрачность на новое значение, нужно снять галочку и снова установить после выбора нового значения. ИсправимэтособытиемValueChangedэлементауправленияNumericAlpha:
privatevoid NumericAplha_ValueChanged(object sender, EventArgs e)
{
if (checkedListBox1.CheckedItems.Contains("Непрозрачностьокнав %") == true) // Еслиэлементвыделен
{
this.Opacity = Convert.ToDouble(NumericAplha.Value) / 100; // Прозрачность: значение NumericAplha / 100 (0 - полнапрозрачность, 1 - полнаянепрозрачность)
}
}
6. Модификация приложения WindowsForms: открытие файла, сохранение файла и работа с текстом
Расставим третью группу элементов. Добавим поле расширенной работы с текстом и организуем небольшой текстовый редактор с сохранением и открытием файлов, а также добавим контекстное меню по щелчку правой кнопки мыши на любой пустой позиции формы.
Расставим третью группу следующим образом:
Рис. 5. 1. Расстановка элементов третьей группы (Открытие файла, сохранение файла и работа с текстом)
Перетащим с панели элементов новый элементContextMenuStrip. Установим для него свойство (Name): MenuRight. Заполним его элементами также как и главное меню Файл:
Если редактирование прямо на форме не слишком наглядно, можно также воспользоваться расширенным редактором коллекции элементов для меню. Он также подходит для обычного меню MenuStrip, элемента ToolStrip и строки состояния StatusStrip.
Рис. 6. 1. Редактор коллекции элементов (для MouseRight)
С панели инструментов добавим также элементы диалоговых окон сохранения и загрузки: OpenFileDialog и FileSaveDialog. Установим им имена (Name) соответственно: FileOpen и FileSave:
Свойства элемента FileSave:
(Name): | FileSave |
FileName: | Документ |
^ Здесь указываем название файл без разширения по умолчанию.
InitialDirectory: | <ваш путь> |
Если нужно указать стартовую директорию для сохранения. Путь может выглядеть так: D:\Folder1\Folder2
DefaultExt: | Файлы RTF|*.rtf |
^ Здесь указывается суффикс файла сохранения и название этого суффикса.
Filter: | Файлы RTF|*.rtf|Текстовый документ|*.txt|Текст OpenDocument|*.odt|Все файлы|*.* |
ПРИМЕЧЕНИЕ № 4: Свойства DefaultExt и Filter записываются через разделители «|». Напомним, что в лабораторных работах данного практикума запись значений для полей свойств элементов управления иногда такова: «Имя свойства: <Значение>.» — точка после закрывающей кавычки не относится к значению, поэтому не стоит заносить скажем в поле принимающее только целое числовое значение ещё и точку. Среда выдаст ошибку либо уберёт точку.
Пример (задание точки в имени элемента):
Рис. 6. 2. Ошибочное задание поля (Name)
Свойства элемента FileOpen:
(Name): | FileOpen |
FileName: | Документ |
^ Здесь указываем название файл без расширения по умолчанию.
Имена остальных элементов оставляем как есть:
(Name): | button10 |
Text: | Цвет |
ToolTip на Hint: | Цвет выделенного текста |
(Name): | button11 |
Text: | Шрифт |
ToolTip на Hint: | Шрифтвыделенноготекста |
(Name): | button14 |
Text: | Фон |
ToolTip на Hint: | Фонвыделенноготекста |
(Name): | button15 |
Text: | Копировать |
ToolTip на Hint: | Копировать выделенный текст в буфер обмена |
(Name): | button13 |
Text: | Выделитьвсё |
(Name): | button12 |
Text: | Очистить |
СобытиеClickкнопкиЦвет:
privatevoid button10_Click(object sender, EventArgs e)
{
ColorSelect.ShowDialog();
richTextBox1.SelectionColor = ColorSelect.Color; // Меняемцветвыделенноготекста richTextBox1
}
СобытиеClickкнопкиШрифт:
privatevoid button11_Click(object sender, EventArgs e)
{
try
{
FontSelect.ShowDialog();
richTextBox1.SelectionFont = FontSelect.Font; // Меняемшрифтвыделенноготекста richTextBox1
}
catch
{
// Ловимошибку: шрифтне TrueType
}
}
СобытиеClickкнопкиФон:
privatevoid button14_Click(object sender, EventArgs e)
{
ColorSelect.ShowDialog();
richTextBox1.SelectionBackColor = ColorSelect.Color; // Меняемфонвыделенноготекста richTextBox1
}
СобытиеClickкнопкиКопировать:
privatevoid button15_Click(object sender, EventArgs e)
{
richTextBox1.Copy(); // Копируем выделенный фрагмент текста в элементе
}
СобытиеClickкнопкиОчистить:
privatevoid button12_Click(object sender, EventArgs e)
{
richTextBox1.Clear(); // Очистка richTextBox1
}
СобытиеClickкнопкиВыделитьвсё:
privatevoid button13_Click(object sender, EventArgs e)
{
richTextBox1.Focus(); // Фокуснаэлемент
richTextBox1.SelectAll(); // Выделяемвесьтекст
}
Событие Click кнопки главного меню Открыть:
privatevoidоткрытьToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
// Открываемдиалоготкрытияфайла
FileOpen.ShowDialog();
// Создаёмпотокдлясодержимогофайла
StreamFStream = FileOpen.OpenFile();
// Загружаем файл (открываем форматированный текст)
richTextBox1.LoadFile(FStream, RichTextBoxStreamType.RichText);
// Закрываем поток и высвобождаем память
FStream.Close();
this.Text = Title + " :: " + FileOpen.FileName;
}
catch
{
// Ловим ошибку: файл не найден
}
}
Событие Click кнопки главного меню Сохранить как…:
privatevoidсохранитьToolStripMenuItem_Click(object sender, EventArgs e)
{
// Создаём строковую переменную для хранения имени сохранённого файла
String FileSavedAs;
// Создаём поток в памяти
MemoryStream MStream = newMemoryStream();
// Cоздаёмпотокдляфайл
Stream FStream;
if (FileSave.ShowDialog() == DialogResult.OK) // ПозавершениидиалогаинажатиикнопкиОК...
{
// Связываем поток с именем существующего файла, если файла нет, то создаём новый файл
FStream = FileSave.OpenFile();
// Меняем положение в потоке
MStream.Position = 0;
// Сохраняем в поток содержимое richTextBox1 (сохраняем форматированный текст)
richTextBox1.SaveFile(MStream, RichTextBoxStreamType.RichText);
// Записываем информацию в файл
MStream.WriteTo(FStream);
// Закрываем поток и высвобождаем память
FStream.Close();
FileSavedAs = FileSave.FileName;
this.Text = Title + " :: " + FileSavedAs; // После сохранения укажем сохранённый файл в заголовке
}
}
Модифицируемсобытие Click кнопки :
privatevoid button4_Click(object sender, EventArgs e)
{
SaveQuestion(); // Вызов метода обработки "правильного" закрытия предложения с выводом диалога сохранения данных
}
Сам метод SaveQuestion(), добавим в этом же файле LWP05Main.cs:
void SaveQuestion()
{
DialogResult Result = MessageBox.Show("Сохранить изменения в документе?", Title + " :: Сохранение изменений", MessageBoxButtons.YesNo);
switch (Result) // Оператор переключения switch, получает значения Result результата выполнения диалога
{
caseDialogResult.Yes:
{
сохранитьToolStripMenuItem_Click(null, null); // Генерируем событие нажатия кнопки Сохранить как...
Close();
break;
}
caseDialogResult.No: { Close(); return; }
}
}
В начале файла добавим строковую переменную:
publicpartialclassLWP05Main : Form
{
String Title; // Строковая переменная для хранения заголовка приложения
Модифицируем метод LWP05Main() следующим образом:
public LWP05Main()
{
InitializeComponent();
/* Инициализируем массив элементов для checkedListBox1 */
String[] CheckItems = { "Непрозрачность окна в %", "Овальное окно" };
checkedListBox1.Items.AddRange(CheckItems);
/* Устанавливаем режим выбора 'ktvtynf с двойного нажатия на одинарный */
checkedListBox1.CheckOnClick = true;
NumericAplha.Value = 100; // Начальноезначение
progressBar1.Maximum = 60; // Граница индикаторы выполнения
Title = this.Text; // Сохраняем первоначальный заголовок
}
Теперь обработаем контекстное меню. События Click кнопок контекстного меню Открыть, Сохранитькак…иВыход:
privatevoidоткрытьToolStripMenuItem1_Click(object sender, EventArgs e)
{
открытьToolStripMenuItem_Click(null, null); // Вызываемметодсобытия Click главногоменюдляпунктаОткрыть
}
privatevoidсохранитьКакToolStripMenuItem_Click(object sender, EventArgs e)
{
сохранитьToolStripMenuItem_Click(null, null); // Вызываем метод события Click главного меню для пункта Сохранить как...
}
privatevoidвыйтиToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveQuestion();
}
События MouseEnter оставшихся кнопок главного меню:
privatevoidоткрытьToolStripMenuItem_MouseEnter(object sender, EventArgs e)
{
StatusLabel.Text = открытьToolStripMenuItem1.Text + " (" + открытьToolStripMenuItem1.ShortcutKeyDisplayString + ")";
}
privatevoidсохранитьToolStripMenuItem_MouseEnter(object sender, EventArgs e)
{
StatusLabel.Text = сохранитьКакToolStripMenuItem.Text + " (" + сохранитьКакToolStripMenuItem.ShortcutKeyDisplayString + ")";
}
Компилируем, проверяем работоспособность:
Рис. 6. 3. Окончательная работа третьего блока (Открытие файла, сохранение файла и работа с текстом)