Scribble: розробка C + + Builder

Призначення Scribble вкрай просто Коли користувач натискає кнопку миші, програма починає малювання У міру того як миша пересувається по екрану, програма зєднує точки, через які пройшла миша, утворюючи лінії Цей процес дозволяє користувачеві «малювати» прості (а може, і не прості) фігури на екрані На рис 24 показаний результат роботи програми Scribble – усміхнена пика

Рис 24 Вікно програми Scribble з усміхненою пикою

Ви знайдете вихідний текст програми Scribble в каталозі Chapter1 \ Scribble1 доданого до книги компакт-диска

У передмові до книги я говорив, що було б дуже корисним наявність досвіду програмування під Windows для роботи з наведеними у книзі прикладами, і зараз якраз той самий випадок, коли такий досвід міг би допомогти краще розібратися в системі повідомлень (messages) Windows Процеси, що відбуваються в даному випадку, досить прості Коли користувач натискає на кнопку миші і починає рухати миша, ми малюємо лінії, що зєднують точки Що куди менше зрозуміло новачкам, так це те, як ми це робимо Якщо ви досвідчений програміст під Windows, то ви напевно визначте, що при натисканні на ліву кнопку миші користувачем Windows згенерує повідомлення WM_LBUTTONDOWN, адресований нашому вікна Коли користувач переміщує миша, Windows генерує повідомлення WM_MOUSEMOVE Нарешті, коли користувач відпускає ліву кнопку миші, Windows генерує повідомлення WM_LBUTTONUP Питання в наступному: як тепер ця інформація обробляється середовищем CBuilder

CBuilder працює за системою, яка називається системою обробки подій Кожне повідомлення Windows, яке надходить обєкту з середовища CBuilder, перетвориться в подія, яка може бути оброблено цим обєктом У разі наведених вище повідомлень, обєкти форми CBuilder викликають три обробника подій – OnMouseDown, OnMouseMove і OnMouseUp

Якщо ви програміст, що працював на Visual C + + або Borland C + +, то поняття обробника подій може здатися вам трохи дивним Обидві ці середовища використовують одну і ту ж концепцію, але підходять до її здійснення з різних сторін І в Visual C + +, і в Borland С + + карта повідомлень визначає повідомлення і метод класу, використовуваний для обробки цього повідомлення У CBuilder (і, звичайно ж, в Delphi) вміст обєктів саме визначає, які повідомлення обробляються, і викликає обробники подій, певні програмістом Різниця полягає в тому, що обробники подій CBuilder, як ми побачимо трохи пізніше, динамічні, в той час як обробники повідомлень Visual C + + і Borland C + + визначаються під час компіляції В обох випадках для виконання використовуються методи обєктів, але CBuilder застосовує метод трохи простіший і набагато більш потужний

Тепер давайте злегка напружимося і додамо до нашої формі кілька обробників, щоб додаток Scribble нарешті запрацювало як повинно Спочатку додамо обробник для події OnMouseDown Оскільки це наш перший приклад, я проведу вас через весь процес його створення на випадок, якщо ви не памятаєте, як це робиться Надалі я буду розраховувати на те, що ви знаєте що і як робити, і буду просто повідомляти, який обробник додати

Якщо вікно інспектора обєктів закрито, відкрийте його, натиснувши кнопку F11 або вибравши пункт меню View → Object Inspector Виберіть форму, клацнувши на ній мишею або вибравши її з випадаючого комбінованого списку у верхній частині інспектора обєктів Перейдіть на сторінку events (події) і в лівій частині інспектора обєктів знайдіть подія OnMouseDown Всі події перераховані в алфавітному порядку, тому у вас не повинно виникнути проблем з пошуком потрібного Клацніть в праву частину сітки інспектора обєктів навпроти події

OnMouseDown і наберіть там OnMouseDown – Це буде назвою нового обробника подій Якщо вас бентежить, що ми тепер маємо обробник події з тим же імям, що і оброблюване їм подія, то дещо пізніше в цьому розділі ми побачимо, як змінити цю ситуацію Натисніть клавішу Enter, щоб підтвердити зроблені зміни

Після того як ви ввели імя методу і підтвердили свій вибір, CBuilder створить новий обробник у вікні редактора Введіть такі рядки коду в метод OnMouseDown, Відображений у вікні редактора:

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

TShiftState Shift, int X, int Y)

{

FbMouseDown = TRUE Canvas-&gtMoveTo(X,Y)

}

Прапор FbMouseDown, Показаний у попередньому коді, повинен бути доданий в заголовки (Unit1h) і инициализирован в конструкторі Цей прапор сигналізує, натиснута (TRUE) чи ні (FALSE) кнопка миші у вікні Нижче наведені зміни, які належить провести в заголовному файлі (показані підсвічуванням):

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

#ifndef Unit1h

#define Unit1h

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

#include &ltvcl\Classeshpp&gt

#include &ltvcl\Controlshpp&gt

#include &ltvcl\StdCtrlhpp&gt

#include &ltvcl\Formshpp&gt

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

class TForm1 : public TForm

{

__published: // IDE-managed Components

void __fastcall OnMouseDown(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, intY) private: // User declarations BOOL FbMouseDown public: // User declarations

__fastcall TForm1(TComponent* Owner)

}

//———————————————–

extern TForm1 *Form1

//———————————————–

#endif

І ось, нарешті, зміни, які треба виробити в конструкторі класу

(У вихідному файлі Unit1cpp):

__fastcall TForm1::TForm1(TComponent* Owner)

:TForm(Owner)

{

FbMouseDown = FALSE / / Установка прапора натискання

/ / Кнопки миші в Брехня

}

Давайте, перед там як рухатися далі, поглянемо на те, що у нас вийшло У класу TForm1

тепер є private (приватна) змінна, визначена програмістом –FbMouseDown,

значення якої показує, чи натиснута в даний момент кнопка миші Якщо користувач натискає ліву кнопку миші всередині клієнтської області вікна, система обробки подій викличе метод OnMouseDown Цей метод просто-напросто встановлює значення прапора в TRUE (істина) і пересуває поточну позицію малювання в поле форми (тобто в Canvas) в позицію миші У обробнику для події CBuilder дуже доступно передає нам інформацію про позицію миші в той момент, коли на ній була натиснута кнопка

Вас може зацікавити питання – а як CBuilder асоціює подія OnMouseDown з написаним нами методом OnMouseDown Явно не по імені, оскільки обробник може бути викликаний за нашим бажанням звідки завгодно Ні в наведеному вище коді, ні в коді заголовка ви не знайдете нічого, що здійснювала б ассоціірова ня Це що – магія Borland Відповідь криється у файлі Unit1dfm, який містить інформацію про розміщення та обробці форми для модуля Unit1 Якщо ви спробуєте прочитати файл DFM (form definition file, файл опису форми), використовуючи стандартний текстовий редактор або набравши його імя в командному рядку, то побачите, що він складається з дивних керуючих символів, в яких немає (або дуже мало) сенсу Як же подивитися на те, що відбувається там, всередині

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

*

*