запустить Visual Studio. Как только VS запустили, нажимаем последовательно Файл > Создать > Проект После этого в открывшемся окне будет предложено выбрать тип проекта. Нам необходимо выбрать в разделе Visual C++ подраздел CLR и выбрать пункт Пустой проект CLR. Когда проект будет создан, в обозревателе решений кликаем правой кнопкой мыши по созданному проекту. В открывшемся контекстном меню последовательно выбираем Добавить > Создать элемент и в открывшемся меню в разделе UI выбираем Форма Windows Forms
После этого перезагрузить Visual Studio и снова открыть проект.
Когда форма будет добавлена, в обозревателе решений выбираем файл MyForm.cpp. Перед вами откроется новая вкладка с единственной строчкой кода:
#include "MyForm.h"
В этот файл нам необходимо добавить следующий код:
using namespace System;
using namespace System::Windows::Forms;
[STAThreadAttribute]
void Main(array^ args) {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Project1::MyForm form;
Application::Run(%form);
}
После этого в свойствах проекта. Выбираем подраздел Система раздела Компоновщик и в строке Подсистема из выпадающего меню выбираем Windows (/SUBSYSTEM:WINDOWS) и нажимаем Применить.
Не закрывая окно свойств проекта, переходим в подраздел Дополнительно и в строке Точка входа пишем Main и после этого нажимаем клавишу ОК.
На этом настройки проекта заканчиваются. Для редактирования внешнего вида формы, необходимо перейти во вкладку MyForm.h [Конструктор], кликнув дважды по файлу MyForm.h в обозревателе решений.
Текст модуля «Form1.h«
При создании проекта, система Microsoft Visual Studio генерирует программный код, который сохраняется в различных файлах.
Главным файлом, в котором программист создает собственный код программы, есть файл «Form1.h«. Этот файл соответствует главной форме приложения. На главной форме размещаются различные компоненты. С помощью этих компонент реализуется решение конкретной задачи. При создании проекта создается пустая форма (рисунок 6). Кроме главной формы можно создавать другие формы и добавлять их к проекту.
Листинг файла «Form1.h» следующий.
#pragma once namespace MyApp01 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing; ///
/// Summary for Form1
/// public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
} protected:
///
/// Clean up any resources being used.
///
Form1()
{
if (components)
{
delete components;
}
} private:
///
/// Required designer variable.
/// System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// void InitializeComponent(void)
{
this->components = gcnew System::ComponentModel::Container();
this->Size = System::Drawing::Size(300,300);
this->Text = L"Form1";
this->Padding = System::Windows::Forms::Padding(0);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
}
#pragma endregion
};
}
Объясним некоторые фрагменты кода в тексте программы.
В вышеприведенном тексте создается пространство имен MyApp01 с помощью оператора
namespace MyApp01 {
...
}
В этом пространстве имен подключаются другие пространства имен из библиотеки .NET Framework:
System
System::ComponentModel
System::Collections
System::Windows::Forms
System::Data
System::Drawing
В пространстве имен MyApp01 создается класс с именем Form1. Этот класс соответствует главной форме приложения Form1.
Класс содержит конструктор, который вызывает метод
InitializeComponent();
В методе InitializeComponent() создается компонента-форма (переменная components), которая есть контейнером. Это означает, что на форме могут размещаться другие компоненты (кнопки, метки, поля ввода и т.д.). Также в методе InitializeComponent() настраиваются параметры формы: название заголовка, размер (300 * 300 пикселей), шрифт по умолчанию.
Деструктор класса Form1() уничтожает форму (переменная components) с помощью оператора delete.
Файлы, которые создаются в проекте После создания проекта типа Windows Forms Application система Microsoft Visual Studio создает несколько файлов.
Как было сказано раньше, главным файлом есть файл «Form1.h» (см. п. 5). Также, согласно правилам языка C++, создается файл реализации «MyApp01.cpp«. В этом файле есть главная функция main(). Этот файл содержит код отображающий главную форму.
Листинг файла «MyApp01.cpp» следующий:
// MyApp01.cpp : main project file.
#include "stdafx.h"
#include "Form1.h" using namespace MyApp01; [STAThreadAttribute] int main(array<System::String ^> ^args)
{
// Enabling Windows XP visual effects before any controls are created
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false); // Create the main window and run it
Application::Run(gcnew Form1());
return 0;
} Файл «MyApp01.vcxproj«. Это главный файл проектов на Visual C++, которые генерируются с использованием мастера приложений (Application Wizard). В нем содержится информация о версии Visual C++, в которой сгенерирован файл, информация о платформах, настройках и особенностях (характеристиках) проекта выбранных с помощью мастера приложений (Application Wizard).
Файл «MyApp01.vcxproj.filters«. Это есть файл фильтров для сгенерированных проектов на Visual C++ с использованием мастера приложений (Application Wizard). В нем содержится информация об ассоциации между файлами в вашем проекте и фильтрами. Эта ассоциация используется в интегрированной среде, чтобы показать группирование файлов с одинаковыми расширениями.
Файл «AssemblyInfo.cpp«. Содержит пользовательские атрибуты для модификации данных сборки.
Файли «StdAfx.h» и «StdAfx.cpp«. Они используются для создания файла скомпилированных заголовков (PCH) с именем «MyApp01.pch» и скомпилированных типов названных «StdAfx.obj«.
Для запуска проекта на выполнение используется команда Start Debuggin из меню Debug (клавиши F5).
После того как мы создали проект, должна появиться пустая форма, которая должна выглядеть примерно так:
Справа должна появиться панель элементов, если ее нет, то можно включить ее в меню Вид→Панель Элементов или нажатием горячих клавиш — Ctrl + Alt + X.
На ней расположены различные элементы для вставки в форму, нам понадобятся только элементы Button (Кнопка), Label (Надпись) и TextBox (Текстовое поле). Перетащите на форму три элемента Label, Два элемента TextBox, и одну кнопку (Button), расставьте элементы примерно так:
Теперь нам нужно будет изменить текст надписей для элементов Label и Button и Задать подходящие имена классов для элементов TextBox. Для этого Выделите элемент label1, перейдите в Панель свойств, (обычно она находится под Панелью элементов, если панель выключена, включите ее в меню Вид -> Диспетчер свойств.) и задайте для данного элемента значение атрибута Text как показано на рисунке.
Задайте атрибут Text для всех элементов Label и Кнопки Button аналогичным образом. Наша форма должна принять примерно следующий вид:
Я сделал кнопку развернуть неактивной, так как изменение размеров данной формы испортит ее внешний вид, Вы также можете это сделать, щелкнув левой кнопкой мыши на пустом месте формы и в Панели свойств задать для атрибута MaximizeBox параметр False.
Теперь задайте для текстовых полей (TextBox) Атрибуты Name в Панели Свойств – для первого поля это будет num1, а для второго, соответственно num2. Тем самым мы изменили имена классов для полей TextBox, чуть позднее Вы поймете зачем.
Итак, каркас формы готов, если откомпилировать и запустить программу, то мы увидим, какой будет наша форма на финише, правда сейчас она совершенно бесполезна. Перейдем к написанию обработчика событий для кнопки Button, т.е. что будет происходить при нажатии на эту кнопку, также мы напишем саму функцию вычисления факториала, которую мы будем использовать в обработчике.
Первым делом нужно добавить заголовочный файл fact.h в проект, для этого щелкаем правой кнопкой мыши в Обозревателе решений на папке Заголовочные файлы, далее меню Добавить -> Создать Элемент, вписываем название файла – fact.h и нажимаем Добавить. В данном файле будет содержаться прототип функции для вычисления факториала. Добавляем туда следующий исходный код.
long double fact(int N);
Далее подключаем этот файл к проекту с помощью директивы #include – Открываем файл factr.cpp и добавляем после строчки #include "stdafx.h" следующий код.
#include "fact.h"
Теперь наш заголовочный файл подключен к проекту, далее аналогичным образом создаем файл исходного кода fact.cpp в проект.
В него добавляем саму функцию вычисления факториала целого числа.
#pragma once
#include "stdafx.h" long double fact(int N)
{
// если пользователь ввел отрицательное число
if(N < 0)
// возвращаем ноль
return 0;
// если пользователь ввел ноль
if (N == 0)
// возвращаем факториал нуля
return 1;
// Во всех остальных случаях
else
// делаем рекурсию
return N * fact(N - 1);
}
Теперь наш проект содержит функцию вычисления факториала, откомпилируйте его, если ошибок нет, то можно приступить к написанию обработчика событий для кнопки Button.
Открываем файл Form.h, в нем мы видим визуальное представление нашей формы. Щелкаем двойным щелчком на кнопке Button и переходим к исходному коду.
После фигурной скобки ставим абзац и приступаем к кодированию. Любой набор символов, которые мы вводим с клавиатуры в текстовое поле программы является строкой, поэтому нам нужно вытащить значение из текстового поля и привести его к целочисленному типу. Это довольно сложная процедура, но, к счастью в языке C++ уже есть множество функций, выполняющих конвертирование типов данных. Сначала нам необходимо описать и инициализировать переменную, в которой будет храниться значение числа, для которого должен быть вычислен факториал. Добавим в том место, где Вы поставили абзац следующий код:
int number = System::Convert::ToDouble(num1->Text);
Эта строка инициализирует переменную, которая хранит в себе число для вычисления его факториала. Далее нам нужно будет произвести вызов нашей функции fact с переменной number в качестве единственного аргумента и занести результат работы функции в новую переменную factor.
double factor = fact(number);
И затем преобразовать полученное значение обратно в строку и присвоить его второму текстовому полю.
num2->Text = System::Convert::ToString(factor);
Таким образом, наш простой обработчик событий будет выглядеть вот так:
int number = System::Convert::ToDouble(num1->Text);
double factor = fact(number);
num2->Text = System::Convert::ToString(factor);
Теперь можно скомпилировать и запустить готовую программу и проверить ее. Помните, что тип double в С++ может хранить число не превышающее !170.
Листинг файлов проекта
MyForm.cpp
#include "MyForm.h"
#include "fact.h" using namespace System;
using namespace System::Windows::Forms;
[STAThreadAttribute]
void Main(array^ args) {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
ProjectCLRExampleFirst::MyForm form;
Application::Run(%form);
}
fact.h
#pragma once
long double fact(int N);
MyForm.h
#pragma once namespace ProjectCLRExampleFirst { using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing; long double fact(int N)
{
// если пользователь ввел отрицательное число
if (N < 0)
// возвращаем ноль
return 0;
// если пользователь ввел ноль
if (N == 0)
// возвращаем факториал нуля
return 1;
// Во всех остальных случаях
else
// делаем рекурсию
return N * fact(N - 1);
}
///
/// Summary for MyForm
///
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
} protected:
///
/// Clean up any resources being used.
///
MyForm()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::Label^ label3;
private: System::Windows::Forms::TextBox^ num1;
private: System::Windows::Forms::TextBox^ num2;
private: System::Windows::Forms::Button^ button1;
protected: private:
///
/// Required designer variable.
///
System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
void InitializeComponent(void)
{
this->label1 = (gcnew System::Windows::Forms::Label());
this->label2 = (gcnew System::Windows::Forms::Label());
this->label3 = (gcnew System::Windows::Forms::Label());
this->num1 = (gcnew System::Windows::Forms::TextBox());
this->num2 = (gcnew System::Windows::Forms::TextBox());
this->button1 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(12, 24);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(250, 13);
this->label1->TabIndex = 0;
this->label1->Text = L"Эта программа вычисляет значение факторала";
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(38, 62);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(114, 13);
this->label2->TabIndex = 1;
this->label2->Text = L"Введите целое число";
//
// label3
//
this->label3->AutoSize = true;
this->label3->Location = System::Drawing::Point(38, 102);
this->label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(37, 13);
this->label3->TabIndex = 2;
this->label3->Text = L"Ответ";
//
// num1
//
this->num1->Location = System::Drawing::Point(158, 59);
this->num1->Name = L"num1";
this->num1->Size = System::Drawing::Size(100, 20);
this->num1->TabIndex = 3;
//
// num2
//
this->num2->Location = System::Drawing::Point(158, 95);
this->num2->Name = L"num2";
this->num2->Size = System::Drawing::Size(100, 20);
this->num2->TabIndex = 4;
//
// button1
//
this->button1->Location = System::Drawing::Point(103, 140);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(75, 38);
this->button1->TabIndex = 5;
this->button1->Text = L"Вычислить факториал";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
//
// MyForm
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(284, 261);
this->Controls->Add(this->button1);
this->Controls->Add(this->num2);
this->Controls->Add(this->num1);
this->Controls->Add(this->label3);
this->Controls->Add(this->label2);
this->Controls->Add(this->label1);
this->MaximizeBox = false;
this->Name = L"MyForm";
this->Text = L"MyForm";
this->ResumeLayout(false);
this->PerformLayout(); }
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
int number = System::Convert::ToDouble(num1->Text);
double factor = fact(number);
num2->Text = System::Convert::ToString(factor);
}
};
} |