- •Основы визуального программирования
- •Учебное пособие
- •Основы визуального программирования
- •1. Создать новый проект Windows Forms 91
- •Введение
- •Интегрированная среда разработки Microsoft Visual Studio
- •1.1 Многофайловая организация программ
- •1.2 Структура проекта в среде Visual Studio
- •1.4 Отладка программы
- •1.3 Создание консольного приложения в Visual Studio
- •Объектно-ориентированное программирование
- •Наследование;
- •Описание класса
- •Описание объектов
- •Методы класса
- •Наследование
- •Иерархия классов
- •Виртуальные методы. Полиморфизм.
- •Контейнерные классы
- •Принципы разработки Windows – приложений
- •Создание простейшего Windows-приложения
- •3.2 Диалоговые окна
- •3.3 Элементы управления и их свойства
- •Элемент управления Button
- •Элемент управления TextBox
- •Элементы управления MaskedTextBox и ToolTip
- •Элемент управления Label
- •Элемент управления ListBox
- •3.3.5. Элемент управления ComboBox
- •Элемент управления RadioButton
- •Элемент управления CheckBox
- •Элемент управления RichTextBox
- •Чтобы загрузить файл в элемент управления RichTextBox в процедуре обработки события для кнопки Button1:
- •Элемент управления NumericUpDown
- •Элемент управления Timer
- •Щелчок мыши и его обработка
- •3.5 Создание меню приложений
- •3.5.1 Создание главного меню
- •3.5.2 Создание контекстного меню
- •Рисование на форме
- •3.7 Создание многооконных приложений
- •Чтобы добавить новую форму Windows Forms выполните следующие действия:
- •Лабораторный практикум по визуальному программированию лабораторная работа 1 Создание простейшего Windows-приложения
- •Создать новый проект Windows Forms
- •Разместить на форме элементы управления
- •Настроить свойства элементов управления.
- •Создать обработчик событий для кнопки.
- •Выполните компиляцию программы.
- •Запуск программы на выполнение.
- •Добавление на форму элементов управления.
- •Создать новый проект Windows Forms и назвать его, например, Form_Second.
- •Разместить на форме элементы управления
- •Создать обработчик событий для кнопки
- •Лабораторная работа 2 создание приложения Windows Forms для вызова рекурсивных функций
- •Создать новый проект Windows Forms
- •Разместить на форме элементы управления
- •Настроить свойства элементов управления.
- •Создать обработчик событий для кнопки.
- •Запустить программу на выполнение.
- •Лабораторная работа 3 Создание Windows-приложения для обработки массива
- •Создать новый проект Windows Forms и назвать его, например, Form_lab2.
- •Разместить на форме элементы управления
- •Создать обработчик событий для кнопки
- •Лабораторная работа 4 Создание меню в Windows-приложение
- •Создать новый проект Windows Forms с именем form_lab3.Cpp.
- •Разместить на форме элементы управления и настроить их свойства
- •Создать обработчики событий для остальных пунктов меню
- •Заключение
- •Список литературы
Методы класса
При вызове методов необходимо связать метод с объектом этого класса [2]. Поэтому имена объектов ( p ) связаны с именем функции (метода) операцией точка (.):
p.InitPoint(10,10);
p.relmove(5,10);
Замечание: Это напоминает доступ к полям структуры.
Вызов методов InitPoint() и relmove() приводило к изменению значений полей x и y. В следующем примере задание значений полей в методе Vvod() будет осуществляться с клавиатуры:
class TPoint
{ private:
int x,y;
public:
void InitPoint ( int newx, int newy)
{
x = newx;
y = newy ;
}
void Vvod()
{
std::cout<<"Vvedi X Y:";
std::cin>> x >> y;
}
. . .
};
Вставим вызов этого метода в главную программу:
int main()
{
TPoint p;// описание объекта
p.Vvod();
std::cout<<"x="<< p.getx()<<",\ty="<< p.gety()<<"\n";
return 0;
}
Результаты работы программы приведены на рисунке 2.2.
Рисунок 2.2. – Результат использования метода Vvod()
Конструкторы
B отличии от предыдущего примера удобнее инициализировать поля объекта автоматически в момент его создания, а не явно, вызовом соответствующего метода. Такой способ реализуется с помощью особого метода класса, называемого конструктором.
Конструктор - это метод, выполняющийся автоматически в момент создания объекта.
Конструктор отличается от других методов:
Имя конструктора совпадает с именем класса;
У конструктора не существует возвращаемого значения.
Заменим метод InitPoint() на конструктор:
class TPoint
{ private:
int x,y;
public:
TPoint(int newx, int newy) // конструктор
{
x=newx;
y=newy;
}
void relmove ( int dx, int dy )
{x+= dx; y += dy ; }
int getx ( void )
{ return x ; }
int gety ( void )
{ return y ; }
};
int main(int argc, char *argv[])
{
TPoint p(10,10); //инициализация объекта р
std::cout<<"x="<< p.getx()<<",\ty="<< p.gety()<<"\n";
. . .
}
В качестве второго примера создадим класс Counter, объекты которого могут хранить количественную меру какой-либо изменяющейся величины.
При наступлении некоторого события счетчик увеличивается на единицу. Обращение к счетчику происходит, как правило, для того, чтобы узнать текущее значение той величины, для изменения которой он предназначен.
#include "stdafx.h"
#include "iostream"
class Counter
{ private:
int count;
public:
Counter ( ):count(0){ } //конструктор
void inc_count ( )//метод увеличения счетчика на 1
{count++; }
int get_count( )//метод возвращает значение счетчика
{ return count; }
};
int _tmain(int argc, _TCHAR* argv[])
{ Counter c1, c2;//создание объектов c1 и c2
std::cout<<c1.get_count()<<std::endl;
std::cout<<c2.get_count()<<std::endl;
c1.inc_count(); c1.inc_count(); //увеличение с1 на 2
c2.inc_count(); //увеличение с2 на 1
std::cout<<c1.get_count()<<std::endl;
std::cout<<c2.get_count()<<std::endl;
return 0;}
Результаты программы приведены на рисунке 2.3.
Рисунок 2.3. – Результаты работы программы
Одной из наиболее часто возлагаемых на конструктор задач является инициализация полей объекта. Инициализация полей обычно реализуется с помощью списка инициализации, который располагается между заголовком и телом функции-конструктора. После заголовка ставится двоеточие. Инициализирующие значения помещены в круглые скобки после имени поля.
Counter ( ):count(0)
{/* тело функции*/ }
Если инициализируются несколько полей, то значения разделяются запятыми.
Деструкторы
Кроме специального метода конструктор, который вызывается при создании объекта, существует другой особый метод, автоматически вызываемый при уничтожении объекта, называемый деструктором [2].
Деструктор имеет имя, совпадающее с именем конструктора, перед которым стоит тильда ~.
class Prim
{ private: int dat;
public:
Prim(): dat(0)
{ }
~Prim()
{ }
};
Наиболее распространённое применение деструкторов – освобождение памяти, выделенной конструктором при создании объекта.
Определение методов может быть реализовано как внутри самого класса, так и вне класса. Во втором случае внутри класса содержится лишь прототип функции, а сама функция определяется позже. Тогда перед именем функции указывается имя класса и символ ::
Вернемся к примеру класса TPoint. Рассмотрим в этом примере реализацию метода relmove()вне класса и добавим деструктор для класса TPoint.
class TPoint
{ private:
int x,y;
public:
TPoint(int newx, int newy)
{x=newx;y=newy; }
void relmove ( int dx, int dy );
int getx ( void )
{ return x ; }
int gety ( void )
{ return y ; }
~Tpoint( ){ }
};
void TPoint::relmove(int dx, int dy)
{x+= dx; y += dy ; }
ЗАМЕЧАНИЯ:
1)Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации.
2)Конструктор, вызываемый без параметров, называется конструктором по умолчанию.
3)Деструктор вызывается автоматически, когда объект выходит из области видимости:
• для локальных объектов — при выходе из блока, в котором они объявлены;
• для глобальных — как часть процедуры выхода из main( );
• для объектов, заданных через указатели деструктор вызывается неявно при использовании операции delete.
Деструктор:
• не имеет аргументов и возвращаемого значения;
• не может быть объявлен, как const или static;
• не наследуется;
• может быть виртуальным.
Вернемся ко второму примеру, где был создан класс Counter. При решении разных задач может возникнуть необходимость инициализации счетчика разными значениями, а не только нулем. Для этого создадим еще один конструктор:
class Counter
{ private:
int count;
public:
Counter ( ):count(0)//конструктор, инициализирующий нулем
{ }
Counter (int c): count(c)//конструктор задает любое нач. значение
{ }
void inc_count ( )
{count++; }
int get_count( )
{ return count; }
~Counter( ){} //деструктор
};
int _tmain(int argc, _TCHAR* argv[])
{
Counter c1, c2(3);
std::cout<<c1.get_count()<<std::endl;
std::cout<<c2.get_count()<<std::endl;
c1.inc_count();
c2.inc_count();
std::cout<<c1.get_count()<<std::endl;
std::cout<<c2.get_count()<<std::endl;
return 0;
}
Результат работы программы приведен на рисунке 2.4.
Рисунок 2.4. – Результат работы программы
с разными начальными значениями счетчиков
