Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯиМП.doc
Скачиваний:
4
Добавлен:
29.07.2019
Размер:
298.5 Кб
Скачать

Создание нового проекта Windows Forms

  • В меню Файл последовательно выберите команды Создать и Проект....

  • В узле Visual C++ области Типы проектов выберите CLR, а затем в области Шаблоны выберите Приложение Windows Forms.

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

  • Откроется конструктор Windows Forms, отображающий форму Form1 созданного проекта.

Понятие события

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

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

Обработчик событий

Обработчик событий — это метод, связанный с событием. При возникновении события выполняется код внутри обработчика событий. В каждом обработчике событий существует два параметра, которые позволяют правильно обработать событие. В следующем примере показан обработчик события Click для элемента управления Button.

private:

void button1_Click(System::Object ^ sender,

System::EventArgs ^ e) { }

Первый параметр, sender, предоставляет ссылку на объект, вызвавший событие.

Второй параметр, e, в примере передает объект, связанный с обрабатываемым событием. Например, при возникновении события MouseDown так мы можем узнать координаты мыши e->X, e->Y или какая кнопка мыши была нажата e->Button.

Маркер (^)

В Visual C++ 2008 объект ссылочного типа класса объявляется с помощью нового маркера (^), который называется дескриптором отслеживания, а неформально - шапкой.

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

Объект имеет доступ к своим членам с помощью оператора (->).

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

сборка мусора - процесс транзитивной проверки всех указателей на активно используемые объекты, в результате которой выявляются все доступные для ссылок объекты; эти объекты упорядочиваются, а высвободившаяся память кучи становится доступной для повторного использования.

Создание обработчика событий

Первый способ:

В конструкторе Windows Forms двойной щелчок формы или элемента управления создает обработчик событий для действия по умолчанию для данного элемента.

Второй способ:

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

  • В окне Свойства нажмите кнопку События (молния).

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

  • В поле справа от имени события введите имя обработчика и нажмите клавишу ENTER.

  • Добавьте соответствующий код в обработчик событий.

Создание простого приложения

Создание формы Windows Forms

Запустите Visual Studio.

Создайте приложение Windows с именем HelloWorld.

Из панели элементов перетащите в форму элемент управления Button.

Выделите его щелчком мыши. В окне "Свойства" присвойте свойству Text значение "Say Hello".

Написание кода приложения

Дважды щелкните кнопку, чтобы добавить обработчик событий Click. Откроется редактор кода, при этом положение курсора окажется внутри обработчика событий.

Вставьте следующий код:

MessageBox::Show("Hello, World!");

Тестирование приложения

Нажмите клавишу F5, чтобы запустить приложение.

Когда приложение запущено, нажмите кнопку и проверьте, отображается ли фраза "Hello, World!".

Закройте форму Windows Forms, чтобы вернуться в Visual Studio.

Visual C++ в среде .NET

Лекция 6

Архитектура .NET Framework

Типы в CLR

Основой платформы .NET Framework является среда CLR (Common Language Runtime). А в основе этой среды лежит общая система типов (Common Type System, CTS).

Любой тип в CLR — производный от фундаментального системного типа System.Object. Это обстоятельство отличает CLR от ≪классической≫ среды разработки на C++, где типы (базовые, такие как int. long и char) определяют в основном способ размещения в памяти.

Типы CLR имеют в своем распоряжении возможности System.Object.

Пример описания переменной

Equals определяет, равен ли данный экземпляр указанному объекту;

GetType возвращает тип экземпляра в период выполнения;

ToString преобразует значение в эквивалентное строковое представление;

Finalize позволяет объекту освободить ресурсы и выполнить прочие операции очистки до того, как им займется сборщик мусора;

MemberwiseClone выполняет неполное копирование экземпляра CLR-типа.

Почему изменился C++

Разработчики традиционного C++ должны сами следить за использованием ресурсов и предотвращать утечку памяти. .NET освобождает их от этой заботы и берет сбор мусора на себя.

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

Такая память получила название управляемой кучи (managed heap).

Язык С++ не является языком .NET платформы и не создаёт управляемого кода и управляемых данных. Все данные являются неуправляемыми и хранятся в стеке или неуправляемой куче.

Управляемый С++

Язык C++.NET (Managed С++) - это С++, в который были добавлены специальные ключевые слова. Их называют управляемым расширением (managed extension). Например, классы, помеченные ключевым словом __gc, считаются управляемыми и их объекты будут помещены посредством оператора new в память, называемую управляемой кучей (managed heap).

Сборщик мусора GC (garbage collector) удаляет из управляемой кучи данные, которые больше не нужны.

Неуправляемые данные (unmanaged data) находятся в стеке или размещаются с помощью оператора new в неуправляемой куче (unmanaged heap или heap), из которой удаляются с помощью оператора delete.

Программисты могут в пределах одного программного кода разделить данные на управляемые и неуправляемые.

Язык C++/CLI

Язык C++/CLI является дальнейшим развитием языка C++.NET. Изменения произошли не только в языке, но и в реализации.

Исчезли введённые в языке C++.NET ключе- вые слова, начинающиеся с двух подчёркиваний - __gc, __delegate, __event, __value и другие. Введены другие слова, связанные с управляемым кодом (без подчёркивания). Например, вместо ключевого слова __gc теперь перед управляемым классом ставится ref, вместо двух слов __gc new используется одно слово gcnew. Теперь управляемый указатель (дескриптор отслеживания или просто дескриптор) начинается с символа ^(handle), а не с символа *(pointer), как было в языке C++ .NET.

Ссылочные типы и типы значения

Структуры и классы в С++/CLI могут быть управляемыми (ссылочного типа) и типа значения. Для управляемых типов используются пары слов ref class (ref struct), для типов значений – value class (value struct).

Базовые типы int, char, bool, double, float и другие являются типами значениями.

Пример объявления классов

#include "stdafx.h"

using namespace System;

value class Vclass { // Класс Vclass имеет тип-значение

private: int x;

public: void Set (int vX) {x= vX;}

void Show ( )

{System::Console::WriteLine("x= "+ x.ToString()); }

};

ref class Mclass { // Класс Mclass имеет управляемый тип

private: int x;

public: void Set (int vX) {x= vX;}

void Show ( )

{System::Console::WriteLine("x= " + x.ToString()); }

};

Пример использования классов

int main()

{ // Создать объект в стеке

Vclass V;

V.Set (1);

V.Show();

// Создать объект в неуправляемой куче

Vclass *pV= new Vclass() ;

pV -> Set(2);

pV -> Show();

// Создать объект в управляемой куче

Mclass ^pM= gcnew Mclass();

pM -> Set(3);

pM -> Show();

return 0;

}

Массивы в C++/CLI

В C++/CLI можно создавать массивы, которые размещаются в управляемой куче. Синтаксис объявления такого массива следующий:

[qualifiers] array<[qualifiers]type1[, dimension]>^ var =

gcnew array<type2[, dimension]>(val[,val...])

Где:

dimension – размерность массива. По умолчанию – 1, максимальная – 32;

type1 – тип переменной;

type2 – тип значений инициализации;

val – количество элементов массива;

qualifiers – класс памяти (mutable, volatile, const, extern, static);

var – имя переменной.

Пример двумерного массива объектов

#define ARRAY_SIZE 2

ref class MyClass {

public:

int m_i;

};

int i, j;

array< MyClass^, 2 >^ X = gcnew array< MyClass^,

2 >(ARRAY_SIZE, ARRAY_SIZE);

for (i = 0 ; i < ARRAY_SIZE ; i++)

for (j = 0 ; j < ARRAY_SIZE ; j++) {

X[i,j] = gcnew MyClass;

X[i,j] -> m_i = i;

}

Свойства

В C++/CLI появился новый тип данных - свойства.

Свойство, описанное в классе, позволяет безопасно использовать связанную с ним закрытую обычную или ссылочную переменную, устанавливая или получая её значение. Свойство приписывает этой переменной имя свойства. В дальнейшем ссылка к переменной осуществляется через имя свойства.

При использовании свойства автоматически выполняются функции set и get, которые устанавливают или получают значение переменной свойства, позволяя при этом осуществлять её контроль или выполнять с ней какие-либо действия. Эти функции определяются при описании свойства.

Создание свойства

property тип имя-свойства

{

void set (тип value)

{ код реализации set, использующий параметр

value и переменную или ссылку свойства

}

тип get ()

{ код реализации get, возвращающий значение

переменной или ссылки свойства

}

}

При необходимости можно описать свойство только с одной функцией. Свойство должно иметь доступ public, иначе оно не применимо к объекту.

Пример создания и использования свойства

ref class CPlane{ // Класс, содержащий описание свойства private:

lnt aSpeed; // Закрытая переменная свойства Speed

public:

// Описание свойства Speed

property int Speed {

void set (int vProp) // Установить значение свойства

{aSpeed= vProp;}

int get() // Возвратить значение свойства

{return aSpeed;}>

}

};

void main ( ){

CPlane ^p= gcnew CPlane; // Создать объект

p -> Speed= 600; // Присвоить значение

Console::WriteLine (p -> Speed); // Получить значение и выдать

}