- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
Розділ 9. Структура створення додатків
9.1. Загальна структура додатків
Додатки на Visual C++ створюються з використанням мастера MFC AppWizard за декілька кроків. На 1-му кроці треба обрати тип додатку: Single document (однодокументний інтерфейс), Multiple documents (багатодокументний інтерфейс) або Dialog based (вікно діалогу).
Одно– та багатодокументні додатки створюються завдяки використанню архітектури «Документ-Вид». Для такого додатку потрібно створити мінімум по одному з класів документа та виду.
Під документом розуміється певний набір даних, котрі створюються додатком. Роботу з цими даними забезпечує клас документа. Цей клас містить всі необхідні дані та функції для запису та читання файлів з диску (серіалізація даних).
Клас виду відповідає за відображення даних документа на екран. Всі класи виду є похідними від CView. Кожен клас виду містить функцію OnDraw для виведення даних на екран.
Можна створювати різні документи, для цього необхідно створити декілька класів документа. Співставлення різних класів документа і виду забезпечує клас шаблона.
При виборі опції Single document створюється програма з одно-документним інтерфейсом. Це означає, що у шаблоні має місце тільки один документ, до якого можуть приєднуватись багато вікон (видів).
При виборі опції Multiple documents створюється програма з багато-документним інтерфейсом. Це означає, що даний шаблон може містити кілька документів, кожен з яких може містити багато (видів). Відмінність між одно- та багатодокументним інтерфейсами полягає в тому, що у багатодокументному інтерфейсі на кожний документ та вид створюються незалежні об’єкти. Всі документи створюються або відкриваються всередині головного вікна.
При виборі опції Dialogbased створюється програма на базі вікна діалогу.
Всі вікна базуються на структурі WNDCLASS, яка вміщує властивості класу вікна. Створення вікна проходить у 3 етапи:
1. Відбувається реєстрація класу вікна функцією AfxRegisterClass або AfxRegisterWndClass. Аргументом функції AfxRegisterClass є заповнена структура класу вікна WNDCLASS. Що стосується функції AfxRegisterWndClass, до неї передаються лише окремі параметри структури WNDCLASS, інші заповнюються по умовчанню.
2. Перед створенням вікна викликається функція PreCreateWindow, у якій заповнюється структура CREATESTRUCT. Структура CREATESTRUCT визначає параметри ініціалізації вікна, а саме розташування вікна, атрибути власних (WS_...) та розширених стилів вікна (WS_EX_...). Ця структура має зв’язок зі структурою WNDCLASS через змінну, яка включає ім’я класу lpszClass структури CREATESTRUCT та lpszClassName структури WNDCLASS.
3. Створення вікна функцією Create або CreateEx.
Опишемо зазначені функції та структури.
Функція AfxRegisterWndClass
LPCTSTR AFXAPI AfxRegisterWndClass( UINT nClassStyle, HCURSOR hCursor = 0, HBRUSH hbrBackground = 0, HICON hIcon = 0 );
Значення параметрів:
UINT nClassStyle – цей параметр задає стилі класу вікна (див. табл. А.1)
HCURSOR hCursor – дескриптор курсору, який буде відображатись у даному вікні. Якщо задати 0, то вікно буде без курсора. Для програмного створення курсора використовується функція CreateCursor.
HBRUSH hbrBackground – дескриптор пензля для заливки фону.
HICON hIcon – дескриптор іконки вікна.
Функція AfxRegisterClass
BOOL AFXAPI AfxRegisterClass( WNDCLASS* lpWndClass );
Ця функція приймає лише один параметр, структуру WNDCLASS.
Структура WNDCLASS
WNDCLASS – це головна структура, яка потрібна для створення вікна.
typedef struct tagWNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASS;
UINT style – визначає стилі класу, див. табл. А.1.
WNDPROC lpfnWndProc – вказівка на процедуру вікна. Для її виклику необхідно скористатись функцією CallWindowProc.
int cbClsExtra – визначає обсяг додаткової пам’яті, яка буде розміщена одразу за структурою класу. Обсяг вказується в байтах. При ініціалізації в цю пам'ять записуються нулі.
int cbWndExtra – визначає обсяг додаткової пам’яті, яка буде розміщена за екземпляром вікна. Обсяг вказується в байтах.
HINSTANCE hInstance – дескриптор модулю додатку, можна отримати через API функцію GetModuleHandle.
HICON hIcon – дескриптор значка вікна (іконка). Якщо він дорівнює 0, то додаток малюється зі значком при мінімізованому вікні.
HCURSOR hCursor – дескриптор курсору.
HBRUSH hbrBackground – дескриптор пензля фона додатку. Ця змінна повинна бути дескриптором фізичного пензля, для заповнення фону, або може мати значення константи системних кольорів (до значення константи необхідно додати 1):
COLOR_ACTIVEBORDER – границя активного вікна
COLOR_ACTIVECAPTION – заголовок активного вікна (у Windows XP це колір з лівої сторони заголовка)
COLOR_BACKGROUND – робочий стіл
COLOR_CAPTIONTEXT – текст заголовку активного вікна
COLOR_HIGHLIGHT – виділений пункт меню
COLOR_HIGHLIGHTTEXT – текст виділеного пункту меню
COLOR_INACTIVEBORDER – границя не активного вікна
COLOR_MENU – меню (не виділене)
COLOR_MENUTEXT – текст у меню (не виділений)
COLOR_WINDOW – вікно, клієнтська область
COLOR_WINDOWTEXT – текст у вікні
Слід зазначити, що самі константи COLOR_... не є значеннями кольорів у форматі R, G, B. Ці константи є індексами, за якими операційна система «розуміє» який колір взяти. Для отримання значень кольорів можна скористатися API функцією GetSysColor.
Якщо hbrBackground дорівнює 0, то додаток сам повинен перемальовувати своє вікно у відповідь на повідомлення WM_ERASEBKGND. Не складно зрозуміти чому необхідно додавати 1-цю при виборі стандартної константи COLOR_..., індекси цих констант починаються з 0, який у вікні зарезервований для вище зазначених випадків.
LPCSTR lpszMenuName – вказівка на текстову строку, яка містить ім’я ресурсу меню класу, в такому вигляді, в якому це ім’я міститься у файлі ресурсів.
LPCSTR lpszClassName – ім’я Windows класу. Це ім’я задається при реєстрації класу функцією AfxRegisterClass або автоматично генерується функцією AfxRegisterWndClass.
Всі класи вікон похідні від класу CWnd. У наведених прикладах використовуються такі класи вікон: CView, CFrameWnd. Розглянемо функції створення вікон Create та CreateEx.
CWnd::Create
virtual BOOL Create( LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd,
UINT nID, CCreateContext* pContext = NULL );
CFrameWnd::Create
BOOL Create( LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
const RECT& rect = rectDefault,
CWnd* pParentWnd = NULL, LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle = 0, CCreateContext* pContext = NULL );
Функція Create з класу CFrameWnd має деякі відмінності у параметрах порівняно з такою функцією класу CWnd. Вікна CFrameWnd можуть містити панелі інструментів, статусні рядки. У більшості задач вікна створюються саме на основі класу CFrameWnd, що дозволяє використати додаткові властивості у порівнянні із простим CWnd. Для створення вкладених (дочірніх) вікон використовується клас CView, похідний від CWnd а для клієнтських (незалежних вікон) CFrameWnd.
При створенні дочірніх вікон, на основі класу CView доцільно використовувати функцію Create базового класу CWnd.
Дамо опис параметрів цих функцій:
1-й параметр LPCTSTR lpszClassName – це ім’я Windows класу (букви «LP» в назві типу є абревіатурою від «long pointer»). Операційна система Windows тримає у пам’яті певні параметри для класів вікон, кожному такому класу призначається своє ім’я за яким вікно отримує ці параметри. Які параметри отримує вікно можна дізнатись із структури WNDCLASS. Для реєстрації нового Windows класу (не плутати з класами C++) існують функції AfxRegisterWndClass та AfxRegisterClass.
2-й параметр – це заголовок вікна, його можна змінювати функцією SetWindowText.
3-й параметр DWORD dwStyle визначає стилі вікна, з яких програміст може створювати множину самих різноманітних об`єктів, комбінуючи визначені біти стилю, що мають імена з префіксом WS_ (від window style – стиль вікна). Більш детально ці біти, їх вплив на зовнішній вигляд та деякі властивості вікон наведено у табл. А.2.
4-й параметр const RECT& rect задає прямокутник розташування вікна. Якщо вікно дочірнє то воно має бути вбудоване всередину батьківського, в такому випадку цей параметр ігнорується.
5-й параметр CWnd* pParentWnd – це вказівка на батьківське вікно. Якщо він дорівнює 0, це означає, що вікно головне.
Далі параметри функцій не співпадають, тому опис без нумерації:
UINT nID – ідентифікатор вікна, використовується у випадку якщо вікно є дочірнім.
LPCTSTR lpszMenuName – ідентифікатор меню.
DWORD dwExStyle – розширені стилі вікна (наведені у табл. А.3).
CCreateContext* pContext – контекст вікна.
Функція CreateEx:
CWnd::CreateEx
BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU nIDorHMenu, LPVOID lpParam = NULL );
BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, LPVOID lpParam = NULL );
Отже функція Create більш підходить для створення незалежних (клієнтських) вікон, а CreateEx для дочірніх вкладених. Тому у наших прикладах будемо дочірні вікна створювати функцією CreateEx.
При роботі з вікнами часто також використовуються додаткові або розширені біти стилю. Розширені стилі вперше з’явились у Windows 95, тому для них виділено додаткове поле (dwExStyle) у структурі CREATESTRUCT. При написанні додатків важливо не плутати звичайні стилі з розширеними.
Структура CREATESTRUCT
В класі CWnd є віртуальна функція PreCreateWindow, яка викликається перед відкриттям вікна. Ця функція приймає один параметр – структуру CREATESTRUCT& cs, розглянемо змінні цієї структури:
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams;
HANDLE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy;
int cx;
int y;
int x;
LONG style;
LPCSTR lpszName;
LPCSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCT;
HANDLE hInstance – дескриптор модулю вікна.
HMENU hMenu – дескриптор меню вікна.
HWND hwndParent – дескриптор батьківського вікна, якщо вікно головне то передається 0.
int cx, cy – висота та ширина вікна.
int x, y – координати верхнього лівого кута нового вікна. Якщо нове вікно є дочірнім (має стиль WS_CHILD), координати задаються відносно батьківського вікна. Інакше, – відносно екрану.
LONG style – звичайні стилі, які згадувались у табл. А.2.
LPCSTR lpszName – заголовок вікна.
LPCSTR lpszClass – ім’я Windows класу створюваного вікна. З цим ім’ям пов’язується структура типу WNDCLASS.
DWORD dwExStyle – розширені стилі, які згадувались у табл. А.3.