Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 477

Эндрю Троелсен

Рис. 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-приложением, поскольку вы можете открыть множество документов в рамках одного экземпляра этого приложения.