Лабораторная работа «Создание проекта с использованием кнопочных компонентов» 1 Понятие формы. Конструктор форм Windows Forms В оконных приложениях используется Windows-интерфейс GUI (Grphical User Interface – графический интерфейс пользователя). Существует три основных стиля пользовательских интерфейсов: - однооконный интерфейс (SDI), например, реализованный в WordPad (в WordPad можно открыть только один документ; чтобы открыть другой документ, необходимо открыть первый); - многооконный интерфейс (MDI), например, реализованный в Microsoft Excel (позволяет отображать несколько документов сразу, при этом каждый документ отображается в отдельном окне); - интерфейс проводника – это одно окно с двумя панелями или областями; обычно слева представлена иерархия объектов, как в проводнике Microsoft Windows. Рисунок 1 – WordPad, приложение с однооконным интерфейсом (SDI) Рисунок 2 – Приложение MS Excel с многооконным интерфейсом (MDI) Рисунок 3 – Проводник Windows, интерфейс в стиле проводника Выбор стиля интерфейса зависит от назначения приложения. Основой графического интерфейса пользователя является форма. Форма – часть пространства экрана, обычно прямоугольной формы, которую можно использовать для представления сведений пользователю и для получения сведений от него. Форма является основной движущей силой взаимодействия с пользователем. Термин «форма» можно считать синонимом окна – окна приложения (рисунок 1), диалогового окна (рисунок 4) и т. д. Рисунок 4 – Пример формы (диалогового окна) Значительная реализуется именно часть с пользовательского применением интерфейса диалоговых окон. приложений Это окна, предназначенные для открытия, сохранения, печати и закрытия документов, окна отображения и настройки всевозможных параметров и т.д. Диалоговые окна принято делить на модальные и немодальные окна. Когда приложение открывает на экране модальное окно, его работа будет приостановлена до тех пор, пока пользователь не закроет это окно. Что же касается немодальных окон, то они работают одновременно с главным окном открывшего их приложения. Например, диалоговое окно сохранения документа (рисунок 4) – модальное, пока пользователь не ответит на поставленный вопрос работа с документом Microsofr Office Word будет невозможной. Форму можно полностью создать с помощью редактора кода. Однако, для создания и изменения форм проще использовать конструктор Windows Forms. Для создания новой формы с помощью конструктора форм необходимо выполнить команду File→New→Project→Windows Application. Задание 1. Создайте новую форму Form1. 2 Элементы управления На форме размещаются элементы управления. Forms Элемент управления (или управляющий элемент, программный элемент, компонент Windows-форм, или контрол1[1]) – это объект на форме, который придает форме новые функциональные возможности и формирует пользовательский интерфейс. Например, на рисунке 4 кнопки Да, Нет, Отмена и текст сообщения являются элементами управления. Элементы управления расположены в окне Toolbox. Вызов Toolbox может быть выполнен несколькими способами: View→Toolbox, кнопка «Панель элементов» на панели инструментов или с помощью пункта Toolbox бокового меню (рисунок 5). Рисунок 5 – Форма и панель Toolbox Элементы управления в окне Toolbox сгруппированы по нескольким вкладкам: All Windows Forms, Common Controls и др. (рисунок 6). Рисунок 6 – Окно Toolbox с элементами управления Common Controls Рассмотрим назначение некоторых элементов управления. Button (кнопка) служит для выполнения действия с помощью мыши. При щелчке кнопки вызывается обработчик события Click. В обработчик события Click помещается код, отвечающий за выполнение нужного действия. CheckBox описывает селекторную кнопку со свободной фиксацией (предоставляет выбор нескольких элементов). ComboBox используется для выбора одного значения из нескольких возможных. Label (метка) используется для отображения текста или рисунков, которые не могут редактироваться пользователями. Они используются для определения объектов в форме. LinkLabel предназначено для добавления в форму ссылок на ресурсы Интернета, такие как адреса Web-сайтов и серверов FTP, адреса электронной почты и пр. PictureBox используется для привязки к форме файла графического изображения (операция масштабирования изображения недоступна) RadioButton описывает селекторную кнопку с зависимой фиксацией (если одна кнопка включена, другие обязательно выключены). Похож на CheckBox, за исключением того, что, элементы выбора взаимоисключающие. TextBox (текстовое поле) используется для получения данных, вводимых пользователем, или для отображения текста. MaskedTextBox (текстовое поле по маске) – позволяет задать маску для пользовательского ввода. Например, пользователь должен вводить номер телефона с кодом области, тогда установив свойство этого контрола Mask в (999)000-0000 мы позволим вводить данные в таком формате. MenuStrip – позволяет добавить в стандартное меню иконку. На рисунках отмечены некоторые элементы управления. Рисунок 7 – Элементы управления диалогового окна Атрибуты Рисунок 8 – Элементы управления диалогового окна Шрифт Для размещения нужного элемента управления достаточно просто щелкнуть на нем в окне Toolbox или, ухватив, перетащить его на форму. Размещение элементов на форму происходит в окне Конструктора формы (рисунок 9) Рисунок 9 – Размещение кнопки button1 на форме Form1в окне конструктора форм (Design) Элементы управления в Visual C++ на форме легко выровнять и упорядочить. Например, при размещении элемента управления к краю формы можно увидеть ограничительные линии, отмечающие собой рекомендуемое расстояние при размещении элементов на форме. То же самое касается и взаимодействия элементов управления между собой. Также можно воспользоваться панелью Layout, которая становится активной при выбранных элементах (рисунок 10). Рисунок 10 – Панель Layout Свойства (Properties) формы и размещенных на ней компонентов отображаются при нажатии на кнопку Properties Window на панели инструментов или выбора пункта Properties из контекстного меню, когда соответствующий объект выделен (рисунок 11). Рисунок 11 – Кнопка Properties Window на панели инструментов Свойства формы и элементов управления сгруппированы по вкладкам (рисунок 12). Рисунок 12 – Свойства формы Form1и кнопки button1 Двойной щелчок на элементе управления перемещает нас в окно кода, где выполняется работа с кодом программы (рисунок 13). Т.о., при создании проектов Windows Forms происходит работа с двумя окнами – окном конструктора форм (Design) и окном кода. Рисунок 13 – Окно кода программы 3 Создание приложений с помощью Windows Forms Application Пример 1 Создание простейшего оконного приложения Создадим простейшее модальное окно сообщения с меткой, кнопкой и полем для ввода. 1 Размещаем на форме элементы управления Label, TextBox, Button (рисунок 14). Рисунок 14 – Размещение элементов на форме Изменяем текст надписи элементов label1 и button1 в поле Text окна Properties (рисунки 15 и 16). Рисунок 15 – Изменение текста надписи элементов label1 и button1 Рисунок 16 – Форма 2 Пусть по нажатию на кнопку Ok, программа выдает некоторое сообщение для пользователя, чье имя введено в поле textBox1. Для этого двойным нажатием на кнопку Ok переходим в редактор кода и в текущее положение курсора вставляем строку MessageBox::Show("Привет, " + textBox1->Text); в блок обработчика события button1_Click (щелчок на кнопке 1). 3 Запускаем программу на выполнение (рисунок 17). Рисунок 17 – Результат выполнения программы Задание 2. Выполните все этапы создания простейшей формы, описанные в примере 1. Пример 2 Создание идентификационной формы Очень часто доступ к какой-либо программе, вход в сеть, на сайт и т.п. ограничен и разрешен только для пользователь, которые знают пароль. На основе формы, созданной в примере 1, создадим идентификационную форму пользователя. 1 Изменим название формы (поле Text) на «Идентификация пользователя», добавим еще одну метку label2, поле для ввода textBox2 и pictureBox1, указав в поле Image путь к изображению (рисунок 19). Рисунок 19 – Идентификационная форма 2 Т.к. по нажатию на кнопку Ok, программа должна проверять пароль, то двойным нажатием на кнопку Ok переходим в редактор кода и изменяем строку MessageBox::Show("Привет, " + textBox1->Text); на условный оператор if(textBox2->Text=="d45gtr") MessageBox::Show("Привет, " + textBox1->Text + "\n" + "Вход выполнен"); else MessageBox::Show("Неверный пароль"); В данном примере пароль – d45gtr, текст "Вход выполнен", может быть заменен любым другим сообщением. 3 Запускаем программу на выполнение (рисунки 20, 21). Рисунок 20 – Результат работы программы при неверном вводе пароля Рисунок 21 – Результат работы программы при верном вводе пароля 4 Обычно, символы пароля при вводе заменяются, например, *. Для такой замены необходимо в свойствах элемента управления textBox2 (текстовое поле для ввода пароля) настроить PasswordChar (символ пароля) как показано на рисунке 22. Рисунок 22 – Изменение свойства PasswordChar В результате ввода пароля на экране отображаются звездочки (рисунок 23). Рисунок 23 – Символы пароля закрыты 5 Предположим, что идентификацию может проходить ограниченное число пользователей. Для того, чтобы им не вводить каждый раз имя при прохождении идентификации, вместо поля для ввода имени создадим список имен. Удаляем с формы поле textBox1, помещаем элемент управления comboBox1 и меняем текст, например на «Выберите» (рисунок 24). Рисунок 24 – Размещение элемента и изменение текста 6 Создадим список имен в поле Items окна свойств Properties (рисунок 25). Рисунок 25 – Создание списка 7 Т.к. элемент управления textBox1 был удален с формы, то необходимо исправить код, заменив textBox1 на comboBox1 в условном операторе: if(textBox2->Text=="d45gtr") MessageBox::Show("Привет, " + comboBox1->Text + "\n" + "Вход выполнен"); else MessageBox::Show("Неверный пароль"); Запустите программу на выполнение и просмотрите результат. Программу можно и далее усложнять, например, присвоить каждому пользователю уникальный пароль, разрешить создание нового пользователя и т.д. 8 Завершим разработку приложения созданием кнопки «Очистить» для очистки поля с паролем и кнопки «Выйти» для выхода из программы. Размещаем элементы button2 и button3 на форме и меняем текст надписи (рисунок 26). Рисунок 26 – Форма идентификации пользователей в окне конструктора 9 Дважды щелкаем по кнопке Очистить и в текущее положение курсора вставляем строку textBox2->Clear(); При нажатии на кнопку Очистить, введенный текст в поле textBox2 (поле для ввода пароля) будет удален. 10 Дважды щелкаем по кнопке Выйти и в текущее положение курсора вставляем строку Close(); При нажатии на кнопку Выйти программа будет закрыта. Готовая форма идентификации пользователя показана на рисунке 27, фрагмент кода – на рисунке 28. Рисунок 27 – Готовая форма идентификации пользователя Рисунок 28 – Фрагмент кода программы Задание 3 Выполните все этапы создания идентификационной формы, описанные в примере 2. 4 API-функции В рассмотренных примерах для создания окна с сообщением использовалась функция MessageBox. Функция MessageBox является API-функцией, а Show – метод. API (сокр. от Application Programming Interface – интерфейс программирования приложений) – набор функций, который программист может использовать для доступа к функциональности программной компоненты (программы, модуля, библиотеки). Практически все операционные системы (Unix, Windows, MacOS, и т. д.) имеют API, с помощью которого программисты могут создавать приложения для этой операционной системы. Windows-API состоит из целого ряда функций, которые позволяют использовать системные Windows-конструкции. Все Windows-API-функции были написаны в C++, но их можно использовать и из Visual Basic. Дополнительная информация В индустрии программного обеспечения общие стандартные API для стандартной функциональности имеют важную роль, так как они гарантируют, что все программы, использующие общий API, будут работать одинаково хорошо или, по крайне мере, типичным привычным образом. В случае API графических интерфейсов это означает, что программы будут иметь похожий пользовательский интерфейс, что облегчает процесс освоения новых программных продуктов. С другой стороны, отличия в API различных операционных систем существенно затрудняют перенос приложений между платформами. Существуют различные методы обхода этой сложности — написание «промежуточных» API, написание библиотек, которые отображают системные вызовы одной ОС в системные вызовы другой ОС, введение стандартов кодирования в языках программирования (например, стандартная библиотека языка C), написания интерпретируемых языков, реализуемых на разных платформах (sh, perl, php, tcl, Java, и т. д.) Поскольку API состоит из большого числа функций, может сложиться впечатление, что при компиляции каждой программы, написанной для Windows, к ней подключается код довольно значительного объема. В действительности это не так. Функции API содержатся в библиотеках динамической загрузки (Dynamic Link Libraries, или DLL), которые загружаются в память только в тот момент, когда к ним происходит обращение, т.е. при выполнении программы. Дополнительная информация Динамическая загрузка обеспечивает ряд существенных преимуществ. Во-первых, поскольку практически все программы используют API-функции, то благодаря DLLбиблиотекам существенно экономится дисковое пространство, которое в противном случае занималось бы большим количеством повторяющегося кода, содержащегося в каждом из исполняемых файлов. Во-вторых, изменения и улучшения в Windowsприложениях сводятся к обновлению только содержимого DLL-библиотек. Уже существующие тексты программ не требуют перекомпиляции. Одним из подмножеств API является GDI (Graphics Device Interfase – интерфейс графического устройства). GDI – это та часть Windows, которая обеспечивает поддержку аппаратно-независимой графики. Благодаря функциям GDI Windows-приложение может выполняться на самых различных компьютерах. Пример 3 Изменение параметров MessageBox.Show Метод MessageBox::Show имеет несколько параметров, которые описываются в круглых скобках и перечисляются через запятую. В предыдущих примерах у MessageBox.Show мы использовали только один параметр string message (текст сообщения): MessageBox::Show("Привет, " + comboBox1->Text + "\n" + "Вход выполнен"); и MessageBox::Show("Неверный пароль"); Параметры MessageBox.Show string message – текст сообщения; string caption – заголовок окна; MessageBoxButtons – кнопки, расположенные в окне; MessageBoxIcon – значок, расположенный в окне; MessageBoxDefaultButton – кнопка по умолчанию; MessageBoxOptions – дополнительные параметры. Большинство диалоговых окон используют несколько параметров MessageBox::Show (рисунок 29). Рисунок 29 – Элементы диалогового окна С учетом параметров MessageBox::Show доработаем приложение «Идентификация пользователя» (см. пример 1 и 2). 1 Создадим заголовок для окон, например, "Вход в систему". Для этого добавляем второй параметр в MessageBox.Show: MessageBox::Show("Привет, " + comboBox1->Text + "\n" + "Вход выполнен", "Вход в систему"); и MessageBox::Show("Неверный пароль","Вход в систему"); 2 Определим на первом окне две кнопки – Ok и Отмена, на втором только Ok. Для этого добавляем третий параметр MessageBoxButtons: MessageBox::Show("Привет, " + comboBox1->Text + "\n" + "Вход выполнен", "Вход в систему",MessageBoxButtons::OKCancel); и MessageBox::Show("Неверный пароль","Вход в систему", MessageBoxButtons::OK); 3 Добавим на окна значки. Т.к. первое окно соответствует сообщению о прохождении идентификации, то в качестве значка можно выбрать Information Т.к. второе окно соответствует сообщению об ошибке, то в качестве значка можно выбрать Error: MessageBox::Show("Привет, " + comboBox1->Text + "\n" + "Вход выполнен", "Вход в систему",MessageBoxButtons::OKCancel,MessageBoxIcon::Information); и MessageBox::Show("Неверный пароль","Вход в систему", MessageBoxButtons::OK,MessageBoxIcon::Error); 4 Запускаем программу на выполнение (рисунки 30, 31). Рисунок 30 – Окна до изменения параметров MessageBox::Show Рисунок 31 – Окна после изменения параметров MessageBox::Show Задание 4 Выполните все этапы изменения параметров MessageBox::Show, описанные в примере 3. Анализ кода 5 Среда Visual C++ реализует объектно-ориентированное программирование. Формы создаются на базе класса управления System, а именно класса System.Windows.Forms. Обзор классов осуществляется нажатие на кнопку Object Browser (рисунки 32, 33). Рисунок 32 – Обзор объектов Рисунок 33 –Классы Рассмотрим код приложения «Идентификация пользователя» 1 Откроем код приложения «Идентификация пользователя». 2 Программа начинается с описания пространства имен: Команда using позволяет сослаться на классы в пакетах System, System.WinForms и System.Drawing и др. 3 Наше приложение состоит из одного класса Form1: public ref class Form1 : public System::Windows::Forms::Form 4 Для каждого элемента управления, расположенного на форме, дизайнер форм создает по одному полю соответствующего класса: Эти поля хранят ссылки, необходимые для выполнения всех операций с элементами управления формы. 5 Для инициализации приложения конструктор класса Form1 вызывает метод InitializeComponent: #pragma region Windows Form Designer generated code void InitializeComponent(void) { … … this->PerformLayout(); } Этот метод создает и инициализирует все элементы управления формы, а также задает их размеры и расположение в окне. Когда все элементы управления созданы, необходимо их проинициализировать и разместить в окне формы. На время выполнения этой операции метод InitializeComponent отключает на время механизм генерации сообщений, связанных с размещением элементов в окне формы: this->PerformLayout(); 6 Далее следуют обработчики событий для элементов управления, размещенных на форме (двойной щелчок на элементе управления). Обработчик события Click (щелчок) для кнопки button1: private: System::Void System::EventArgs^ button1_Click(System::Object^ sender, e) { … } Обработчик события Click (щелчок) для кнопки button2: private: System::Void System::EventArgs^ button2_Click(System::Object^ sender, e) { textBox2->Clear(); } Обработчик события Click (щелчок) для кнопки button3: private: System::Void button3_Click(System::Object^ System::EventArgs^ e) { Close(); } sender, Задание 5 Выполните анализ кода созданного приложения. 6 Расчетные формы Пример 4 Создание расчетной формы Создадим оконное приложение для расчета амортизационных отчислений по формуле где S0 – начальная стоимость имущества, SN – остаточная стоимость имущества, N – срок эксплуатации. 1 Создаем форму с тремя полями textBox1, textBox2, textBox3; С пятью метками label1 – label5 и одной кнопкой (рисунок 34). Рисунок 34 – Форма Ответ поместим в label5, поэтому надпись label5 удаляем. 2 Дважды щелкаем по кнопке Ok и в текущее положение курсора вставляем строки int s0=Convert::ToInt32(textBox1->Text); int sN=Convert::ToInt32(textBox2->Text); int N=Convert::ToInt32(textBox3->Text); float a; a=(s0-sN)/N; label5->Text=Convert::ToString(a); Команда Convert::ToInt32 textBox1, textBox2, textBox3 преобразует текст, введенный в поля в целочисленный формат, т.к. данные введенные в текстовые поля воспринимаются только как текст, и, следовательно, арифметические действия невозможны. Команда Convert::ToString(a); преобразует числовой результат a в строковый (String). 3 Выполним тестирование программы. Определим ежегодные амортизационные отчисления на оборудование начальной стоимостью 3 млн. руб., сроком эксплуатации 10 лет и остаточной стоимостью 500 тыс. руб. (рисунок 35). Рисунок 35 – Результат расчета Задание 6 Выполните все этапы создания расчетной формы, описанные в примере 4. Исключите возможность ошибочного ввода данных (например, ввода отрицательных значений, нулевого значения срока эксплуатации т.п.). Пример 5 Создание простейшего меню Создадим простейшее меню для приложения предыдущего примера. Перетаскиваем управляющий элемент MenuStrip на форму приложения (рисунок 36). Рисунок 36 – Добавление управляющего элемента MenuStrip на форму Создаем выпадающее меню Файл с несколькими пунктами (рисунок 37). Рисунок 37 – Создание меню Сделаем активным простейший пункт – Выход. Дважды щелкаем на пункте Выход, чтобы добавить код: Close(); Программу можно совершенствовать. Например, предусмотреть экспорт результата в другое приложение, импорт исходных данных. Можно сделать так, что каждый раз, когда пользователь попытается закрыть приложение, приложение будет его спрашивать, действительно ли он хочет выйти и т.д. Задание 7 Выполните все этапы создания простейшего меню, описанные в примере 5. Задание 8. Выполните зачетную работу №1 с использованием конструктора форм Windows Forms. Примеры оформления представлены на рисунках: Примеры использования математических функций: s=a*Math::Pow(3,0.5)*5; z=1+Math::Sin(Math::Pow(x*y,1/3));