Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual2.doc
Скачиваний:
5
Добавлен:
07.03.2016
Размер:
3.31 Mб
Скачать

12.4. Створення елемента ActiveX на базі стандартних елементів

Приклад створення елементу ActiveX на базі кнопки знаходиться у папці DISK\ActiveX\buttoner. Приклад додатку, який використовує даний елемент знаходиться у папці DISK\ActiveX\buttonerapp.

Цей приклад демонструє ряд нових аспектів програмування ActiveX, наприклад, можливість створення елементів на базі існуючих керуючих елементів (наприклад, кнопок). Ми також побачимо, як організувати в елементах ActiveX підтримку подій – програма, в яку запроваджено такий елемент, зможе обробити подію так само, як будь-яке повідомлення Windows. У нашому випадку елемент буде називатися Buttoner і підтримувати подію Click. Присутній у програмі метод-обробник (скажімо, OnClickButtonerctrl1()) буде викликатися при клацанні мишею всередині елемента.

Крім того, в новому прикладі будуть підтримуватися методи елементів ActiveX – зокрема, ми включимо в нього метод Веер(). В інших програмах за допомогою ClassWizard ви зможете створювати змінні, пов'язані з нашим елементом (наприклад, m_buttoner), і викликати метод за допомогою запису типу m_buttoner.Веер().

Нарешті, ми розглянемо властивості елементів ActiveX. У нашому прикладі буде підтримуватися властивість з ім'ям data. У ній зберігатиметься кількість клацань мишею, зроблених на елементі. Існує два способи звернення до властивості data з інших програм: можна або дозволити посилатися на властивість в записі типу m_buttoner.data і безпосередньо читати і присвоювати значення цієї властивості, або скористатися більш надійним способом і надати спеціальні методи для звернення до властивості. У цьому випадку інша програма повинна викликати метод m_buttoner.SetData(), щоб привласнити значення властивості, і m_buttoner.GetData(), щоб отримати його. Використання методів для доступу більш надійно, оскільки присвоюване значення можна заздалегідь перевірити. У нашому прикладі буде використовуватися саме цей варіант.

Створіть програму Buttoner за допомогою ControlWizard. У другому вікні Control Wizard виберіть рядок BUTTON з розкривного списку під питанням Which window class, if any, should this control subclass? (Який віконний клас, якщо такий існує, повинен субкласувати даний елемент?), як показано на рис. 12.7, і завершіть створення елемента кнопкою Finish.

Рис. 12.7. Створення елемента Buttoner на базі кнопки

Можна приступати до настройки елементу Buttoner.

Налаштування елемента Buttoner

Поки що наш новий елемент ActiveX виглядає, як порожня кнопка, проте ми можемо налаштувати його зовнішній вигляд і помістити на нього напис, наприклад «Натисни мене!». Ми зробимо це в конструкторі елемента, розташованому у файлі ButtonerCtl.cpp:

CButtonerCtrl::CButtonerCtrl()

{

InitializeIIDs(&IID_DButtoner, &IID_DButtonerEvents);

// ЗРОБИТИ: ініциалізуйте дані екземпляра

// вашого елемента.

}

Елемент Buttoner, як і всі керуючі елементи ActiveX, породжується від класу COleControl, тому можна скористатися методом SetText() цього класу і змінити напис на елементі:

CButtonerCtrl::CButtonerCtrl()

{

InitializeIIDs(&IID_DButtoner, &IID_DButtonerEvents);

// ЗРОБИТИ: ініциалізуйте дані екземпляра

// вашого елемента.

SetText("Нажми меня!");

}

Рис. 12.8. Налаштування елемента ActiveX

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

Додавання подій

Ми створимо в елементі Buttoner подію Click, яка відбувається при клацанні мишею. Її виникнення (з повідомленням програми, в яку запроваджено елемент ActiveX) називається збудженням (firing) події, тому говорять, що при натисканні мишею програма збуджує подію Click. При порушенні події Click викликається її обробник у програмі, яка містить наш елемент. Це робиться наступним чином.

У ClassWizard необхідно перейти на вкладку ActiveX Events та натиснути кнопку Add Event. Відкривається однойменне вікно (рис. 12.9).

Рис. 12.9. Додавання події до елемента ActiveX

У ньому ми і створимо подію Click. Виберіть рядок Click у списку External name (див. рис. 12.9) – в наш елемент додається подія Click. Щоб подія дійсно відбулась, потрібно викликати метод FireClick(), який також вказаний у вікні Add Event.

Підказка. Якщо ви хочете, щоб нова подія викликалась з параметрами (які будуть передаватися оброблювачу програми, що працює з елементом), введіть параметри та його типи в списку Parameter, розташованому в нижній частині вікна Add Event.

Подія Click буде порушуватися при клацанні лівою кнопкою миші, тому зараз ми включимо в елемент ActiveX обробник OnLButtonDown():

void CButtonerCtrl::OnLButtonDown(UINT nFlags, CPoint point)

{

// ЗРОБИТИ: додайте код обробки події

// і/або викличте обробник за замовчуванням

COleControl::OnLButtonDown(nFlags, point);

}

Щоб порушити подію Click, досить викликати спеціальний метод FireClick(), створений ClassWizard (якщо подія передає обробникам будь-які параметри, їх слід передати методу FireEvent(), де Event – ім'я вашої події):

void CButtonerCtrl::OnLButtonDown(UINT nFlags, CPoint point)

{

FireClick();

COleControl::OnLButtonDown(nFlags, point);

}

Цей фрагмент призводить до того, що при кожному клацанні мишею буде порушуватися подія Click, а програми, що працюють з елементом, зможуть відреагувати на неї в обробнику.

Ми навчилися порушувати події з елемента ActiveX. Число клацань повинно зберігатися у властивості data, і зараз ми створимо цю властивість.

Додавання властивостей до елементів ActiveX

Властивістю називається змінна класу елемента. Якщо той містить властивість data, то інші програми можуть звертатися до нього через запис типу m_buttoner.data або через функції читання / запису властивості: m_buttoner.SetData() і m_buttoner.GetData(). Ми познайомимося з властивостями на прикладі data, який зберігає число клацань мишею.

Щоб додати властивості в елемент ActiveX також використовується ClassWizard. Відкрийте його і перейдіть на вкладку Automation (за назвою технології OLE Automation), потім натисніть кнопку Add Property, щоб викликати однойменне вікно (рис. 12.10).

Рис. 12.10. Вікно Add Property

Введіть в поле External name назву властивості data; зробіть її коротким цілим числом, вибравши зі списку Туре рядок short. Встановіть перемикач Member Variable. Натисніть кнопку OК, щоб закрити вікно Add Property, а потім закрийте ClassWizard.

Тепер в програмі можна посилатися на значення властивості data через змінну m_data. Почнемо з обнулення цього значення в конструкторі:

CButtonerCtrl::CButtonerCtrl()

{

InitializeIIDs(&IID_DButtoner, &IID_DButtonerEvents);

SetText("Haжми меня!");

m_data = 0;

}

У властивості має зберігатися число кліків на елементі, тому в OnLButtonDown() слід збільшувати значення m_data:

void CButtonerCtrl::OnLButtonDown(UINT nFlags, CPoint point)

{

// ЗРОБИТИ: додайте код обробки події

// і/або викличте обробник за замовчуванням

FireClick();

m_data++;

COleControl::OnLButtonDown(nFlags, point);

}

Якщо інша програма викличе метод GetData() нашого елемента, вона отримає значення змінної m_data, яке дорівнює кількості клацань, зроблених на ньому.

Додавання властивості закінчено. До справжнього моменту наш елемент має подію Click і властивість data. Зараз ми додамо до нього метод Beep(), який може викликатися іншими програмами за допомогою запису виду m_buttoner.Веер().

Додавання методів

Щоб додати елемент метод, викличте ClassWizard і перейдіть на вкладку Automation. Натисніть кнопку Add Method для відкриття вікна (рис. 12.11).

Дайте новому методу ім'я Beep (в обох полях – External name і Internal name) і тип значення, що повертається void (рис. 12.11). Натисніть кнопку ОК, щоб закрити вікно Add Method, а потім закрийте ClassWizard. В елементі з'являється метод Beep()

void CButtonerCtrl::Beep()

{

// ЗРОБИТИ: додайте код диспетчерської обробки

}

Рис. 12.11. Вікно Add Method

При виклику цього методу комп'ютер буде видавати звуковий сигнал, для цього ми скористаємося методом MFC MessageBeep():

void CButtonerCtrl::Beep()

{

MessageBeep(MB_OK);

}

У нашому елементі з'явився новий метод, який може використовуватися в інших програмах. Тепер вони можуть викликати метод Beep() елемента всередині свого коду. Настав час подивитися, як елемент Buttoner веде себе в інших додатках. Давайте спробуємо впровадити його в програму і попрацювати з ним на рівні програмного коду.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]