Для примера предположим, что вы хотите создать подкласс класса UserMessageDialog, чтобы в новом диалоговом окне пользователь имел возможность указать, что сообщение должно отображаться курсивом. Для этого выберите Project→Add Windows Form из меню, но на этот раз добавьте новую форму Inherited Form (Наследуемая форма), назначив ей имя ItalicUserMessageDialog.cs (см. рис. 21.36).
Рис. 21.36. Добавление производной формы
После щелчка на кнопке Add (Добавить) вы увидите окно утилиты Inheritance Picker (Выбор наследования), которая позволяет выбрать форму из вашего текущего проекта или форму из внешнего компоновочного блока (с помощью кнопки Browse). Для данного примера выберите свой уже существующий тип UserMessageDialog. Вы обнаружите, что ваш новый тип Form расширяет ваш тип диалогового окна, а не базовый объект Form непосредственно. Теперь вы можете расширять полученную форму так, как захотите. Для проверки просто добавьте новый элемент управления CheckBox (с именем checkBoxItalic), который будет доступен через свойство, названное Italic.
public partial class ItalicUserMessageDialog: SimpleModalDialog.UserMessageDialog{
public ItalicUserMessageDialog() {
InitializeComponent();
}
public bool Italic {
set { checkBoxItalic.Checked = value; }
get { return checkBoxItalic.Checked; }
}
}
Теперь, имея подкласс базового типа UserMessageDialog, измените MainForm так, чтобы новое свойство Italic можно было использовать. Просто добавьте новый член-переменную типа Boolean для использования при построении объекта Font, представляющего курсивный шрифт, и измените обработчик события Click для меню Сервис→Настройка так, чтобы использовался ItalicUserMessageDialog. Вот как может выглядеть окончательный вариант программного кода.
public partial class MainWindow: Form {
private string userMessage = "Default Message";
private bool textIsItalic = false;
…
private void configureToolStripMenuItem_Click(object sender, EventArgs e) {
ItalicUserMessageDialog dlg= new ItalicUserMessageDialog();
dlg.Message = userMessage;
dlg.Italic = textIsItaliс;
// Если пользователь щелкнул на OK, отобразить сообщение.
if (DialogResult.OK == dlg.ShowDialog()) {
userMessage = dlg.Message;
textIsItalic = dlg.Italic;
Invalidate();
}
// Лучше, чтобы очистку внутренних элементов выполняло само
// диалоговое окно, не дожидаясь сборщика мусора. dlg.Dispose();
}
private void MainWindow_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
Font f = null;
if (textIsItalic) f = new Font("Times New Roman", 24, FontStyle.Italic);
else f = new Font("Times New Roman", 24);
g.DrawString(userMessage, f, Brushes.DarkBlue, 50, 50);
}
}
Исходный код.Проект SimpleModalDialog размещен в подкаталоге, соответствующем главе 21.
Динамическое позиционирование элементов управления Windows Forms
Чтобы завершить эту главу, давайте рассмотрим несколько подходов, которые можно использовать для управления размещением элементов управления в форме. Если при создании типа Form вы предполагаете, что элементы управления должны отображаться с использованием абсолютных позиций, то это, по сути, означает, что кнопка, размещенная в окне проектирования формы на 10 пикселей ниже и на 10 пикселей правее верхнего левого угла формы, будет там оставаться в течение всей ее "жизни".
При создании формы, содержащей элементы управления пользовательского интерфейса, вы должны решить, должна ли форма позволять изменение размеров ее окна. Обычно главное окно допускает изменение размеров, тогда как диалоговые окна – нет. Напомним, что допустимость изменения размеров формы задается свойством FormBorderStyle. которое может принимать любое из значений перечня FormBorderStyle.
public enum System.Windows.Forms.FormBorderStyle {
None, FixedSingle, Fixed3D,
FixedDialog, Sizable,
FixedToolWindow, SizableToolWindow
}
Предположим, что вы захотели изменить размеры формы. Тогда в связи с содержащимися в форме элементами управления возникают интересные вопросы. Например, если пользователь сделает форму меньше, чем необходимо для отображения всех элементов управления, должны ли эти элементы управления изменять свои размеры (и, возможно, расположение) в соответствии с размерами формы?
В Windows Forms свойство Anchor используется для определения относительной фиксированной позиции, в которой всегда должен пребывать данный элемент управления. Каждый производный от Control тип имеет свойство Anchor, которое может принимать любое из значений перечня AnchorStyles, описанных в табл. 21.13.
Читать дальше