Главная » C++, C++ Builder » Копируем проект C++ Builder

0

Обычно вы выбираете один из двух возможных путей для создания нового проекта. Либо вы создаете новый проект с нуля и постепенно добавляете в него код, необходимый для выполнения вашей задачи, либо вы берете существующий проект и переделываете его в новый. Репозиторий объектов может быть использован для хранения проектов, которые вам надо будет использовать еще или переделывать в новые проекты. Обычные проекты тем не менее вы скорее всего будете просто открывать и использовать команду меню File д Save Project As для создания нового проекта в новом каталоге.

Внимание! Не делайте этого. Создайте копию проекта в новом каталоге, несмотря на  то  что команда сохранения вроде бы делает то, что вам надо. На самом  деле  нет.  Вместо  этого  она создает новый проект в новом каталоге, но при этом связывает его  с  исходными  файлами  в старом каталоге . Это значит, что вы, сами того не желая, будете модифицировать исходный проект. Будьте очень вниматель ны, сохраняя проект с новым именем. Лучшим способом, пожалуй, будет копировать целиком все содержимое проекта в новый каталог и потом открывать проект в этом новом каталоге. После того как вы открыли проект, используйте команду File д Save Project As для того, чтобы переименовать проект в новом каталоге. После того как вы это проделали, можете удалить старый файл проекта.

В качестве примера давайте скопируем проект Scribble в новый каталог. Предположим, что ваш существующий проект Scribble находится в каталоге d:\work\Scribble. Скопируйте файлы проекта, содержащиеся в каталоге d:\work\Scribble, в каталог d:\work\Scribble2. В CBuilder откройте проект Scribble из каталога d:\work\Scribble2 и воспользуйтесь командой File д Save Project As, чтобы сохранить новый проект как Scribble2. Удалите все файлы Scribble.* в каталоге d:\work\Scribble2 и живите счастливо.

После того как вы скопировали проект в новый каталог (или, если вам так больше нравится, изменяйте  существующий  проект  Scribble  —  ведь  вы  всегда  сможете  загрузить  его  снова  с

компакт-диска), откройте его  в  CBuilder  IDE  (Integrated  Development  Environment, интегрированная среда разработки). Настало время  разобраться, какие изменения должны быть внесены в проект, чтобы отображение наших шедевров было возможно все время существования формы.

Очевидно, что для того, чтобы рисовать форму в ответ на сообщение WM_PAINT, в инспекторе объектов нам потребуется добавить обработчик для события OnPaint. Объект VCL TForm будет вызывать наш обработчик всегда, когда бы ни потребова лось обновить изображение формы. К счастью, мы не должны заботиться о том, какие части формы должны быть обновлены — CBuilder сделает это за нас, причем сделает очень хорошо. Все, о чем мы должны позаботиться, — это как продублиро вать изображение фигуры, которую нарисовал пользователь.

Первое, что мы должны делать, — это сохранять информацию по мере поступления. Для этого мы собираемся завести два массива, в которых будем хранить значения по X и по Y для каждой точки, через которую проходит мышь при создании фигуры. Есть методы, лучшие, чем хранить значения в статических массивах, но их мы рассмотрим несколько дальше при разговоре о библиотеке стандартных шаблонов (Standard Template Library). Тогда же мы разберемся и с некоторыми другими проблемами, возникающими при работе нашей программы, а до тех пор с улучшениями придется подождать.

Для  начала  добавьте  следующие  объявления  в  заголовочный  файл  для  Unit1  (Unit1.h).  Для удобства восприятия изменения показаны подсветкой строки.

//——————————————————————-

#ifndef Unit1H

#define Unit1H

//——————————————————————-

#include <vcl\Classes.hpp>

#include <vcl\Controls.hpp>

#include <vcl\StdCtrls.hpp>

#include <vcl\Forms.hpp>

//——————————————————————-

const int MaxPoints = 100; class TForm1 : public TForm

{

__published: // IDE-managed Components

void __fastcall OnMouseDown(TObject *Sender, TMouseButton Button,

TShiftStste Shift, int X, int Y);

void __fastcall OnMouseMove(TObject *Sender, TShiftStste Shift, int X, int Y);

void __fastcall OnMouseUp(TObject *Sender,

TMouseButton Button, TShiftStste Shift, int X, int Y); private: // User declarations BOOL FbMouseDown;

int FnPoint;

int FPointX[MaxPoints+1]; int FPointY[MaxPoints+1]; public: // User declarations

__fastcall TForm1(TComponent *Owner);

}

//——————————————————————-

extern TForm1 *Form1;

//——————————————————————-

#endif

Совет

Оцените удобство описания константы MaxPoints (максимальное  количество  точек)  в заголовочном файле. Вообще определение важных значений как констант  вместо  прямого вставления значений в код является хорошей практикой. Язык  C++  предоставляет  декларацию const для использования в коде констант вместо действительных значений. Таким образом, если мы когда-либо решим, что для описания системы нам требуется больше 100 точек, потребуется совершить изменение в единственном месте. В противном случае существует большая вероятность того, что хотя бы в одном месте старое значение останется не измененным, потенциально создавая проблемы или даже приводя к сбоям программы в дальнейшем.

После того как мы определили место для хранения значений X и Y координат точки, давайте сделаем следующий шаг — сохраним в нем что-нибудь. Возьмемся пока за это, а потом займемся процессом рисования. Измените метод OnMouseDown следующим образом:

void __fastcall TForm1::OnMouseDown(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

FbMouseDown = TRUE; canvas->MoveTo(X,Y); FnPoint = 0; FnPointX[FnPoint] = X; FnPointY[FnPoint] = Y;

}

Здесь, конечно, подсвечены те строки, которые вам следует ввести. Все, что мы делаем, — это в первом элементе соответствующих массивов сохраняем значения по X и по Y для точки, в которой кнопка мыши была нажата. Естественно, теперь соответствующим образом модифицируем метод OnMouseMove:

void __fastcall TForm1::OnMouseMove(TObject *Sender, TShiftState Shift,int X,int Y)

{

if(FbMouseDown))

{

Canvas->LineTo(X,Y);

if ( FnPoint < MaxPoints )

{

FnPoint++; FPointX[FnPoint] = X; FPointY[FnPoint] = Y;

}

}

}

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

Наконец, давайте добавим новый обработчик для метода OnPaint, который бы отображал точки в ответ на сообщение о рисовании. Вот код для метода OnPaint:

void __fastcall TForm1::OnPaint(Tobject *Sender)

{

if ( FnPoiont > 0 )

{

Canvas->MoveTo(FPointX[0],FPointY[0]); for ( int i=1; i<FnPoint; ++i )

Canvas->LineTo(FPointX[i],FPointY[i]);

}

}

Последнее,  что  нам  надо  сделать,  —  это  задать  начальное  количество  точек,  равное  0,  в конструкторе формы. Вот последнее изменение, которое надо сделать:

__fastcall TForm1::TForm1(TComponent* Owner)

:TForm(Owner)

{

FbMouseDown = FALSE; FnPoint = 0;

}

Ну  вот  и  все.  Вы  в  считанных  строках  кода  успешно  продублировали  внутренний  пример

Microsoft Visual C++ / MFC (Microsoft Foundation Classes).

К высоким материям

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

Одной из наиболее мощных отличительных черт является возможность динамически изменять или удалять обработчики событий. Если вы привыкли работать с MFC или OWL, эта возможность станет неслыханным отличием от всего, что вам приходилось делать раньше.

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

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии