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

    На этом шаге мы рассмотрим создание приложения, где используются эти компоненты.

    Мы продолжаем знакомиться с простыми программами (с графическим интерфейсом), но постепенно будем изучать разные графические компоненты. Далее рассмотрим программу, в которой используются наиболее простые компоненты - кнопки и текстовые метки. А именно, создадим программу, при запуске которой отображается диалоговое окно с сообщением и кнопкой. Щелчок по кнопке приводит к закрытию окна и завершению выполнения программы. Как выглядит окно, отображаемое при запуске программы на выполнение, показано на рисунке 1.


Рис.1. Окно с сообщением и кнопкой

    Мы раньше встречались с подобными окнами. От предыдущих случаев данная ситуация отличается тем, что окно с кнопкой "конструируем" мы сами. Программный код, выполнение которого приводит к желаемому результату, представлен в примере ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Forms;
using System.Drawing;

namespace pr275_1
{
    // Класс окна наследует класс Form: 
    class MyForm: Form {
        // Конструктор:
        public MyForm(string msg, string title): base() { 
            this.Text = title;  // Заголовок окна
            // Размеры окна: 
            this.Size = new Size(300, 140);
            // Окно постоянных размеров: 
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            // Окно нельзя развернуть на весь экран: 
            this.MaximizeBox = false;
            // Имя файла с пиктограммой для окна: 
            string file = "penguin.ico"; 
            // Пиктограмма для окна: 
            this.Icon = new Icon(file);
            // Создание объекта метки:
            Label lbl = new Label();
            // Текст метки: 
            lbl.Text = msg;
            // Положение метки в контейнере (окне): 
            lbl.Location = new Point(10, 10); 
            lbl.Width = 265;	// Ширина метки
            lbl.Height = 40;	// Высота метки
            // Текст в метке выравнивается по центру: 
            lbl.TextAlign = ContentAlignment.MiddleCenter;
            // Тип рамки для метки: 
            lbl.BorderStyle = BorderStyle.Fixed3D;
            // Объект шрифта:
            Font F = new Font("Arial", 15, FontStyle.Italic);
            // Применение шрифта для метки: 
            lbl.Font = F;
            // Цвет шрифта для метки: 
            lbl.ForeColor = Color.Blue;
            // Добавление метки в окно: 
            this.Controls.Add(lbl);
            // Создание объекта кнопки:
            Button btn = new Button();
            // Текст (название) для кнопки: 
            btn.Text = "Закрыть";
            // Положение и размеры кнопки: 
            btn.Bounds = new Rectangle(100, 60, 90, 30);
            // Шрифт для кнопки:
            btn.Font = new Font(btn.Font.Name, // Название шрифта 
                btn.Font.Size + 3, // Размер шрифта 
                // Стиль шрифта:
                FontStyle.Underline | FontStyle.Bold
                );
            // Добавление обработчика для события, связанного 
            // со щелчком по кнопке: 
            btn.Click += delegate (object a, EventArgs b) {
                // Завершение работы приложения:
                Application.Exit();
            };
            // Добавление кнопки в окно: 
            this.Controls.Add(btn);
        }
    }

    // Главный класс:
    class Program
    {
        [STAThread]
        // Главный метод: 
        static void Main()
        {
            // Создание объекта окна:
            MyForm mf = new MyForm("Bceм привет!",  // Заголовок
                "Окно с кнопкой" // Текст в окне
                );
            // Отображение окна:
            Application.Run(mf);
        }
    }
}

Архив проекта можно взять здесь.

    В программе описывается класс окна MyForm, который является производным от класса Form. Все самое интересное происходит в конструкторе этого класса. В качестве аргументов конструктору передаются два текстовых значения: первое msg определяет сообщение, отображаемое в окне, а второе title определяет заголовок окна. А именно, в теле конструктора командой

  this.Text = title; 
свойству Text объекта окна присваивается значение title, чем определяется заголовок, отображаемый в строке названия окна.


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

    Размеры окна определяются командой

  this.Size = new Size(300, 140);    ,
которой свойству Size окна присваивается экземпляр структуры Size. При создании экземпляра структуры аргументами конструктору передаются размеры окна.

    При выполнении команды

  this.FormBorderStyle = FormBorderStyle.FixedSingle;
свойству FormBorderStyle объекта окна в качестве значения присваивается константа FixedSingle (простая рамка постоянных размеров) из перечисления FormBorderStyle. Получается окно постоянных размеров, но при этом у окна будет пиктограмма, которая позволяет развернуть окно на весь экран. Мы используем команду
  this.MaximizeBox = false;                , 
чтобы заблокировать работу соответствующей пиктограммы для окна.

    Мы используем собственную пиктограмму для окна (отображается в строке названия окна в левом верхнем углу). Для этого в текстовую переменную file записывается имя файла с изображением для пиктограммы (файл penguin.ico располагается в каталоге bin\Debug).


Обратный слеш \ используется в управляющих символах (таких, как \n или \t). Поэтому в текстовом значении, определяющем путь к файлу, используют или слеш /, или двойной обратный слеш \\.

    Пиктограмма для окна определяется командой

  this.Icon = new Icon(file);                   , 
которой свойству Icon объекта окна присваивается ссылка на объект класса Icon. При создании объекта аргументом конструктору передается текстовая строка с полным путем к файлу с изображением для пиктограммы.

    Объект текстовой метки создается командой

  Label lbl = new Label();               . 
Командой
  lbl.Text = msg;  
определяем текст, который будет отображаться в метке. Положение метки в контейнере (которым будет окно) определяем инструкцией
  lbl.Location = new Point(10, 10); 
свойству Location объекта метки lbl значением присваивается ссылка на объект класса Point. Размеры метки в пикселях задаем так: присваиваем значения свойствам Width (ширина) и Height (высота) объекта метки. Для выравнивания текста в области метки по центру по вертикали и горизонтали свойству TextAlign объекта метки значением присваивается константа MiddleCenter из перечисления ContentAlignment. Тип рамки для метки определяется командой
   lbl.BorderStyle = BorderStyle.Fixed3D;
(метка выделяется с использованием объемного эффекта - получается "вдавленная" в окно метка). Также мы хотим самостоятельно определить шрифт для отображения текста в метке. Для этого создаем объект шрифта (объект F класса Font). При создании объекта (команда
   Font F = new Font("Arial", 15, FontStyle.Italic);
) аргументами конструктору класса Font передаются: название шрифта "Arial", размер шрифта 15, а также константа Italic из перечисления FontStyle (данная константа означает, что используется курсивный шрифт). Для применения созданного шрифта для метки свойству Font объекта метки присваивается ссылка на объект шрифта (команда
  lbl.Font = F;
). Мы хотим, чтобы в метке цвет текста был синим. Для этого свойству ForeColor в качестве значения присваивается константа Blue из структуры Color (команда
  lbl.ForeColor = Color.Blue;
). Для добавления метки в окно мы из свойства Controls объекта окна вызываем метод Add(), аргументом которому передается ссылка на объект метки.

    Также в конструкторе класса окна создается объект кнопки (команда

  Button btn = new Button();
). Название, которое отображается на кнопке, определяется значением свойства Text объекта кнопки. Поэтому при выполнении команды
  btn.Text = "Закрыть"; 
определяется название кнопки. Положение и размеры кнопки определяются, когда свойству Bounds объекта кнопки присваивается ссылка на объект класса Rectangle. Конструктору класса Rectangle при создании объекта передаются четыре целых числа. Первые два числа определяют положение кнопки в контейнере (в окне). Два других числа определяют ширину и высоту кнопки.


Обычно существуют разные способы определять характеристики графических компонентов. Это относится к способу определения положения графического компонента и его размеров. Мы в рассматриваемом примере используем разные способы для определения положения и размеров компонентов для окна, метки и кнопки, хотя могли бы использовать однотипные подходы. Данное разнообразие связано с желанием продемонстрировать разные подходы для решения однотипных задач.

    Для кнопки мы также определяем шрифт. В этом случае свойству Font объекта кнопки btn значением присваивается ссылка на объект класса Font. При создании объекта шрифта первым аргументом конструктору передается значение btn.Font.Name. Это текущее название шрифта для кнопки. Проще говоря, мы используем тот шрифт, который предполагалось использовать по умолчанию. Вторым аргументом конструктору класса Font передается выражение btn.Font.Size+3. Данное значение - это увеличенный на 3 текущий размер шрифта, используемый по умолчанию для отображения текста в кнопке. Наконец, третьим аргументом конструктору класса Font передается выражение FontStyle.Underline | FontStyle.Bold. Это две константы Underline и Bold из перечисления FontStyle, объединенные оператором |. Данное выражение означает, что используется и подчеркивание (константа Underline), и выделение жирным стилем (константа Bold).

    Для события Click кнопки, которое связано со щелчком по кнопке, добавляется обработчик, основанный на анонимном методе. В теле анонимного метода вызывается команда Application.Exit(), которой завершается работа приложения.


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

    Для добавления кнопки в окно из свойства Controls объекта окна вызывается метод Add(), аргументом которому передана ссылка на объект кнопки.


Для использования структур Size и Color, классов Icon, Point, Rectangle и Font, а также перечислений ContentAlignment и FontStyle в заголовке программы добавлена инструкция using System.Drawing. Кроме этого необходимо добавить соответствующую ссылку в проект.

    В главном методе программы создается объект окна (объект mf класса MyForm). Этот объект передается в качестве аргумента методу Run(), который вызывается из класса Application. В результате отображается диалоговое окно (см. рисунок 1). При закрытии окна приложение завершает работу.


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

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




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