Опубликован: 11.09.2006 | Уровень: специалист | Доступ: платный
Лекция 2:

Работа с элементами управления

Label, LinkLabel и PictureBox

Программы, как правило, содержат пункт главного меню "О программе", где в отдельном окне помещается логотип компании, лицензионное соглашение, гиперссылки на сайт разработчика и другая информация. Создадим подобную форму, используя новые элементы управления — Label, LinkLabel и PictureBox.

Итак, добавим в наш проект новую форму и назовем ее About.cs. Установим следующие свойства формы:

About, форма, свойство Значение
Name About
FormBorderStyle FixedSingle
MaximizeBox False
MinimizeBox False
Size 318; 214
Text About Notepad C#

Добавим на форму элемент управления PictureBox — он представляет собой подложку, размещаемую на форме, которая может содержать в себе рисунки для отображения. В поле свойства Image щелкаем на кнопку (…) и выбираем рисунок по адресу Code\Glava2\NotepadCSharp\Icon\logo.gif. Поскольку logo.gif является анимированным рисунком, элемент PictureBox начинает воспроизводить анимацию сразу же, даже в режиме дизайна.

Из окна ToolBox перетащим на форму кнопку, Label и LinkLabel. В поле свойства Text кнопки введем &OK. Элемент Label предназначен для размещения на форме надписей, которые в готовом приложении будут доступны только для чтения. В поле свойства Text введем Notepad C# 2006 All rights reserved. Элемент LinkLabel отображает текст на форме в стиле web-ссылок и обычно используется для создания навигации между формами или ссылки на сайт. В поле Text этого элемента вводим адрес гипотетического сайта — www.notepadcsharp.com. Пользователь будет переходить на сайт, нажимая на эту ссылку, поэтому реализуем переход по гиперссылке для события Click. В окне Properties щелкаем дважды на событии Click и добавляем обработчик:

private void linkLabel1_Click(object sender, System.EventArgs e)
    {
    //Добавляем блок для обработки исключений — по разным причинам 
    //пользователь может не получить доступа к ресурсу.
      try
      {
        //Вызываем метод VisitLink, определенный ниже
        VisitLink();
      }
      catch (Exception ex )
      {
        MessageBox.Show(ex +"Unable to open link that was clicked.");
      }
      
    }
    //Создаем метод VisitLink
      private void VisitLink()
      {
        // Изменяем цвет посещенной ссылки, программно 
        //обращаясь к свойству LinkVisited элемента LinkLabel 
        linkLabel1.LinkVisited = true;
        //Вызываем метод Process.Start method  для запуска браузера, 
        //установленного по умолчанию, и открытия ссылки
        System.Diagnostics.Process.Start("http://www.notepadcsharp.com");
      }
Листинг 2.12.

Кнопка OK просто будет закрывать форму:

private void button1_Click(object sender, System.EventArgs e)
    {
      this.Close();
    }

В пункте главного меню About Programm… формы frmmain добавляем процедуру вызова формы About:

private void mnuAbout_Click(object sender, System.EventArgs e)
    {
      //Создаем новый экземпляр формы  About
      About  frm = new About();
      frm.Show();
    }

Запускаем приложение (рис. 2.26):

Окно About Notepad C#

Рис. 2.26. Окно About Notepad C#

Режимы запуска окон

В приложении Notepad C# с открытой формой About без труда можно вернуться к другим пунктам меню программы или документу, т. е. форма About позволяет переключать фокус. Такое поведение дочерних форм характерно для панелей инструментов в программах и называется немодальным. Наоборот, форма, запущенная в модальном режиме, не позволит работать с приложением до тех пор, пока мы не закроем эту форму. Для открытия формы в модальном режиме используется метод ShowDialog:

private void mnuAbout_Click(object sender, System.EventArgs e)
    {
      //Создаем новый экземпляр формы  About
      About  frm = new About();
      frm.ShowDialog();
    }

Модификаторы доступа и наследование форм

С модификаторами доступа вы сталкивались, когда изучали синтаксис языка C#. Используя их, можно определить область видимости, иначе говоря, уровень доступности типов и членов классов, — под этим понимается участок кода, из любой точки которого будет доступен запрашиваемый тип или член класса. Технология Common Type System (CTS, система общих типов) — одна из технологий, обеспечивающих функционирование среды .NET, определяет правила для видимости типов и доступа к их членам. Различные типы модификаторов и их описание приводятся в таблице 2.3.

Таблица 2.3.
Модификатор Определение
public (общественный, открытый) Объект доступен любому коду из любой сборки
private (частный, закрытый) Объект может быть вызван другими методами только из того же типа
internal (внутренний, сборочный) Объект может быть вызван любым кодом из той же сборки
protected (защищенный, родовой) Объект может быть вызван производными типами независимо от их сборки
protected internal (родовой сборочный) Объект может быть вызван производными типами, определенными в той же самой сборке

В качестве объекта могут выступать методы, свойства, классы и, как мы далее увидим, — формы. Под сборкой здесь понимается функциональная единица кода (строгое определение сборок см. в "Создание пакетов установки" ).

Наследование классов — достаточно простое и чрезвычайно удобное понятие синтаксиса С#. Формы, которые содержат большую часть методов и свойств, определенных как public, тоже можно наследовать — для получения доступа к свойствам, определенным как protected, и для ускорения работы. В самом деле, если у нас имеется уже готовая форма (например, About Notepad C#), которую мы собираемся использовать в нескольких приложениях, удобно просто создать наследуемую форму.

Запускаем приложение Notepad C# и в окне Solution Explorer щелкаем правой кнопкой на названии проекта. В появившемся контекстном меню выбираем Add\Add Inherited Form… . В окне Add New Item задаем название формы — IAbout.cs. Далее появляется окно Inheritance Picker, в котором отображаются все формы текущего проекта (рис. 2.27).

Окно выбора формы для наследования Inheritance Picker

Рис. 2.27. Окно выбора формы для наследования Inheritance Picker

В этом окне мы выбираем форму About. Обратите внимание на кнопку Browse, позволяющую искать формы для наследования в библиотеках dll. Нажимаем кнопку OK — в проекте появилась новая форма, содержащая все элементы управления формы About (рис. 2.28). Для завершения связей необходимо скомпилировать проект cнова — выбрав пункт главного меню Build/Rebuild Solution.

Форма IAbout, наследованная от формы About

Рис. 2.28. Форма IAbout, наследованная от формы About

При редактировании родительской формы изменения также касаются дочерней — добавьте, например, кнопку на форму About, и она появится на форме IAbout. Изменения же, производимые с дочерней формой, не затрагивают родительскую форму.

ToolBar и ImageList

Панели инструментов ToolBar содержат наборы кнопок, как правило, дублирующих пункты главного меню. В графических программах панели инструментов — основное средство работы. Откроем снова приложение Notepad C# и перетащим из окна ToolBox элемент управления ToolBar. На кнопках панели обычно располагаются иконки, поэтому, прежде чем мы начнем заниматься ими, нам следует подумать о рисунках. Добавим на форму элемент управления ImageList, применяемый для хранения рисунков, которые могут быть использованы для оформления приложения. Щелкнем в поле Images элемента ImageList (рис. 2.29).

Cвойство Images элемента ImageList

Рис. 2.29. Cвойство Images элемента ImageList

Добавим файлы иконок, последовательно нажимая кнопку Add и выбирая директорию — Code\Glava2\NotepadCSharp\Icon. Мы создадим кнопки панели инструментов, дублирующие действия пунктов меню New, Open, Save, Cut, Copy и Paste, поэтому вы можете выбрать подходящие изображения на своем компьютере1Для создания иконки подходит даже редактор Paint. Для иконки панели инструментов размер рисунка должен быть 16х16 пикселей, сохраненный как 256-цветный рисунок. Для преобразования сохраненного рисунка, например, 1.bmp, просто смените его расширение на 1.ico.. В любом случае, подобрав иконки, завершаем работу с редактором ImageCollectionEditor, нажимая OK. Займемся теперь элементом ToolBar. Свойству Name установим значение toolBarMain, а в поле свойства ImageList выберем imageList1. Запустим редактор ToolBarButton Collection Editor для создания кнопок, щелкнув кнопку (…) в поле свойства Buttons (рис. 2.30).

Редактор ToolBarButton Collection Editor

Рис. 2.30. Редактор ToolBarButton Collection Editor

Для добавления кнопок в этом редакторе тоже следует нажимать клавишу Add. Создадим шесть кнопок, установив для них следующие свойства:

Name Image Index ToolTipText
tbNew tbNew Create New
tbOpen tbOpen Open
tbSave tbSave Save
tbCut tbCut Cut
tbCopy tbCopy Copy
tbPaste tbPaste Paste

Свойство Name устанавливает название кнопки для обращения к ней в коде. Свойство Image Index определяет изображение на кнопке, а в поле ToolTipText вводим текст всплывающей подсказки, которая будет появляться при наведении курсора на кнопку. Завершив работу с редактором кнопок в режиме дизайна формы frmmain, дважды щелкаем на ToolBar и переходим в код. Для создания функциональности кнопок связываем событие Click заданной кнопки c соответствующим обработчиком пунктов меню:

private void toolBarMain_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
    {
      //New
      if (e.Button.Equals(tbNew)) 
      {
        mnuNew_Click(this, new EventArgs());
      }
      //Open
      if (e.Button.Equals(tbOpen))
      {
        mnuOpen_Click(this, new EventArgs());
      }
      //Save
      if (e.Button.Equals(tbSave))
      {
        mnuSave_Click(this, new EventArgs());
      }
      //Cut
      if (e.Button.Equals(tbCut))
      {
        mnuCut_Click(this, new EventArgs());
      }
      //Copy
      if (e.Button.Equals(tbCopy))
      {
        mnuCopy_Click(this, new EventArgs());
      }
      //Paste
      if (e.Button.Equals(tbPaste))
      {
        mnuPaste_Click(this, new EventArgs());
      }
    }
Листинг 2.13.

Запускаем приложение. Кнопки панели инструментов дублируют пункты меню, а при наведении на них появляются подсказки (рис. 2.31).

Панель инструментов Toolbar

Рис. 2.31. Панель инструментов Toolbar

На диске, прилагаемом к книге, вы найдете приложение NotepadCSharp (Code\Glava2\NotepadCSharp). В конце этой лекции приводится листинг форм frmamin и blank.

Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000