- •О.С. Зеленський
- •Розділ 9. Структура створення додатків
- •9.1. Загальна структура додатків
- •9.2. Додатки без використання архітектури «Документ-вид»
- •9.2.1. Приклад додатку реєстрації wnd-класу вікна
- •9.2.2. Створення та видалення дочірніх вікон без використання архітектури «Документ-Вид»
- •9.2.3. Створення дочірніх вікон без використання архітектури «Документ-Вид» (переключення вікон з використанням функції ShowWindow)
- •9.3. Архітектура «Документ-Вид»
- •Idr_mainframe формат строкового ресурсу.
- •9.3.1. Приклад додатку з використанням архітектури «Документ-Вид»
- •9.3.2. Види у архітектурі «Документ-Вид»
- •9.3.3. Створення видів у архітектурі «Документ-Вид» (переключення видів з використанням функції ShowWindow)
- •9.3.4. Робота з документами та видами на прикладі додатку SingleTemplate
- •9.4. Додатки mdi, робота з шаблонами
- •9.4.1. Приклад додатку mdi з одним шаблоном
- •9.4.2. Приклад додатку mdi з декількома шаблонами
- •Контрольні питання
- •Розділ 10. Робота з базами даних з використанням об'єктів ado
- •10.1.1. Ініціалізація об'єктів com з використанням директиви #import
- •10.1.2. Підтримка класів сом
- •10.2. Об'єкт Connection
- •10.3. Об'єкт Command
- •10.4. Об'єкт Recordset
- •10.5. Об'єкт Field і колекція Fields
- •10.6. Об'єкт Error і колекція Errors
- •10.8. Коротка характеристика структури мови sql
- •10.9. Синтаксис оператора вибору Select
- •10.10. Приклад програмування об'єктів ado
- •10.11. Опис розробленого навчального пакету ado6 для роботи з базами даних access та MySql
- •Int tip_bd; // тип бд 1- ms access, 2- MySql, 3 - xml
- •Void Connect_Baza(cString str);
- •Void ErrMessage(_com_error &ce);
- •If(pConn.CreateInstance("adodb.Connection"))
- •If(pRecordset.CreateInstance("adodb.RecordSet"))
- •Void cAdo6Doc::ErrMessage(_com_error &ce)
- •Void cAdo6Doc::OnMsaccess()
- •Void cAdo6Doc::OnMysql()
- •Void cAdo6Doc::OnXmlRead()
- •Void cAdo6Doc::Connect_Baza(cString str)
- •Virtual void DoDataExchange(cDataExchange* pDx);
- •Void cAdo6Dlg::DoDataExchange(cDataExchange* pDx)
- •Void cAdo6Dlg::Struct_MySql()
- •Void cAdo6Dlg::OnSelchangeListBaza()
- •Void cAdo6Dlg::OnVibor_bd()
- •Void cAdo6Dlg::AccessOpen()
- •Void cAdo6Dlg::xmlOpen()
- •Void cAdo6Dlg::Structura_bd()
- •Void cAdo6Dlg::OnSelchangeListTab()
- •Void cAdo6Dlg::show(int kod, int kod_bd)
- •Void cAdo6Dlg::Recordset_Baza(cString str)
- •Void cAdo6Dlg::OnClose()
- •10.11.2. Формування списку бд (MySql), відкриття бази даних (ms access), відкриття xml-файлу, формування списку таблиць (MySql і ms access) та полів (MySql, ms access, xml)
- •Void cAdo6Dlg::OnSelchangeListTab()
- •1. Обрану таблицю необхідно брати в зворотні лапки "`", щоб виключити помилку в тому випадку, якщо в імені таблиці будуть зустрічатися пробіли.
- •10.11.3. Робота з sql-запитами
- •Void cAdo6Dlg::OnZapros_Select()
- •If (str_query.Mid(0,6).Compare("select"))
- •If(!baza.Left(3).Compare("otl") &&
- •Void cAdo6Dlg::Recordset_Baza(cString str)
- •Void cado6Dlg::OnZapros_Make()
- •Vr_zap.Format(" Запрос выполнен за %f сек ",conec - nach);
- •10.11.4. Видалення, сортування, пошук, фільтрація, оновлення набору записів
- •Void cado6Dlg::OnZapis_Delete()
- •Void cado6Dlg::OnCheck_Sort()
- •Void cado6Dlg::OnFind()
- •0L,adSearchForward,bb);
- •Void cado6Dlg::OnFilter()
- •Void cado6Dlg::OnVozvrat()
- •10.11.5. Переходи по записах
- •Void cado6Dlg::OnButtonFirst()
- •Void cado6Dlg::OnButtonLast()
- •Void cado6Dlg::OnButtonLeft()
- •Void cado6Dlg::OnButtonRight()
- •Void cado6Dlg::OnButtonRecno()
- •Void cado6Dlg::OnButtonPgup()
- •Void cado6Dlg::OnButtonPgdn()
- •Void cado6Dlg::OnButtonBookmark()
- •10.11.6. Запис даних до xml-файлу
- •Void cAdo6Dlg::OnButtonSave()
- •10.11.7. Кнопки, призначені тільки для роботи з otl_tab
- •Void cado6Dlg::OnZapis_Add1()
- •Void cado6Dlg::OnZapis_Add2()
- •Void cado6Dlg::OnZapis_Update1()
- •Void cado6Dlg::OnZapis_Update2()
- •Void cado6Dlg::OnFormir_bd()
- •Void cAdo6Dlg::OnValues_Fields()
- •10.12. Використання у якості джерела даних електронної таблиці Excel
- •Контрольні питання
- •Завдання
- •Розділ 11. Програмування для інтернет
- •11.1. Створення броузера
- •11.3. Використання протоколу http
- •If ((pInternetSession)
- •11.4. Використання протоколу ftp
- •Контрольні питання
- •Розділ 12. Створення елементів activex
- •12.1. Створення елементів ActiveX
- •Invalidate();
- •12.2. Тестування елемента ActiveX
- •12.4. Створення елемента ActiveX на базі стандартних елементів
- •12.5. Відображення елементів ActiveX
- •Контрольні питання
- •Розділ 13. Налагодження програм
- •Int data[5];
- •Invalidate();
- •13.3. Установка точки переривання
- •13.2. Покрокове виконання програми
- •13.4. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
Контрольні питання
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);