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

Розділ 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.

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