Scribble, третя спроба C + + Builder

Третя версія програми Scribble дозволить скомбінувати малювання ліній і копіювання растрових малюнків Результати цього експерименту можна побачити на рис 25, на якому показана форма Scribble3 після того, як на неї було додано декілька растрових малюнків і намальована складна фігура з ліній Повний вихідний текст програми Scribble3 можна знайти на супровідному компакт-диску в каталозі Chapter1 \ Scribble3

Рис 25 Форма Scribble з намальованими лініями і растровими малюнками

Для того щоб втілити цей шедевр в життя, ми повинні внести декілька змін в інтерфейс програми По-перше, додати меню, щоб використовувати команди меню для зміни того, що повинно відбуватися, коли користувач клацає мишею на полі форми Отже, покладіть на форму компонент головне меню (main menu) і надайте йому заголовок (Caption) Малювання Додайте два елементи в нове головне меню Першу команду меню озаглавьте Лінії Вибір цієї команди дозволяє малювати лінії в поле форми Другу команду меню озаглавьте Малюнки Для цієї команди ми і збираємося здійснити нові можливості

Наступне, що вам треба зробити, – це змінити назву обробника з OnMouseDown на OnMouseDownLines для того, щоб текст програми був більш удобочитаем Це буде все той же старий обробник, який ми використовували весь час, а зміна імені тільки підкреслить, що цей обробник буде використовуватися для малювання ліній у поле форми У більшості середовищ розробки зміна імені обробника подій зажадає від вас або ручного редагування вихідного коду і перевірки, усюди чи і в належних Чи місцях зроблені зміни, або видалення існуючого обробника з наступним додаванням нового обробника з новим імям Чи неправда здорово, що ви працюєте в середовищі CBuilder, а не в якийсь інший

Для зміни імені існуючого обробника просто перейдіть на сторінку Events (події) в Object Inspector і знайдіть імя, яке хочете змінити Наберіть нове імя для методу обробника подій і натисніть Enter Код у вихідному файлі буде автоматично оновлено для відображення зробленого зміни

Тепер ми додамо власний (новий) обробник, не використовуючи для цього ніяких інструментів Таким чином, ви дізнаєтеся, як виконати завдання, а заодно і переконайтеся, що CBuilder дійсно інструмент, дозволяє все робити двома методами На зміни, які ви внесете в рядки коду, що не згенеровані безпосередньо CBuilder, сама система не вплине Давайте в цьому переконаємося

У секцію, позначену private: // User declarations (Приватних оголошень користувача), заголовки для нашої форми (Unit1h) додайте наступний опис:

void __fastcall OnMouseDownBitmap(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

Це буде наш обробник для відображення растрових малюнків Раз вже ви знаходитесь в заголовному файлі, зробіть відразу і ще одна необхідна зміна Справа в тому, що для того, щоб мати можливість відобразити растровий малюнок у поле нашої форми, нам треба мати обєкт – растровий малюнок, з яким би ми могли працювати Додайте наступний рядок в ту ж саму секцію приватних оголошень користувача:

Graphics::Tbitmap  *FpBitmap

Після того як ви з цим справитеся, виправлена ​​секція приватних оголошень користувача заголовного файлу буде виглядати, як показано в наведеному нижче лістингу Всі змінені рядки показані підсвічуванням:

private: // User declarations BOOL FbMouseDown

int FnPoint

int FPointsX[MaxPoints+1] int FPointsY[MaxPoints+1] Graphics::Tbitmap  *FpBitmap

void __fastcall OnMouseDownBitmap(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

Наступний крок – змінити конструктор форми таким чином, щоб стало можливим завантажити новий растровий малюнок У даному випадку ми збираємося використовувати стандартний растровий малюнок Windows, званий Triangles (трикутники), який ви зможете знайти в системному каталозі Windows Ось як виглядатиме оновлений код:

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

FbMouseDown = FALSE FnPoint = 0

FpBitmap = new Graphics::TBitmap

FpBitmap-&gtLoadFromFile(&quotC:\\Windows\\TrianglesBMP&quot)

}

Як і у випадку з більшістю обєктів CBuilder, процес створення растрового малюнка для зображення складається з двох послідовних кроків На першому кроці під обєкт – растровий малюнок – виділяється память, а він сам створюється, і все це за допомогою використання оператора C + + new Зверніть увагу на те, що оскільки TBitmap не є складовою частиною візуального елемента і сам по собі таким не є, він не вимагає вказівки батька при виклику конструктора Більшість обєктів CBuilder – це насправді вікна, і вони вимагають вказівки window (вікна) як батька Але не в нашому випадку Наступним кроком після того, як обєкт був створений і инициализирован допомогою оператора new, буде завантаження растрового малюнка в память Це виконується за допомогою методу LoadFromFile класу TBitmap Цей метод знаходить файл растрового малюнка в зазначеному каталозі і завантажує біти растрового малюнка в обєкт, так що після цього вони готові до використання

Тепер, коли растровий малюнок завантажений, прийшов час написати код, який буде відображати його після того, як користувач клацне кнопкою миші в полі нашої форми Ось як виглядає реалізація методу OnMouseDownBitmap, Яку вам слід ввести в вихідний файл (Unit1cpp):

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

TShiftState Shift, int X, int Y)

{

Canvas-&gtDraw(X,Y,FpBitmap)

}

Як ви бачите, для зображення растрового малюнка не так вже й багато треба ВластивістьCanvas форми (а також усіх інших обєктів, у яких воно є) вже знає, як відображати растровий малюнок Все, що вам треба зробити, – це передати покажчик на обєкт «растровий малюнок» і визначити позицію, в якій треба зобразити його Це дійсно дуже просто

Отже, тепер у нас є закінчена форма, яка вміє малювати лінії і растрові малюнки Єдина проблема полягає в тому, що якщо ви тепер откомпіліруете і запустіть додаток, то побачите, що куди і чим би ви не клацали, форма і раніше буде малювати тільки лінії Щось ми явно випустили з уваги

У нашому маленькому сценарії не передбачена можливість для форми викликати інший обробник події, але ми можемо додати обробник для команди меню Малюнки, відкривши вікно дизайнера меню і двічі клацнувши мишею на потрібній нам команді Новий метод з назвою Bitmaps1Click буде додано у вашу форму Додайте в нього рядок коду, яка показана в наступному лістингу підсвічуванням:

void __fastcall TForm1::Bitmaps1Click(TObject *Sender)

{

OnMouseDown = OnMouseDownBitmap

}

Повторіть весь процес для команди меню Лінії і додайте в його обробник наступний рядок, також показану підсвічуванням:

void __fastcall TForm1::Lines11Click(TObject *Sender)

{

OnMouseDown = OnMouseDownLines

}

Скомпілюйте і запустіть додаток, і ви побачите, що вибір команди меню Малюнки дозволяє вам малювати маленькі трикутнички по всьому полю форми Вибір же команди Лінії поверне форму до вихідного поведінки, тобто малювання лінії в поле форми при переміщенні по ній миші з натиснутою лівою кнопкою Те, що ви зараз здійснили за допомогою кількох рядків коду – написання динамічних обробників подій, між якими можна перемикатися під час виконання програми, – надзвичайно складно або взагалі неможливо в Visual C + + або Borland C + +

Вашій програмі не вистачає до остаточної готовності однієї невеликої штучки – деструктора класу, який треба додати в заголовний файл, як показано в наступному лістингу:

public: // User declarations

__fastcall TForm1(TComponent* Owner)

__fastcall ~TForm1(void)

У текст вихідного файлу Unit1cpp додайте наступні рядки:

__fastcall  TForm1::~TForm1(void)

{

delete FpBitmap

}

Після того як ви створили небудь за допомогою оператора new, важливо не забути видалити це що-небудь з памяті Єдиним винятком з цього правила є дочірня форма MDI (Multiple Document Interface, многодоку ментний інтерфейс), створювана як спадкоємець батьківської форми MDI ці обєкти видаляються системою після того, як програма буде вивантажено з памяті по завершенні роботи У всіх інших випадках ви повинні знищувати все, що створили, використовуючи оператор new, звільняючи відведену память за допомогою оператора delete (знищити)

Джерело: Теллес М – 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>

*

*