- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
Розділ 11. Програмування для інтернет
11.1. Створення броузера
Приклад знаходиться у папці DISK\Internet\browser.
Написати свій власний браузер на Visual C++ не складно. Справа в тому, що Microsoft Internet Explorer, який застосовується в якості базової програми для роботи з довідковою системою Visual C++, може використовуватися в програмах як елемент керування.
Щоб вивести сторінку Microsoft в Web-броузері, досить включити в програму елемент Microsoft Web Browser, створити для нього відповідний об'єкт і викликати метод Navigate().
Для цього необхідно перш за все створити нову програму на базі діалогового вікна. Дамо їй назву browser. Далі необхідно виконати наступні дії:
1. Виконати команду Project → Add to Project → Components and Controls – відкривається вікно з колекцією компонентів і елементів керування Visual C++, Components and Controls Gallery.
2. Двічі клацнути на рядку Registered ActiveX Controls, щоб відкрити список елементів ActiveX, зареєстрованих операційній системі (рис. 11.1).
3. У списку компонентів повинен бути присутнім елемент Microsoft Web Browser Control (рис. 11.1). Клацніть його, потім натисніть кнопку Insert.
Рис. 11.1. Колекція компонентів і елементів Visual C++
4. Visual C++ запитує, який клас слід створити для нового елемента; підтвердіть ім'я за замовчуванням CWebBrowser (Visual C++ може запропонувати ім'я CWebBrowser2 в залежності від особливостей установки Internet Explorer на вашому комп'ютері). Елемент броузера з'являється на панелі редактора діалогових вікон.
5. Відкрийте головне діалогове вікно в редакторі діалогових вікон (рис. 11.2). Елемент броузера знаходиться в нижній частині палітри.
6. Перетягніть елемент в діалогове вікно і відрегулюйте його розміри відповідно до рис. 11.2. Новому елементу присвоюється ідентифікатор IDC_EXPLORER1.
7. За допомогою Class Wizard зв'яжіть з цим елементом змінну і надайте їй ім'я m_browser.
8. Крім того, розмістіть в діалоговому вікні кнопку Browse та зв'яжіть з нею обробник OnButton1().
9. При натисканні кнопки Browse() наш броузер повинен звернутися за адресою: http://www.microsoft.com. Для цього ми скористаємося методом Navigate():
void CBrowserDlg::OnButton1()
{
m_browser.Navigate("http://www.microsoft.com", 0, 0, 0, 0);
}
10. На останньому етапі запустимо програму (рис. 11.3) і натиснимо кнопку Browse.
Рис. 11.2. Проектування діалогового вікна для броузера
Підказка. В універсальній версії цієї програми користувач повинен мати можливість ввести потрібну адресу в комбінованому або текстовому полі, але з іншого боку, це може бути небажаним, якщо ви хочете обмежити його переглядом тільки однієї Web-сторінки.
Рис. 11.3. Броузер з Web-сторінкою "http://www.microsoft.com"
11. При натисканні кнопки Browse програма переходить до основної сторінки Microsoft (рис. 11.3). Наш повноцінний броузер працює – в ньому можна користуватися гіперпосиланнями та іншими можливостями WWW, які підтримуються в Internet Explorer.
Підказка. Ви можете скористатися і іншими методами елемента Microsoft Web Browser, наприклад, GoHome() або GoBack(), призначеними для роботи зі списком переглянутих адресів.
Оригінальний текст прикладу міститься у файлах browserDlg.h / browserDlg.cpp.
browserDlg.h і browserDlg.cpp
// browserDlg.h : заголовочний файл
//
//{{AFX_INCLUDES()
#include "webbrowser.h"
//}}AFX_INCLUDES
#if !defined(AFX_BR0WSERDLG_H__093DA507_9868_11D0_8860_444553540000__INCLUDED_)
#define AFX_BR0WSERDLG_H__093DA507_9868_11D0_8860_444553540000__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
/////////////////////////////////////////////////////////////////////////
// Діалогове вікно CBrowserDlg
class CBrowserDlg : public CDialog
{
// Конструювання
public:
CBrowserDlg(CWnd* pParent = NULL);
// Стандартний конструктор
// Дані діалогового вікна
//{{AFX_DATA(CBrowserDlg)
enum { IDD = IDD_BR0WSER_DIAL0G };
CWebBrowser m_browser;
//}}AFX_DATA
// Перевантаження
// Перевантажені віртуальні функції,
// сформовані ClassWizard-ом.
//{{AFX_VIRTUAL(CBrowserDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);
// Підтримка DDX/DDV
//}}AFX_VIRTUAL
// Реалізація
protected:
HICON m_hIcon;
// Сформовані функції карти повідомлень
//{{AFX_MSG(CBrowserDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_L0CATION}}
// Microsoft Visual C++ буде вставляти додаткові
// оголошення перед попереднім рядком.
#endif
// !defined(AFX_BR0WSERDLG_H__093DA507_9868_
// 11D0_8860_444553540000__INCLUDED_)
// browserDlg.cpp : файл реалізації
//
#include "stdafx.h"
#include "browser.h"
#include "browserDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////
// Діалогове вікно CAboutDlg, що виводиться по команді About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Данні діалогового вікна
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// Перевантаження
// Перевантажені віртуальні функції,
// сформовані ClassWizard-ом.
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);
// Поддержка DDX/DDV
//}}AFX_VIRTUAL
// Реалізація
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// Обробники повідомлень відсутні
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////
// Діалогове вікно CBrowserDlg
CBrowserDlg::CBrowserDlg(CWnd* pParent /*=NULL*/)
: CDialog(CBrowserDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CBrowserDlg)
// УВАГА: тут ClassWizard ініциалізує дані класа
//}}AFX_DATA_INIT
// Зверніть увагу на те, що в Win32 LoadIcon
// не потребує наступного виклика DestroyIcon
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CBrowserDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBrowserDlg)
DDX_Control(pDX, IDC_EXPLORER1, m_browser);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBrowserDlg, CDialog)
//{{AFX_MSG_MAP(CBrowserDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////
// Обробники повідомлень CBrowserDlg
BOOL CBrowserDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Додати команду "About..." в системне меню.
// Значення IDM_ABOUTBOX повинне знаходитись в діапазоні
// системних команд.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(
MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Поставити значок для діалогового вікна. Бібліотека
// робить це автоматично, якщо головне вікно програми
// не є діалоговим.
SetIcon(m_hIcon, TRUE); // Встановити великий значок
SetIcon(m_hIcon, FALSE); // Встановити малий значок
// ЗРОБИТИ: додайте додаткову ініціалізацію
return TRUE; // повернути TRUE, якщо тільки ви
// не передаєте фокус елементу
}
void CBrowserDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// Якщо в діалоговому вікні є кнопка згортання, наведений
// нижче код знадобиться для малювання значка. У додатках MFC,
// які використовують модель документ / вид, це робиться
// автоматично.
void CBrowserDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // контекст пристрою для
// малювання
SendMessage(WM_ICONERASEBKGND,
(WPARAM) dc.GetSafeHdc(), 0);
// Вивести значок в центрі клієнтського
// прямокутника
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Намалювати значок
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// Викликається системою для отримання вказівки,
// відображаємого при перетаскуванні згорнутого вікна.
HCURSOR CBrowserDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CBrowserDlg::OnButton1()
{
// ЗРОБИТИ: додайте код для обробки повідомлень
// від елемента
m_browser.Navigate("http://www.microsoft.com", 0,0,0,0);
}
Керуючий елемент Web Browser дозволяє легко і швидко створювати броузери (якщо на комп'ютері користувача встановлено Internet Explorer). Visual C++ надає й інші можливості для роботи в Інтернеті, в яких цей елемент взагалі не застосовується. Замість нього використовується підтримка WinInet, що з'явилася в Visual C++, починаючи з версії 5.0. Ми познайомимося з нею ближче під час вивчення програмного використання протоколу HTTP.
11.2. Підтримка Internet у Visual C++
Класи WinInet дозволяють розробникам використовувати для створення Internet-додатків виклики функцій високого рівня, що виконують велику частину роботи. Таким чином, процес створення Internet-додатка практично нічім не відрізняється від процесу створення будь-якого іншого додатку MFC. Класи WinInet дозволяють розробникам вибрати той рівень абстракції, який необхідній для їх програми: вони можуть скористатися невеликим набором стандартних функцій або провести низькорівневе налаштування з'єднання. Основні класи WinInet наведено в табл. 11.1.
Таблиця 11.1
Основні класи WinInet
Клас |
Опис |
CInternetSession |
Створює сеанс Internet і управляє ним. Всі додатки, які використовують WinInet перед тим, як створити об'єкт будь-якого іншого класу WinInet, повинні створити об'єкт класу CInternetSession |
CInternetConnection |
Створює з'єднання Internet і управляє ним. Цей клас є базовим для класів CFtpConnection, CGopherConnection і CHttpConnection |
CFtpConnection |
Створює з'єднання FTP і управляє ним |
CGopherConnection |
Створює з'єднання gopher і керує ним |
CHttpConnection |
Створює з'єднання HTTP і керує ним |
CInternetFile |
Дозволяє віддалений доступ до файлів на сервері Internet. Цей клас є базовим для класів CGopherFile і CHttpFile |
CGopherFile |
Управляє обміном інформації з файлом на сервері gopher |
CHttpFile |
Управляє обміном інформації з файлом на сервері HTTP |
CFileFind |
Дозволяє програмі проводити пошук файлів. Цей клас є базовим для класів CFtpFileFind і CGopherFileFind |
CFtpFileFind |
Дозволяє програмі проводити пошук файлів на сервері FTP |
CGopherFileFind |
Дозволяє програмі проводити пошук файлів на сервері gopher |
CGopherLocator |
Дозволяє отримати локатор з сервера gopher |
СInternetException |
Обробляє виключення, викликані іншимі класами WinInet |