Application.Exit();
}
private void configureToolStripMenuItem_Click(obiect sender, EventArgs e) {
// Этот метод будет реализован чуть позже…
}
private void MainWindow_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
g.DrawString(userMessage, new Font("Times New Roman", 24), Brushes.DarkBlue, 50, 50);
}
}
Теперь добавьте в текущий проект новый объект Form с именем UserMessageDialog.cs с помощью выбора Project→Add Windows Form из меню. Установите для свойств ShowInTaskbar, MinimizeBox и MaximizeBox значения false. Затем постройте пользовательский интерфейс, состоящий из двух типов Button (для кнопок OK и Отмена), одного TextBox (чтобы предоставить пользователю возможность ввести сообщение) и элемента Label с инструкцией. Один возможный вариант показан на рис. 21.35.
Рис. 21.35. Пользовательское диалоговое окно
Наконец, откройте доступ к значению Text элемента TextBox формы с помощью пользовательского свойства с именем Message.
public partial class UserMessageDialog: Form {
public UserMessageDialog() {
InitializeComponent();
}
public string Message {
set { txtUserInput.Text = value; }
get { return txtUserInput.Text; }
}
}
В качестве заключительного задания при создании пользовательского интерфейса выберите кнопку OK в окне проектирования формы и найдите свойство DialogResult. Назначьте DialogResult.OK кнопке OK и DialogResult.Cancel – кнопке Отмена. Формально говоря, вы можете назначить свойству DialogResult любое значение из перечня DialogResult.
public enum System.Windows.Forms.DialogResult {
Abort, Cancel, Ignore, No,
None, OK, Retry, Yes
}
Но что же означает присваивание значения свойству DialogResult элемента Button? Это свойство может быть назначено для любого типа Button (как и для самой формы), и оно позволяет родительской форме определить, какую из кнопок выбрал конечный пользователь. Для примера измените обработчик меню Сервис→ Настройка в рамках типа MainForm так, как предлагается ниже,
private void configureToolStripMenuIteimClick(object sender, EventArgs e) {
// Создание экземпляра UserMessageDialog.
UserMessageDialog dlg = new UserMessageDialog();
// Размещение текущего сообщения в TextBox.
dlg.Message = userMessage;
// Если пользователь щелкнул на кнопке OK, отобразить сообщение.
if (DialogResult.OK == dlg.ShowDialog()) {
userMessage = dlg.Message;
Invalidate();
}
// Лучше, чтобы очистку внутренних элементов выполняло само
// диалоговое окно, не дожидаясь сборщика мусора.
dlg.Dispose();
}
Здесь UserMessageDialog отображается с помощью вызова ShowDialog(). Этот метод запустит форму в виде модального диалогового окна, а это, как вы знаете, означает, что пользователь не сможет перейти к главной форме, пока диалоговое окно не будет закрыто. После закрытия диалогового окна пользователем (с помощью щелчка на кнопке OK или на кнопке Отмена), форма станет невидимой, но все еще будет оставаться в памяти. Поэтому вы можете запросить у экземпляра UserMessageDialog (с именем dlg) информацию о новом значении Message в том случае, когда пользователь щелкнул на кнопке OK. В этом случае вы отображаете новое сообщение, иначе не делаете ничего.
Замечание. Чтобы отобразить немодальное диалоговое окно (которое позволяет переходить от родительской формы к диалоговой и обратно), следует вызвать Show(), а не ShowDialog().
Одним из наиболее привлекательных аспектов построения диалоговых окон в Windows Forms является наследование форм. Вы, несомненно, знаете, что наследование является одним из базовых принципов ООП, который позволяет одному классу расширить функциональность другого. Обычно, когда говорят о наследовании, представляют один тип (например, SportsCar) без графического интерфейса, получающийся из другого типа (например, Car), также не имеющего графического интерфейса. Однако в Windows Forms оказывается вполне возможным получение одной формы из другой, сохранив в процессе наследования элементы базового класса и их реализации.
Наследование на уровне форм является очень мощной технологией программирования, поскольку она позволяет построить базовую форму, обеспечивающую базовые функциональные возможности для целого семейства связанных диалоговых окон. Если связать базовые формы в компоновочном блоке .NET, другие члены вашей команды разработчиков смогут расширять эти типы, используя при этом тот язык .NET, который они предпочитают использовать.
Читать дальше