Краткие теоретические положения




Цель работы

Познакомиться с понятиями «класс» и «объект»; изучить принципы работы с классом Graphics; создать программу из примера по приведенным инструкциям; разработать программу по своему варианту задания в программах на языке Visual С++.

Краткие теоретические положения

Объекты и классы. Понятие объекта-экземпляра класса

До сих пор мы пользовались свойствами и методами различных объектов, не встречая особых препятствий. Например, мы использовали метод Focus() объекта Button1 или свойство Text объекта Label1. Однако существуют объекты со своими свойствами и методами, которые не позволяют пользоваться ими напрямую, как мы делали до этого.

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

textBox1->Font->Size=14;

Однако компилятор Visual C++ при попытке построения исполняемого файла выдаст сообщение об ошибке примерно такого содержания:

error C2039: 'set': is not a member of 'System::Drawing::Font::Size'

В справочной системе эта ошибка поясняется следующим образом:

The code incorrectly calls or refers to a member of a structure, class, or union. (Программный код некорректно обращается к члену структуры, класса или объединения.)

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

Решение проблемы – в создании специальных объектов, являющихся экземплярами класса.

Класс – это набор методов и свойств, описывающих поведение объекта. В общем случае, класс подобен стандартному элементу управлению в визуальных средах разработки. Объект – это конкретный представитель определенного класса.

Каждый объект-экземпляр класса является точной копией описанного в классе объекта. Например, нам знакомы объекты типа Button. На самом деле все кнопки являются объектами-экземплярами класса Button, именно поэтому все они имеют одинаковые свойства и метода.

Создание объектов из класса

Посмотрим, каким образом можно создавать объекты-экземпляры класса. Рассмотрим два способа.

1 способ (Создание вручную во время разработки приложения). Создайте новый проект. Разместите на форме три кнопки. Знаете, что вы сейчас сделали? Вы создали несколько объектов из класса Button. Первый объект называется button1, второй – button2, третий – button3. Все они – экземпляры класса Button.

Сразу после своего создания объекты-кнопки одинаковы. После того, как объект создан, можно изменять его свойства, например, размер, цвет, надпись и т.д. Однако, как бы мы не меняли «внешность» кнопки, она всегда останется экземпляром класса Button. Аналогично, можно создать сколько угодно объектов класса Label или TextBox.

2 способ (Создание во время работы приложения). Объекты из класса можно создавать не только вручную во время проектирования приложения, как мы только что сделали, но и во время работы приложения. Для этого необходимо записать некоторые инструкции в какой-либо функции.

Пример программы №1. Создайте новый проект с формой, содержащей одну кнопку button1. Создайте такую процедуру обработки нажатия на кнопку button1:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

{Button^ btn1;

btn1 = gcnew Button();

btn1->Text = "Кнопка 1";

btn1->Width=90;

this->Controls->Add(btn1);

}

Сохраните проект и запустите его. Нажмите на кнопку button1, и у Вас на форме появится еще одна новая кнопка с надписью Кнопка 1.

Разберем подробно эту функцию. Для создаваемого объекта вначале нужно объявить переменную. Например, мы раньше объявляли переменные целого типа:

int X;

Мы в процедуре будем использовать переменную с названием btn1. При этом мы указываем ее тип как Button:

Button^ btn1;

Тип Button – это один из многих используемых в Visual C++ классов. Переменные, принадлежащие какому-нибудь классу, называются объектными. Поэтому можно сказать, что переменная btn1 имеет объектный тип. Это значит, что ее значением является не число или строка, а объект-экземпляр класса.

Таким образом, после выполнения первой строки кода функции создается новая переменная btn1, но новая кнопка еще не создана. Чтобы создать кнопку, мы используем оператор:

btn1 = gcnew Button();

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

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

btn1->Text = "Кнопка 1";

btn1->Width=90;

Чтобы кнопка появилась на форме, необходимо добавить ее в коллекцию элементов управления формы (Controls) с помощью метода Add (слово this в данной конструкции означает текущую форму):

this->Controls->Add(btn1);

В результате кнопка btn1 добавится к элементам управления формы.

Аналогично можно создать еще одну кнопку. Измените функцию обработки нажатия на кнопку Button1 следующим образом (строки, которые нужно добавить, выделены жирным):

Button^ btn1;

btn1 = gcnew Button();

btn1->Text = "Кнопка 1";

btn1->Width=90;

this->Controls->Add(btn1);

 

Button^ btn2 = gcnew Button();

btn2->Text = "Кнопка 2";

btn2->Width=90;

btn2->Top = 50;

this->Controls->Add(btn2);

 

Сохраните проект и запустите его. В результате выполнения процедуры создаются две новые кнопки.

Код для создания второй кнопки аналогичен коду для создания первой кнопки за исключением того, что строки

Button^ btn1;

btn1 = gcnew Button();

заменены на одну строку

Button^ btn2 = gcnew Button();

Это более короткий вариант записи операторов объявления и создания объекта-экземпляра класса.

У второй кнопки будет надпись Кнопка 2 и такая же ширина, как у первой кнопки – 90 пикселов.

По умолчанию все кнопки и другие видимые компоненты появляются на форме в ее левом верхнем углу. Чтобы вторая кнопка не загородила первую, мы сдвинем ее немного вниз. Для этого изменим значение свойства Top кнопки btn2 на 50:

btn2.Top = 50

И в самом конце добавим ее к коллекции объектов формы:

Me.Controls.Add(btn2)

Невидимый код

Теперь мы знаем два способа создания объектов из класса: «ручной» во время разработки приложения и «в коде» во время работы программы.

Разберем первый способ подробнее. Для этого рассмотрим пример.

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

Можно сделать вывод, что код присутствует, однако мы его не видим. Когда Вы при помощи панели Toоlbox размещаете на форме кнопку, VС++ автоматически для Вас добавляет в проект необходимый код. Более того, в проекте должен быть код, который создает на экране нашу форму Form1 и управляет ее работой. Попробуем найти этот код.

В окне Solution Explorer выберите файл Form1.h. и щелкните по кнопке View Code. В окно кода загрузится текст кода формы. Он будет примерно таким:

#pragma once

namespace My2 {

using namespace System;

using namespace System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

 

public ref class Form1: public System::Windows::Forms::Form

{

public:

Form1(void)

{

InitializeComponent();

}

protected:

~Form1()

{

if (components)

{

delete components;

}

}

private: System::Windows::Forms::Button^ button1;

protected:

private:

System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code

void InitializeComponent(void)

{

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

this->SuspendLayout();

//

// button1

//

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

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

this->button1->Size = System::Drawing::Size(75, 23);

this->button1->TabIndex = 0;

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

this->button1->UseVisualStyleBackColor = true;

//

// Form1

//

this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

this->AutoScaleMode = System::Windows::Forms:: AutoScaleMode::Font;

this->ClientSize = System::Drawing::Size(292, 266);

this->Controls->Add(this->button1);

this->Name = L"Form1";

this->Text = L"Form1";

this->ResumeLayout(false);

}

#pragma endregion

};

}

 

Вполне возможно, что большая часть этого кода будет Вам непонятна. Однако обратите внимание на функцию void InitializeComponent(void), а именно, на строки, выделенные жирным шрифтом в ней. Например, на строки:

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

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

this->button1->Size = System::Drawing::Size(75, 23);

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

В них производится создание и настройка кнопки button1 аналогично тому, как мы это делали некоторое время раньше при программном создании кнопки. Аналогично производится создание и настройка нашей формы. Таким образом, мы увидели код, создающий форму и элементы управления.

А где же код, управляющий их поведением? Например, тем, что края формы можно таскать мышкой, что кнопка при нажатии слегка меняет вид, что при нажатии на кнопку с крестикой в правом верхнем углу (кнопка закрытия окна) программа должна завершиться? Этот код нам не получится увидеть, так как он «запрятан» в классах Form и Button. Этот код входит в сборку библиотеки классов.NET Framework. Файлы сборки обычно имеют расширение.dll или.exe.

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

Мы в принципе показали, что при создании проекта можно написать правильный код в окне кода и запустив проект, увидеть правильно работающую форму со всеми нужными элементами управления. (Именно таким образом обычно пишутся программы на языке С++). Однако такой код писать довольно долго и, главное, трудно, особенно начинающим программистам. Для облегчения этой работы и придумано визуальное программирование – мы манипулируем с окном свойств, окном Tollbox и другими окнами, а VС++ сам пишет за нас весь необходимый код.

В режиме проектирования VС++ создает для нас иллюзию существования на экране формы и элементов управления на ней. Но необходимо помнить, что это только видимость – никакой формы и элементов управления в режиме проектирования, конечно, не существует, это лишь их удобные видимые образы. И любая манипуляцию с элементами управления в режиме проектирования нисколько не меняет сами элементы управления (которых и нет), а меняет лишь невидимый код и видимый образ. Поэтому настоящая форма и настоящие элементы управления начинают жить реальной жизнью только лишь после запуска программы, во время ее работы.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: