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

Контрольні питання

1. Призначення функції Navigate.

2. Призначення класу CInternetSession.

3. Призначення класу CFtpConnection.

4. Призначення класу CInternetFile.

5. Призначення класу CHttpFile.

6. Призначення функції OpenURL.

7. Призначення основних методів класу CInternetSession.

8. Призначення основних методів класу CFtpConnection.

Розділ 12. Створення елементів activex

У цьому розділі розглядається робота з елементами ActiveX – керуючими компонентами, які можна впроваджувати у програми, а також у Web-сторінки, що відображаються за допомогою броузера. Навчившись створювати елементи ActiveX, ми зможемо включати їх в інші програми, що відкриває безліч корисних можливостей. Більш того, їх навіть можна включити в палітру редактора діалогових вікон і перетягувати безпосередньо в створюване діалогове вікно.

Ми дізнаємося, як створювати елементи ActiveX і користуватися ними як у спеціальній програмі – «тестовому контейнері», що поставляється разом з Visual C++, так і в інших програмах, написаних на Visual C++. Побачимо, як організувати малювання елемента ActiveX, щоб він виглядав так, як нам потрібно.

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

Нарешті, ми дізнаємося, як створити в елементі ActiveX методи, які можуть викликатися з інших програм, і властивості (збережені у вигляді внутрішніх змінних), значення яких можуть задаватися іншими програмами. Елементи ActiveX можуть підтримувати свої, нестандартні події, вони також будуть згадані в цьому розділі.

Приступимо до нашого першого елементу ActiveX - boxer.

12.1. Створення елементів ActiveX

Елемент ActiveX Boxer

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

Наш перший елемент ActiveX малює на екрані невеликий прямокутник, розділений на чотири частини; коли користувач клацає мишею в одній з них, відповідна частина зафарбовується в чорний колір.

Якщо користувач клацне в іншій частині, зафарбування переходить на неї.

Так буде працювати наш перший елемент ActiveX, який, можна включити в іншу програму.

Запустіть Visual C++ і почніть створення програми boxer. На цей раз у діалоговому вікні New виберіть рядок MFC ActiveX ControlWizard (рис. 12.1).

Створення керуючого елемента за допомогою MFC ActiveX ControlWizard займає всього два етапи. Підтвердіть установки за замовчуванням кнопкою Finish; Control Wizard завершує створення елемента.

Рис. 12.1. Створення елемента ActiveX

Код елемента в створеному проекті міститься у файлах BoxerCtl.h і BoxerCtl.cpp. Клас елемента є похідним від класу COleControl, а вміст файлу BoxerCtl.cpp частково нагадує код стандартного класу виду. Зокрема, в ньому присутній метод OnDraw(), в якому відбувається відображення елемента. З нього ми й почнемо.

Малювання елемента ActiveX

На даний момент метод OnDraw() у файлі BoxerCtl.cpp виглядає таким чином:

void CBoxerCtrl::OnDraw(

CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)

{

// ЗРОБИТИ: замініть слідуючий фрагмент кодом

// малювання елемента

pdc->FillRect(rcBounds,CBrush::FromHandle(

(HBRUSH)GetStockObject(WHITE_BRUSH)));

pdc->Ellipse(rcBounds);

}

Методу OnDraw() передається прямокутник rcBounds, в межах якого має бути намальований елемент, а заздалегідь поміщений в нього код зафарбовує цей прямокутник білим кольором і малює у ньому еліпс. Ми намалюємо в елементі власне зображення, тому видалимо з OnDraw() рядок для малювання еліпса: pdc->Ellipse(rcBounds);.

Розділимо область елемента на чотири прямокутники з іменами box1-box4 і оголосимо їх у файлі BoxerCtl.h:

class CBoxerCtrl : public COleControl

{

.............................................................

// Реалізація

protected:

~CBoxerCtrl();

CRect box1;

CRect box2;

CRect box3;

CRect box4;

.............................................................

};

У методі OnDraw() область елементу ділиться на чотири частини, розташовані в лівому верхньому, правому верхньому, лівому нижньому і правому нижньому кутах:

void CBoxerCtrl::OnDraw( CDC* pdc, const CRect& rcBounds,

const CRect& rcInvalid)

{

pdc->FillRect(rcBounds,CBrush::FromHandle(

(HBRUSH)GetStockObject(WHITE_BRUSH)));

box1 = CRect(rcBounds.left, rcBounds.top,

rcBounds.right/2, rcBounds.bottom/2);

box2 = CRect(rcBounds.left, rcBounds.bottom/2,

rcBounds.right/2, rcBounds.bottom);

box3 = CRect(rcBounds.right/2, rcBounds.top,

rcBounds.right, rcBounds.bottom/2);

box4 = CRect(rcBounds.right/2, rcBounds.bottom/2,

rcBounds.right, rcBounds.bottom);

.............................................................

}

Потім ми малюємо всі чотири прямокутники:

void CBoxerCtrl::OnDraw(

CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)

{

pdc->FillRect(rcBounds,

CBrush::FromHandle((HBRUSH)

GetStockObject(WHITE_BRUSH)));

box1 = CRect(rcBounds.left, rcBounds.top,

rcBounds.right/2, rcBounds.bottom/2);

box2 = CRect(rcBounds.left, rcBounds.bottom/2,

rcBounds.right/2, rcBounds.bottom);

box3 = CRect(rcBounds.right/2, rcBounds.top,

rcBounds.right, rcBounds.bottom/2);

box4 = CRect(rcBounds.right/2, rcBounds.bottom/2,

rcBounds.right, rcBounds.bottom);

pdc->Rectangle(&box1);

pdc->Rectangle(&box2);

pdc->Rectangle(&box3);

pdc->Rectangle(&box4);

}

Прямокутники з'явилися на екрані. Наступним кроком повинна стати обробка повідомлень від миші і зафарбування прямокутника, на якому клацнув користувач.

Створення обробника повідомлення в елементі ActiveX

В елементах ActiveX повідомлення обробляються так само, як і в інших програмах, – необхідно скористатися ClassWizard та створити у нашому елементі обробник для повідомлення WM_LBUTTONDOWN (рис. 12.2).

Метод OnLButtonDown() в коді для елемента ActiveX виглядає таким чином:

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

{

// ЗРОБИТИ: додайте код обробки повідомлення

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

COleControl::OnLButtonDown(nFlags, point);

}

Рис. 12.2. Додавання підтримки роботи з мишею для елемента ActiveX

Ми повинні визначити, в якому із чотирьох прямокутників клацнув користувач, і зафарбувати цей прямокутник – для цього в заголовному файлі CBoxerCtl.h оголошуються чотири нові змінні (вони будуть виконувати функції прапорців):

class CBoxerCtrl : public COleControl

{

.............................................................

// Реалізація

protected:

~CBoxerCtrl();

CRect box1;

CRect box2;

CRect box3;

CRect box4;

boolean fill1;

boolean fill2;

boolean fill3;

boolean fill4;

.............................................................

}

У конструкторі елемента їм присвоюються значення false:

CBoxerCtrl::CBoxerCtrl()

{

InitializeIIDs(&IID_DBoxer, &IID_DBoxerEvents);

fill1 = fill2 = fill3 = fill4 = false;

}

У методі OnLButtonDown() можна встановити значення прапорців за допомогою зручного методу PtInRect() класу CRect. Він повертає true, якщо точка-параметр належить прямокутнику (у нашому випадку прямокутникам box1-box4):

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

{

fill1 = box1.PtInRect(point);

fill2 = box2.PtInRect(point);

fill3 = box3.PtInRect(point);

fill4 = box4.PtInRect(point);

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