Смекни!
smekni.com

Построение компоненты в Builder C++ (стр. 1 из 2)

Содержание

Задание на курсовую работу

Введение

1 Разработка компоненты

2 Задание начальных условий

3 Задание свойств

4 Переопределённые методы базового класса

5 Переопределение метода CreateWnd()

6 Переопределение метода Paint()

7 Переопределение метода WndProc(TMessage& Message)

8 Переопределениеметода CanResize(int &NewWidth, int &NewHeight)

9 Создание событий

10 Тестирование компоненты

11 Регистрация компоненты

12 Инсталляция компоненты

13 Проверка готовой компоненты

Список используемой литературы

Задание на курсовую работу

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

Введение

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

Формы являются основой приложений C++ Builder. Создание пользовательского интерфейса приложения заключается в добавлении в окно формы элементов объектов C++ Builder, называемых компонентами. Компоненты C++ Builder располагаются на палитре компонентов, выполненной в виде многостраничного блокнота. Важная особенность C++ Builder состоит в том, что он позволяет создавать собственные компоненты и настраивать палитру компонентов, а также создавать различные версии палитры компонентов для разных проектов.

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

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

Каждый компонент C++ Builder имеет три разновидности характеристик: свойства, события и методы.

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

1 Разработка компоненты

Процесс разработки компоненты TOsnova проходит через выполнение следующих этапов:

1. Создание модуля для новой компоненты.

2. Наследование производного класса от существующего базового компонентного класса.

3. Добавление нужных свойств, событий и методов.

4. Регистрация компоненты в C++Builder.

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

Мне видится, что наиболее правильным решением будет выбор в качестве базового класс TCustomControl. TCustomControl был выбран потому, что для полноценной работы нашей компоненте необходимы свойства Handle (дескриптор окна для получения сообщений таймера) и Canvas (холст для вывода текста). TCustomControl имеет оба свойства, за счет чего он, по сути, является идеальным выбором базового класса.

Также нам понадобится создать класс TMarshrut для рисования маршрута движения шарика и класс ТShar, рисующий сам шарик. Оба этих класса должны лишь уметь рисовать себя, поэтому в качестве базового класса выбираем TCustomGraphic.

Теперь можно приступать к созданию компоненты. Открываем вкладку Component и выбираем NewComponent. В появившемся окне выбираем базовый класс (Ancestortype) - TCustomControl, вводим имя своего класса (ClassName) -TOsnova, выбираем вкладку палитры компонентов, на которую компонента будет установлена (Palettepage) -Samples, и путь, где будут хранится файлы компоненты. После щелчка на кнопке ОК C++ Builder создаст для нашей компоненты новый модуль и сохранит его в указанном месте.

Аналогичным образом создаём два класса TMarshrut и ТShar. Для совместной работы трёх классов необходимо подключить h-файлы с помощью директивы #include.

Теперь рассмотрим созданные нами классы. TMarshrut и ТShar должны уметь рисовать себя, поэтому в них достаточно переопределить виртуальный метод базового класса Paint():

virtualvoid __fastcallPaint();

Переопределенный метод Paint() этих классов должен включать в себя код их рисования. Ниже показан исходный код метода Paint() класса ТShar:

void __fastcall TShar::Paint()

{

Canvas->Brush->Color=clGreen;

Shar->Width=(D-d)/2;

Shar->Height=(D-d)/2;

Canvas->Ellipse(0,0,Shar->Width,Shar->Height);

}

Исходный код метода Paint() класса TMarshrut

//---------------------------------------------------------------------------

// рисуем две окружности заданного цвета

void __fastcallTMarshrut::Paint()

{

Canvas->Brush->Color=clRed;

Marshrut->Ris_Marshrut(D/2);

Canvas->Brush->Color=clBtnFace;

Marshrut->Ris_Marshrut(d/2);

}

//---------------------------------------------------------------------------

Реализация функции Ris_Marshrut(intR) (прототип находится в секции protected класса ТMarshrut):

//---------------------------------------------------------------------------

//рисуем окружность заданного радиуса

void __fastcall TMarshrut::Ris_Marshrut(int R)

{

Marshrut->Canvas->Ellipse(Marshrut->Width/2-R,Marshrut->Height/2-R,

Marshrut->Width/2+R,Marshrut->Height/2+R);

}

//---------------------------------------------------------------------------

Так как никаких действий (перемещение, изменение размеров и т.д.) не планируется, маршрут движения рисуется методом Paint() при помощи функции Ris_Marshrut (intR). В противном случае лучше создать два экземпляра класса

ТMarshrut.

2 Задание начальных условий

Начальные значения задаются в конструкторе класса TOsnova.

__fastcall TOsnova::TOsnova(TComponent* Owner)

: TCustomControl(Owner)

{

Width=200;//начальнаяширина

Height=200;//начальнаявысота

D=this->Width/5*4;//диаметр большой окружности

d=this->Width/5*3; //диаметр маленькой окружности

a=0;//угол поворота

N=true;//для однократного захода в цикл

FSkorosty=20;//скорость вращения

}

Начальные значения для экземпляров классов TMarshrut и ТShar задаются при их создании в функции void __fastcallCreateWnd().

3 Задание свойств

В процессе работы желательно иметь возможность изменять скорость вращения шарика, поэтому добавим свойство FSkorosty. Тип этого свойства int. Изменение местоположения шарика будет происходить по сигналу таймера, поэтому, увеличивая или уменьшая значение интервала, можно менять скорость. Член данных FSkorosty размещён в секции private. Теперь надо объявить свойство - метод чтения и записи (в секции __published)

__property int Skorosty = { read=FSkorosty, write=SetSkorosty },

после чего это свойство отобразится в окне Инспектора Объектов.

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

//---------------------------------------------------------------------------

void __fastcall TOsnova::SetSkorosty(int Skorosty)

{

FSkorosty=Skorosty;

if (FSkorosty<5) FSkorosty=5; // если FSkorosty=0, шарикостановится

SetTimer(Handle, 1, FSkorosty, 0);

}

//---------------------------------------------------------------------------

4 Переопределённыеметодыбазовогокласса

Переопределённые методы базового класса объявлены в секции protected.

5 Переопределение метода CreateWnd().

При работе компоненты необходимо динамически создать экземпляры классов TMarshrut и ТShar. Хотелось бы сделать это непосредственно в конструкторе класса TOsnova, но попытка запуска окончится генерированием исключения времени выполнения:

Control has no parent window (Управляющий элемент не имеет родительского окна). Решение состоит в переопределении метода CreateWnd().

//---------------------------------------------------------------------------

void __fastcallTOsnova::CreateWnd()

{

if (ComponentState.Contains(csDestroying))

return; //если компонента разрушается - выход

TCustomControl::CreateWnd(); //базовый метод

Marshrut=new TMarshrut(this); //создаёмэкземпляркласса

Marshrut->Parent=this;

Marshrut->Width=this->Width;

Marshrut->Height=this->Height;

Shar=new TShar(this); //создаёмэкземпляркласса

Shar->Parent=this;

Shar->Width=(D-d)/2;

Shar->Height=(D-d)/2;

Shar->Left=(this->Width-D)/2+D-Shar->Width;

Shar->Top=this->Height/2-Shar->Height/2;

if (ComponentState.Contains(csDesigning))

return; //есликомпонентаразрабатывается - выход

else; //иначезапускаемтаймер

SetTimer(Handle, 1, FSkorosty, 0);

}

//---------------------------------------------------------------------------

Сначала вызывается функция CreateWnd() базового класса, которая вернёт дескриптор окна. После этого мы можем создать экземпляры наших классов, а также функцией SetTimer() создать таймер.

6 Переопределениеметода Paint()

//---------------------------------------------------------------------------

void __fastcall TOsnova::Paint()

{

this->Canvas->Brush->Color=clSkyBlue;

this->Canvas->Font->Size=this->Height/20;

this->Canvas->TextOutA(this->Width/4,3,"Моя компонента");

}

//---------------------------------------------------------------------------

С помощью метода Paint() выведем текст на компоненту.

7 Переопределение метода WndProc(TMessage& Message)

Каждый компонент, имеющий свой собственный дескриптор окна, имеет и виртуальный метод по имени WndProc(). Этот метод вызывается каждый раз, когда Windows или VCL посылает сообщение окну компонента.

Прежде чем начать описание применения метода WndProc(), сосредоточимся на использовании таймера в компоненте. Таймер запускается в методе CreateWnd():

SetTimer (Handle, 1, FSkorosty, 0).В эту функцию в качестве параметров передаются дескриптор окна компонента, 1 - как идентификатор таймера, FSkorosty - как интервал таймера) и 0 в качестве значения последнего параметра, который используется только в случае, если вы применяете функцию обратного вызова таймера. В этом примере сообщается, что Windows следует посылать сообщение WM_TIMER моей оконной процедуре окна.