Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ISVP_Labs_16_17.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
8 Мб
Скачать
☆

5.Приложение WinForms (cli)

Если все идет хорошо, значит, вы

чего-то не заметили

Закон Мерфи

Цель работы – освоить разработку приложения Windows на основе каркаса Windows Forms (4 час.).

5.1.Задание

Разработайте приложение на основе каркаса Windows Forms, которое бы иллюстрировало использование меню и наиболее часто встречающихся управляющих элементов: как метки, элементы ввода, кнопки и т.д.

5.2.Бесценные методические предписания

Рассмотрим сначала пример создания приложения, которое будет выполнять сложнейшие математические расчеты.

Шаг 1. Создаем проект. Выберите каркас приложения в соответствии с рис. 1: выберите Visual C++ в левой панели и Windows Forms Application – в правой. Тем самым мы получим возможность использовать, в частности, язык C++/CLI для программирования. Настоятельно рекомендую не устанавливать переключатель «Create directory for solution». В данном сценарии я нарек проект оригинальным именем DiaWin.

Рис. 1. Выбор каркаса приложения

По завершению работы мастака по созданию проекта не поленитесь запустить проект на построение и выполнение: если вам повезет, то вы увидите скромное окно умеренного размера. Скорее захлопните окно, пока оно не испортилось.

Посмотрите в окно Solution Explorer (рис. 2) на состав файлов проекта. Наибольший интерес для нас представляют файлы с расширением .h и .cpp.

Посмотрите на содержимое файла AssemblyInfo.cpp, в котором содержится, как следует из имени файла, информация (Info, если кто не знает) о сборке (Assembly): имя компании, продукта, авторские права, версия и т.п. НЕ изменяйте содержимое этого файла и вообще больше его по пустякам не открывайте. Та же рекомендация относится и к файлам stdafx.h и stdafx.cpp.

В файле DiaWin.cpp находится функция main(), с которой, как обычно, и начинается выполнение приложения. Обратите внимание, что в нем подключается пространство имен DiaWin (его имя совпадает с именем проекта) и оно объявлено (описано) в файле Form1.h. Собственно само выполнение приложения начинается с выполнения метода Run класса Application, который объявлен в пространстве имен System.Windows. В качестве параметра метода Run ему передается созданный с помощью оператора gcnew Form1() объект окно, которое вы и лицезрели при запуске программы на выполнение. Так какое же имя имеет объект окно нашего приложения? Под страхом смерти не изменяйте содержимое этого файла.

Рис. 2. Файлы проекта

Наибольший интерес для нас представляет файл Form1.h, в котором и находится описание «нашего» класса Form1 со всеми его атрибутами и методами. Когда вы будете щелкать по имени файла Form1.h, то в окне редактирования будет отображаться ресурс «окно», а не содержимое файла. Чтобы увидеть содержимое файла – описания и программный код, вызовите контекстное меню и выберите в нем команду View Code (Ctrl+Alt+0). Сделали? Ну тогда внимательно изучите его содержимое, так как это вам необходимо.

Прежде всего хочу предостеречь от попыток изменения той части описания класса Form1, которая ограничена директивами препроцессора

#pragma region Windows Form Designer generated code

/// ...

#pragma endregion

Эта часть описания класса модифицируется ИС и не стоит вмешиваться в их работу. Например, когда вы добавите на форму какой-нибудь управляющий элемент, то именно в эту часть описания формы, а конкретно в метод void InitializeComponent(void), будет добавлен программный код, задающий свойства этого элемента. Например, при добавлении на форму кнопки Button будет добавлен такой код:

void InitializeComponent(void)

{

this->button1 = (gcnew System::Windows::Forms::Button());

this->SuspendLayout();

//

// button1

//

this->button1->Location = System::Drawing::Point(57, 45);

this->button1->Name = L"button1";

this->button1->Size = System::Drawing::Size(65, 28);

this->button1->TabIndex = 0;

this->button1->Text = L"button1";

this->button1->UseVisualStyleBackColor = true;

Если вы захотите удалить кнопку, просто удалите ее с формы и этот программный код исчезнет как по мановению биты.

На всякий случай проверьте, работает ли еще приложение, не поломалось ли оно.

Шаг 2. Добавляем в окно управляющие элементы. Если вы сейчас не видите окно приложения в панели ИС, сделайте двойной щелчок ЛКМ по имени файла Form1.h. Если курсор мыши поместить в клиентскую часть окна и вызвать контекстное меню, то в нем можно выбрать команду Properties и изменить или задать свойства окна, например, его заголовок. Команда меню View Code позволяет перейти к описанию класса окна, которому по умолчанию присвоено имя Form1.

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

Задайте свойства управляющих элементов так, чтобы это было красиво и понятно любому юзеру. Конечно, вы найдете подходящие надписи вместо всяких там label, button и т.п. неподобствах.

Р ис. 3. Віконце з керуючими елементами

Шаг 3. Осваиваем управляющие элементы ввода/вывода TextBox. Сделаем двойной щелчок по кнопочке и перед нашими очами предстанет обработчик этого действа, в который мы и добавим наши математические измышления, простите, вычисления:

Замечание. В операторе

X=Convert::ToDouble(textBox1->Text);

два двоеточия указаны потому, что Convert является абстрактным классом, в котором объявлены только статические методы. Этот класс имеет множество методов (см. справку), которые предназначены для преобразования данных из любого базового типа в другой базовый. Таких абстрактных классов в System достаточно много.

Оператор

X=Convert::ToDouble(textBox1->Text);

вполне можно заменить таким

X=Double::Parse(textBox1->Text);

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

Вот еще один из вариантов контроля ввода числовых данных пользователем:

Запрограммируйте и его, родимого, а предыдущий обработчик закомментируйте. За отдельную плату можно проиграть юзеру-лоху какой-нибудь ободряющий .wav-файл с помощью класса System::Media::SoundPlayer.

Шаг 4. Освоим менюшку? Сделайте активным окно формы, вызовите панель ToolBox, отыщите в ней банду Menus & Toolbars и заманите на форму стриптизера MenuStrip. Активируйте поле Type Here, в котором вы можете задать первую тему главного меню. Обратите внимание на малюсенький треугольник в верхнем правом углу панели меню (рис. 4). Щелчок ЛКМ по нему вызовет всплывающее меню, в котором вы можете выбрать команду Insert Standard Items и получить бесплатно «стандартное» меню, которое впоследствии вы сможете редактировать. В обработчике меню Exit просто вызовите функцию Close().

Рис. 4. Вызов помощника по строительству меню

Шаг 5. Овладеваем чтением и записью файлов. Давайте осчастливим юзера решением следующей задачи. Пусть в текстовом файле с произвольным числом записей находятся числа вещественного типа по два в каждой записи, например:

12,3 1e3

5 -10,5

3 17,9

Наша-ваша программа:

  • запрашивает у пользователя имя файла;

  • открывает и читает его записи в массивы (первое число в один массив, а второе – соответственно во второй);

  • выводит эти числа, строго поочередно, в элементы textBox1 и textBox2 на формочке по нажатию какого-нибудь завалящего кнопаря, клавише или любым другим понятным даже просвещенному юзеру способом;

  • сама нажимает кнопку сложения чисел;

  • в процессе суммирования чисел программа формирует результирующий массив;

  • по команде FileSave as программа сохраняет результаты вычислений в выходном файле.

Как-то само-собой получается, что выходной файл будет иметь, например, такой вид:

12.3 + 1e3 =1012.3

5 + -10.5 =-5.5

3 + 17.9 = 20.9

Шаг 6. Открываем и читаем файл. На панели ToolBox найдите группу Dialogs и извлеките из нее на форму элементы OpenFileDialog и SaveFileDialog заодно. Вы можете пристраивать их в любое место формы, они все равно «упадут вниз», но не разобьются.

Данные, которые будут прочитаны из файла, надо разместить в массивах. Используем для этой цели так называемые динамические массивы, память для которых будем выделять там, где это необходимо. Опишите массивы выше в файле, например, в таком месте:

protected:

array <Double> ^Arr1, ^Arr2, ^Arr3;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]