this.newToolStripButton, this.openToolStripButton,
this.saveToolStripButton, this.printToolStripButton,
this.toolStripSeparator, this.cutToolStripButton,
this.copyToolStripButton, this.pasteToolStripButton,
this.toolStripSeparator, this.helpToolStripButton });
…
}
Чтобы продемонстрировать работу с ToolStrip, в следующем приложении
Windows Forms создается тип ToolStrip, содержащий два типа ToolStripButton (с именами toolStripButtonGrowFont и toolStripButtonShrinkFont), тип ToolBarSeparator и тип ToolBarTextBox (с именем toolStripTextBoxMessage).
Конечный пользователь получает возможность ввести сообщение, которое будет отображено в окне формы с помощью ToolBarTextBox, а два типа ToolBarButton используются для того, чтобы увеличить или уменьшить размер шрифта. На рис. 19.21 показано результирующее окно проекта, который мы с вами собираемся построить.
Рис. 19.21. Приложение ToolStripApp в действии
Я надеюсь, что к этому моменту вы имеете достаточно информации о приемах работы в режиме проектирования формы в Visual Studio 2005, поэтому я не буду утомлять вас указаниями по поводу построения ToolStrip. Однако следует заметить, что каждый элемент ToolStripButton имеет свою пользовательскую (хотя и достаточно примитивную) пиктограмму, которая была создана с помощью редактора изображений Visual Studio 2005. Если вы захотите создать файл изображения для своего проекта, можете просто выбрать Project→Add New Item из меню, а затем в появившемся диалоговом окне выбрать Icon File (Файл пиктограммы), рис. 19.22.
Рис. 19.22. Вставка новых файлов изображений
После этого вы можете отредактировать свои изображения с помощью окна Colors и комплекта инструментов редактора изображений. Имея пиктограммы в наличии, вы можете связать их с типами ToolStripButton с помощью свойства Image в окне свойств. После того как вы сочтете внешний вид ToolStrip удовлетворительным, обработайте событие Click для каждого элемента ToolStripButton.
Вот соответствующий программный код метода InitializeComponent() для первого типа ToolStripButton (второй ToolStripButton выглядит почти так же).
private void InitializeComponent() {
…
//
// toolStripButtonGrowFont
//
this.toolStripButtonGrowFont.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonGrowFont.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonGrowFont.Image")));
this.toolStripButtonGrowFont.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButtonGrowFont.Name = "toolStripButtonGrowFont";
this.toolStripButtonGrowFont.Text = "toolStripButton2";
this.toolStripButtonGrowFont.ToolTipText = "Увеличить шрифт";
this.toolStripButton.GrowFont.Click += new System.EventHandler(this.toolStripButtonGrowFont_Click);
…
}
Замечание. Обратите внимание на то, что значение, присваиваемое свойству Image типа ToolStripButton, получается с помощью метода GetObject(). Как будет показано в следующей главе, этот метод используется для извлечения встроенных ресурсов, используемых компоновочным блоком.
Остальной программный код чрезвычайно прост. В следующем обновленном MainWindow обратите внимание на то, что текущий размер шрифта ограничивается значениями из диапазона между 12 и 70.
public partial class MainWindow: Form {
// Текущий, минимальный и максимальный размеры шрифта.
int currFontSize = 12;
const int MinFontSize =12;
const int MaxFonfSize = 70;
publiс MainWindow() {
InitializeComponent();
CenterToScreen();
Text = string.Format("Выбранный вами размер шрифта: {0}", currFontSize);
}
private void toolStripButtonShrinkFont_Click(object sender, EventArgs e) {
// Уменьшение размера шрифта на 5 и обновление экрана.
currFontSize -= 5;
if (currFontSize ‹= MinFontSize) currFontSize = MinFontSize;
Text = string.Format("Выбранный вами размер шрифта: {0}", currFontSize);
Invalidate();
}
private void toolStripButtonGrowFont_Click(object sender, EventArgs e) {
// Увеличение размера шрифта на 5 и обновление экрана.
currFontSize += 5;
if (currFontSize ›= MaxFontSize) currFontSize = MaxFontSize;
Text = string.Format("Выбранный вами размер шрифта: {0}", currFontSize);
Invalidate();
}
private void MainWindow_Paint(object sender, PaintEventArgs e) {
// Отображение сообщения пользователя.
Graphics g = e.Graphics;
g.DrawString(toolStripTextBoxMessage.Text, new Font("Times New Roman", currFontSize), Brushes.Black, 10, 60);
}
}
В качестве заключительного штриха, чтобы гарантировать, что пользовательское сообщение будет обновлено, как только ToolStripTextBox утратит фокус, обработайте событие LostFocus и вызовите Invalidate() для формы в рамках сгенерированного обработчика события.
public partial class MainWindow: Form {
…
public MainWindow() {
…
this.toolStripTextBoxMessage.LostFocus += new EventHandler(toolStripTextBoxMessage_LostFocus);
}
void toolStripTextBoxMessage_LostFocus(object sender, EventArgs e) {
Invalidate();
}
…
}
Работа с ToolStripContainer
Типы ToolStrip, если требуется, можно настроить так, чтобы они могли "стыковаться" с любой стороной и даже со всеми сторонами содержащей их формы. Для иллюстрации того, как это сделать, щелкните правой кнопкой мыши на своем элементе ToolStrip в окне проектирования фирмы и выберите Embed In ToolStripContainer (Встроить в контейнер). После этого ToolStrip будет помещен В ToolStripContainer. Для нашего примера выберите опцию Dock Fill In Form (Стыковка ко всей форме) риc. 10.23.
Рис. 19.23. Стыковка ToolStripContainer ко всей форме
Запустив эту модификацию приложения, вы увидите, что ToolStrip может перемещаться и стыковаться к любой стороне контейнера. Однако ваше пользовательское сообщение исчезнет. Причина в том, что типы ToolStripContainer являются для формы дочерними элементами управления. Так что графическое отображение на самом деле выполняется, но вывод скрыт контейнером, который сейчас накрывает всю клиентскую область формы.
Чтобы решить возникшую проблему, нужно обработать событие Paint для ToolStripContainer, а не для формы. Сначала найдите событие Paint формы в окне свойств и щелкните правой кнопкой на текущем обработчике событий. Из контекстного меню выберите Reset (рис. 19.24).
Это удалит программную логику обработки события из InitializeComponent(), но оставит программу обработки события на своем месте (просто, чтобы не допустить безвозвратную потерю программного кода, который вы, возможно, захотите использовать).
Теперь обработайте событие Paint для ToolStripContainer и переместите имеющийся программный код отображения из обработчика события Paint формы в обработчик события Paint контейнера. После этого можете удалить (теперь пустой) метод MainWindow_Paint().
Рис. 19.24. Переустановка события
Наконец, нужно заменить каждый встречающийся вызов метода Invalidate() формы на вызов метода Invalidate() контейнера. Вот как выглядит соответствующая этому модификация программного кода.
public partial class MainWindow: Form {
…
void toolStripTextBoxMessage_LostFocus(object sender, EventArgs e) {
toolStripContainer1.Invalidate(true);
}
private void toolStripButtonShrinkFont_Click(object sender, EventArgs e) {
…
toolStripContainer1.Invalidate(true);
}
private void toolStripButtonGrowFont_Click(object sender, EventArgs e) {
toolStripContainer1.Invalidate(true);
}
// Теперь "закрашивается" контейнер, а не форма!
private void ContentPanel_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
g.DrawString(toolStripTextBoxMessage.Text, new Font("Times New Roman", currFontSize), Brushes.Black, 10, 60);
}
}
Конечно, следует проверить разные конфигурации ToolStripContainer, чтобы понять, как все это работает. Подробности по документации .NET Framework 2.0 SDK вам придется изучать самостоятельно. На рис. 19.25 показано окно завершенного проекта.
Исходный код. Проект ToolStripApp размещен в подкаталоге, соответствующем главе 19.
Рис. 19.25. Приложение ToolStripApp с допускающим стыковку ToolStrip
Создание MDI-приложения
Чтобы завершить краткое знакомство с Windows Forms, давайте обсудим то, как настроить форму на работу в качестве родительского объекта для любого числа дочерних окон (т.е. в качестве MDI-контейнера). MDI-приложения дают пользователям возможность открывать множество дочерних окон в рамках одного и того же главного окна. В мире MDI каждое окно представляет свой "документ" приложения. Например, Visual Studio 2005 является МDI-приложением, поскольку вы можете открыть множество документов в рамках одного экземпляра этого приложения.
При построении МDI-приложения с помощью Windows Forms первой задачей оказывается (конечно же) создание нового приложения Windows. Исходная форма в приложении обычно содержит систему меню, которая позволяет создавать новые документы (например, содержит пункт Файл→Создать) и упорядочивать существующие открытые окна (каскадом, по вертикали или по горизонтали).