Копіюємо проект C + + Builder

Зазвичай ви вибираєте один з двох можливих шляхів для створення нового проекту Або ви створюєте новий проект з нуля і поступово додаєте в нього код, необхідний для виконання вашого завдання, або ви берете існуючий проект і переробляєте його в новий Репозиторій обєктів може бути використаний для зберігання проектів, які вам треба буде використовувати ще або переробляти в нові проекти Звичайні проекти тим не менше ви швидше за все будете просто відкривати і використовувати команду меню 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 (Unit1h) Для зручності сприйняття зміни показані підсвічуванням рядка

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

#ifndef Unit1H

#define Unit1H

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

#include &ltvcl\Classeshpp&gt

#include &ltvcl\Controlshpp&gt

#include &ltvcl\StdCtrlshpp&gt

#include &ltvcl\Formshpp&gt

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

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-&gtMoveTo(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-&gtLineTo(X,Y)

if ( FnPoint &lt MaxPoints )

{

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

}

}

}

І тут ніякого чаклунства Просто по мірі надходження зберігаємо всі крапки в масивах

Нарешті, давайте додамо новий обробник для методу OnPaint, Який би відображав точки у відповідь на повідомлення про малювання Ось код для методу OnPaint:

void __fastcall TForm1::OnPaint(Tobject *Sender)

{

if ( FnPoiont &gt 0 )

{

Canvas-&gtMoveTo(FPointX[0],FPointY[0]) for ( int i=1 i&ltFnPoint ++i )

Canvas-&gtLineTo(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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*