Шаг 271.
Язык программирования C#. Начала. Приложения с графическим интерфейсом. Принципы создания графического интерфейса

    На этом шаге мы рассмотрим общие принципы создания приложений с графическим интерфейсом.

    Тема, связанная с созданием приложений с графическим интерфейсом, более чем многогранна и исключительно объемна. Мы, в силу объективных причин, все вопросы осветить не сможем, но постараемся остановиться на наиболее важных и принципиальных. Начнем с базовых принципов, которые лежат в основе технологии создания приложений с графическим интерфейсом.

    В общих чертах наша задача состоит в том, чтобы написать программный код, при выполнении которого отображается окно с элементами управления. Это могут быть кнопки, списки, опции, переключатели - список элементов довольно обширный, но все же ограниченный. Среди элементов есть статические - такие, например, как текстовая метка, основное назначение которой состоит в том, чтобы отображать текст. Но большинство элементов функциональные. С ними можно выполнять некоторые манипуляции (например, щелкать по кнопке или выбирать пункт в раскрывающемся списке). Обычно у этих манипуляций есть последствия - ведь элементы управления добавляются именно для того, чтобы программа реагировала на действия, связанные с этими элементами. Как же создать такую программу? Задачу можно разбить на две составляющие, или две подзадачи. Первая связана с созданием собственно графического интерфейса. Вторая подразумевает определение реакции программы на действия с элементами управления графического интерфейса. Каждую подзадачу мы рассмотрим отдельно.

    Принцип создания графического интерфейса простой. Каждый элемент управления реализуется с помощью объекта. Для каждого типа элементов есть свой класс. Например, если нам нужна кнопка, то необходимо создавать объект класса Button. Если нам нужна метка для отображения текста, то создается объект класса Label. Само окно, в которое добавляются элементы управления, реализуется как объект класса Form. Соответствующие объекты создаются, определяются их характеристики, размеры и положение, элементы добавляются в контейнер (которым может быть, например, окно). В таблице 1 перечислены некоторые (далеко не все) классы из пространства имен System.Windows.Forms, которые позволяют создавать объекты для основных графических элементов управления.

Таблица 1. Некоторые классы для создания графических элементов
Класс Описание
Button Класс для создания элемента кнопки
CheckBox Класс для создания элемента опционного типа (опция или кнопка с режимом вдавливания)
ComboBox Класс для создания элемента "список выбора"
Form Класс для создания объекта окна формы
GroupBox Класс для создания элемента, используемого при группировке таких элементов управления, как переключатели
Label Класс для создания объекта текстовой метки (элемент, который может содержать текст)
ListBox Класс для создания объекта элемента, представляющего собой раскрывающийся список
Panel Класс для создания объекта панели. Панель является контейнером для размещения других элементов управления
RadioButton Класс для создания объекта элемента, являющегося переключателем
TextBox Класс для создания объекта элемента, представляющего собой поле для ввода значений

    Еще раз подчеркнем, что в действительности классов и элементов (в том числе и всевозможных меню) намного больше. Выше перечислены лишь те, что представляют наибольший интерес и будут задействованы в самой ближайшей перспективе.

    Как именно создаются объекты для компонентов, настраиваются их свойства и выполняются прочие сопутствующие операции, мы рассмотрим чуть позже на конкретных примерах. Пикантность ситуации в том, что этого мало. Нужно еще "научить" программу реагировать на действия пользователя с элементами графического интерфейса. Здесь нужно учесть, что есть принципиальное отличие в способе выполнения консольных программ и программ с графическим интерфейсом. Если консольная программа сама обращается к операционной системе, то при выполнении программы с графическим интерфейсом операционная система отправляет сообщения программе. Понять это несложно. Представим, что имеется окно с двумя кнопками. Пользователь может нажать на любую из них. Между кнопками и пользователем есть "посредник" - операционная система. При щелчке по кнопке операционная система, образно выражаясь, сообщает программе, на какой кнопке произошло соответствующее событие. Программа, в свою очередь, должна "уметь" реагировать на него. Это в теории. На практике ситуация следующая. С каждый элементом управления связано определенное количество событий. Здесь событие понимается в программистском смысле. Например, у объектов класса Button (кнопка) есть событие Click. Данное событие генерируется, если по кнопке выполнен щелчок. Мы можем добавить в список обработчиков события ссылки на методы, которые будут вызываться при возникновении события. Собственно, это то, что нам нужно.


У класса кнопки Button событий много, не только событие Click. Например, есть события KeyDown и KeyUp, которые генерируются, если при активной кнопке (кнопке передан фокус) соответственно нажимается и отпускается клавиша на клавиатуре. Событие MouseEnter генерируется, когда курсор мыши оказывается над областью кнопки, а событие MouseLeave генерируется, когда курсор мыши покидает область кнопки. И так далее. Полный список событий внушительный.

    События обрабатываются экземплярами делегата EventHandler. Этот делегат определен в пространстве имен System. Делегат соответствует методам, не возвращающим результат, у которых два аргумента. Первый аргумент является объектной ссылкой класса Object. Через этот аргумент передается ссылка на объект элемента, на котором произошло событие (объект, сгенерировавший событие). Второй аргумент является объектной ссылкой класса EventArgs (пространство имен System). Через этот аргумент передается ссылка на объект, содержащий информацию о произошедшем событии.


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

    На следующем шаге мы рассмотрим создание пустого окна.




Предыдущий шаг Содержание Следующий шаг