Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Використання вікон властивостей та майстрів






 

6.1 Вікна та сторінки властивостей

 

Вікно властивостей є спеціальним типом діалогового вікна, що використовується для встановлення та змінення параметрів певного програмного об’єкта, програми вцілому, або, навіть, усієї операційної системи. Найбільш характерним прикладом вікна властивостей є вікно встановлення властивостей відеопідсистеми комп’ютера. Доступ у програму Display Properties (вигляд сторінки програми зображений на рисунку 6.1), зазвичай, здійснюється натисканням правої клавіші миші на робочому столі (Desktop) персонального комп’ютера операційної системи Windows.

 

Рисунок 6.1 – Вигляд інтерфейсу програми встановлення параметрів

відеосистеми операційної системи Windows

 

Вікно властивостей складається з трьох основних частин: діалогового вікна, яке вміщує інші елементи; однієї або більше сторінок властивостей, що відображаються окремо; елемента табуляції вгорі вікна, яке забезпечує доступ до кожної зі сторінок у вікні властивостей.

У MFC вікно властивостей описується класом CPropertySheet, який породжується з CWnd, проте має багато властивостей, подібних до діалогових вікон (наприклад активація за допомогою функції DoModal()). Кожна зі складових вікна властивостей є сторінкою властивостей і подається за допомогою класу CРropertyPage. Сам клас CPropertyPage походить з класу CDialog.

Вікно властивостей може містити декілька кнопок, найчастіше – кнопки “OK” та “Cancel”, також “Apply”. Зауважимо, що жодна сторінка властивостей не містить ці кнопки, які є частиною самого вікна властивостей. Усі діалогові вікна сторінок властивостей мають відображатися у одному вікні властивостей. Об’єкт класу CPropertyPage, пов’язаний з кожною сторінкою, не має закривати своє діалогове вікно, тобто має не викликати такі функції, як EndDialog() або DestroyWindow(). Замість виклику зі сторінок, подібні функції мають виконуватися об’єктом класу вікна властивостей – CPropertySheet.

Підтримка вікон та сторінок властивостей забезпечується підключенням заголовкового файла “afxdlgs.h”.

Створення вікна властивостей має відповідати такій послідовності:

1) у класі головного вікна програми оголосити об’єкт типу CPropertySheet;

2) додати у вікно властивостей об’єкти окремих сторінок (типу CPropertyPage), маючи на увазі, що кожен об’єкт – окрема сторінка вікна властивостей.

У більшості програм, які містять вікна властивостей, об’єкти типів CPropertySheet та CPropertyPage не використовуються. Замість того, вся робота ведеться за допомогою класів, що є їх нащадками. Більш того, для кожної сторінки необхідно створювати окремий клас, який описуватиме її властивості. Під час створення об’єкта вікна властивостей автоматично створюються і об’єкти його окремих сторінок.

Створення сторінок вікна властивостей також має певну послідовність. При цьому враховується походження класу CPropertyPage – від класу CDialog. Саме тому клас CPropertyPage має три конструктори:

 

CPropertyPage();

CPropertyPage(UINT nIDTemplate, UINT nIDCaption = 0);

CPropertyPage(LPCTSTR lpszTemplateName, UINT nIDCaption = 0);

 

де nIDTemplate та lpszTemplateName – ідентифікатор та ім’я шаблону діалогового вікна, відповідно, nIDCaption – ідентифікатор рядка, що є ім’ям закладки сторінки (якщо має значення 0 – використовується ім’я діалогового вікна).

Якщо використовується перший з конструкторів – який не має параметрів, додатково викликається функція Construct():

 

void CPropertyPage:: Construct(UINT nIDTemplate, UINT nIDCaption = 0);

void CPropertyPage:: Construct(LPCTSTR lpszTemplateName, UINT nIDCaption = 0);

 

де параметри мають зміст, аналогічний конструкторам, наведеним вище.

Робота з об’єктами класу CPropertyPage побудована у такий же спосіб, що і з об’єктами класу CDialog.

Як вже зазначувалося, створення окремих сторінок властивостей передує створенню загального вікна властивостей. В принципі, конструктори створення вікна властивостей є подібними:

 

CPropertySheet();

CPropertySheet(UINT nIDCaption, CWnd *pParentWnd = NULL, UINT iSelectPage=0);

CPropertySheet(LPCTSTR pszCaption, CWnd *pParentWnd=NULL, UINT iSelectPage=0);

 

де nIDCaption – ім’я ресурсу рядка заголовка вікна властивостей; pParentWnd – покажчик на батьківське вікно (за замовчуванням воно є відсутнім); iSelectPage – індекс сторінки, що обирається під час активації (0 – номер початкової).

Як і у випадку сторінки властивостей, використання конструктора за замовчуванням (без параметрів) додатково вимагатиме використання функції Construct() з аналогічними параметрами.

Для додавання сторінок у вікно властивостей використовують функцію AddPage():

 

void CPropertySheet:: AddPage(CPropertyPage *pPage);

 

де pPage – покажчик на об’єкт класу CPropertyPage або класу користувача, що наслідуваний від нього. Зазначимо, що додавання сторінок відбувається у порядку зліва – направо.

Активація вікна властивостей відбувається за допомогою функції DoModal(), яка повертає значення IDOK або IDCANCEL:

 

int CPropertySheet:: DoModal();

 

Для активації немодальних вікон властивостей (хоча такі використовують рідко) використовують функцію CPropertySheet:: Create().

За замовчуванням, у вікні властивостей активними є тільки кнопки “OK” та “Cancel”, активація кнопки “Apply” здійснюється додатково:

 

void CPropertyPage:: SetModified(BOOL bChanged = TRUE);

 

причому значення TRUE параметра bChanged означає, що певні дані, які містяться на сторінці були змінені і програма вимагає збереження їх показників.

Таким чином для створення та активації вікна властивостей визначимо таку послідовність:

1) у редакторі ресурсів визначити шаблони діалогових вікон для окремих сторінок вікна властивостей;

2) визначити класи сторінок властивостей, породжені від CPropertyPage;

3) визначити клас вікна властивостей, породжений від CPropertySheet із об’єктами-членами класів сторінок властивостей;

4) створити об’єкт класу вікна властивостей;

5) активізувати вікно властивостей за допомогою функції DoModal().

Обробка повідомлень, що надходять від сторінок властивостей відбувається аналогічно до діалогових вікон. Під час створення сторінки надсилається повідомлення WM_INITDIALOG і виконується функція OnInitDialog().

Використовуються також інші вбудовані обробники класу CPropertyPage:

OnApply() – для обробки натискання кнопки “Apply”, OnCancel() – для обробки натискання кнопки “Cancel”, OnKillActive() – для обробки втрати фокуса, OnOK() – для обробки натиску кнопки “OK”, OnReset() – аналогічно натискання “Cancel” OnSetActive() – обробка отримання фокуса.

Розглянувши основні властивості вікна та сторінок властивостей перейдемо до розгляду побудови програми, яка втілює розглянуті методи.

Порядок розробки програми визначимо у такий спосіб:

1) створити новий проект типу “Win32 Application” (опція “Empty project”);

2) у редакторі ресурсів Visual C++ створити шаблони ресурсів окремих сторінок властивостей – у спосіб, аналогічний визначенню шаблонів діалогових вікон (слід зазначити, що у цьому випадку розмір вікна властивостей визначатиметься розміром найбільшої сторінки);

3) оголосити класи сторінок властивостей, клас вікна властивостей та додати сторінки як об’єкти класу вікна властивостей, наприклад у спосіб, наведений нижче:

 

class CPropDialog1: public CPropertyPage

{public: CPropDialog1();

DECLARE_MESSAGE_MAP() };

 

class CPropDialog2: public CPropertyPage

{public: CPropDialog2();

DECLARE_MESSAGE_MAP() };

 

class CSamplePropSheet: public CPropertySheet

{public: CSamplePropSheet();

private: CPropDialog1 page1;

CPropDialog2 page2;

};

4) у функції InitInstance() класу CApp реалізуйте виклик вікна властивостей:

BOOL CApp:: InitInstance()

{CSamplePropSheet m_PropSheet;

m_PropSheet.DoModal();

return TRUE;

}

5) реалізувати конструктор вікна властивостей у такий вигляд:

 

CSamplePropSheet:: CSamplePropSheet()

{ Construct(" Приклад об’єкта вікна властивостей", this);

page1.Construct(IDD_DIALOG1, 0); // шаблон першої сторінки

page2.Construct(IDD_DIALOG2, 0); // шаблон другої сторінки

AddPage(& page1); // додавання першої сторінки

AddPage(& page2); } // додавання другої сторінки

 

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

 

Рисунок 6.2 – Вигляд програми із вікном та сторінками властивостей

 

Повний текст програми наведено у прикладі 6.1.

 

Приклад 6.1 – Текст програми із вікном та сторінками властивостей

 

class CApp: public CWinApp

{public: BOOL InitInstance(); };

 

class CPropDialog1: public CPropertyPage

{public: CPropDialog1();

DECLARE_MESSAGE_MAP() };

 

class CPropDialog2: public CPropertyPage

{public: CPropDialog2();

DECLARE_MESSAGE_MAP() };

 

class CSamplePropSheet: public CPropertySheet

{public: CSamplePropSheet();

private: CPropDialog1 page1;

CPropDialog2 page2;

};

 

#include < afxwin.h>

#include < afxdlgs.h>

#include " App.h"

#include " resource.h"

 

BOOL CApp:: InitInstance()

{CSamplePropSheet m_PropSheet;

m_PropSheet.DoModal();

return TRUE; }

 

CApp App;

 

CPropDialog1:: CPropDialog1(){}

CPropDialog2:: CPropDialog2(){}

 

BEGIN_MESSAGE_MAP(CPropDialog1, CPropertyPage)

ON_WM_HSCROLL()

END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CPropDialog2, CPropertyPage)

END_MESSAGE_MAP()

 

CSamplePropSheet:: CSamplePropSheet()

{ Construct(" Приклад об’єкта вікна властивостей ", this);

page1.Construct(IDD_DIALOG1, 0);

page2.Construct(IDD_DIALOG2, 0);

AddPage(& page1);

AddPage(& page2);

}

 

6.2 Особливості реалізації майстрів

 

Майстер (“wizard” – у прямому перекладі означає “чарівник”, слово “майстер” виглядає дещо скромніше) є послідовним набором діалогових вікон і звичайно призначається для демонстрації певної послідовності дій користувача з можливостями вибору. На відміну від стандартних вікон властивостей, майстри не мають сторінок-закладок. Замість цього, в них використовуються кнопки, за допомогою яких користувач переміщується від однієї сторінки до іншої. До стандартних кнопок належать “Back” та “Next”. На останньому етапі кнопка “Next” замінюється на “Finish”. Крім того, у вікні завжди присутня кнопка “Cancel”, за допомогою якої можна завжди перервати роботу майстра. Найчастіше майстри використовуються в інсталяційних програмах і надають можливості вибору опцій проекту.

Майстер визначається подібно до вікна властивостей і так само подається за допомогою об’єктів класу CPropertySheet.

Для побудови майстра спочатку визначаються об’єкти сторінок, що містяться в ньому, потім сторінки додаються у вікно властивостей.

У короткому вигляді створення майстра визначається послідовністю:

1) визначити режим майстра;

2) визначити спеціальні кнопки майстра, що з’являтимуться під час відображення кожної сторінки майстра;

3) за необхідності перевизначити функції: OnWizardFilish(), OnWizardNext(), OnWizardBack(), що належать до класу CPropertyPage;

4) за необхідності додати графічні зображення до сторінок.

Тепер прокоментуємо зазначену послідовність.

Встановлення режиму майстра дещо видозмінює послідовність відображення вікна властивостей: перед викликом функції DoModal() викликають функцію SetWizardMode() класу CPropertySheet.

Визначення набору кнопок “Back”, “Next”, “Finish”, властивих майстру, здійснюється програмно. При цьому враховується, що на першій сторінці майстра нема кнопки “Back”, на останній сторінці – активними є лише кнопки “Back” та “Finish”, на проміжних відсутня кнопка “Finish”.

Визначення кнопок сторінки забезпечується функцією SetWizardButtons():

 

void CPropertySheet:: SetWizardButtons(DWORD dwFlags);

 

де параметр dwFlags визначає, яка кнопка має бути відображена. Значення кодів параметра наведено у таблиці 6.1.

Таблиця 6.1 – Коди функцій визначення кнопок майстра

Значення коду Коментар
PSWIZB_BACK кнопка “Back” є активною
PSWIZB_NEXT кнопка “Next” є активною
PSWIZB_FINISH кнопка “Finish” є активною
PSWIZB_DISABLEDFINISH кнопка “Finish” – неактивна

 

Декілька кнопок майстра можуть бути об’єднані простим поєднанням кодів стилю. Наприклад:

 

m_PropSheet.SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);

 

Стандартними повідомленнями, що обробляються у майстрі, є пові-домлення, відповідні натискання клавіш “Back”, “Next” та “Finish”. Цим кнопкам відповідають функції класу CPropertyPage:

 

void CPropertyPage:: OnWizardBack();

void CPropertyPage:: OnWizardNext();

void CPropertyPage:: OnWizardFinish();

 

Ці обробники можуть перевизначатися так само, як і кнопки “OK” та “Cancel” звичайного діалогового вікна.

Якщо сторінка викликається користувачем і стає активною, викликається функція OnSetActive():

 

BOOL CPropertyPage:: OnSetActive();

 

Зображення, які мають бути присутні на сторінках майстра, що реалізується у головному вікні програми, за потребою задаються у класі відповідної сторінки майстра та відображуються за допомогою обробки повідомлення WM_PAINT. Для діалогових вікон можна визначити і менш складний спосіб.

Наступна програма демонструє можливість побудови майстра. Власне, нас цікавитиме лише послідовність відображення його сторінок. Кожна зі сторінок міститиме власну інформацію – зображення або інший елемент керування. Опишемо послідовність побудови програми у декілька кроків:

1) створити проект типу “Win32 Application” (опція “Empty project”);

2) оголосити клас прикладки CApp з функцією ініціалізації InitInstance();

3) оголосити клас вікна властивостей CSamplePropSheet та класи трьох сторінок CPropDialog1, CPropDialog2, CPropDialog3 (усі імена є умовними і наводяться як приклад), причому оголошення класів сторінок має передувати оголошенню класу вікна властивостей, бо останній містить вказані сторінки як об’єкти-члени;

4) у класі кожної сторінки оголосити функцію OnSetActive(), яка визначатиме, які кнопки мають бути активними під час активації сторінки;

5) реалізувати функцію InitInstance() у такий спосіб:

 

BOOL CApp:: InitInstance()

{CSamplePropSheet m_PropSheet; // об’єкт вікна властивостей

m_PropSheet.SetWizardMode(); // встановлення режиму майстра

m_PropSheet.DoModal(); // активація вікна властивостей

return TRUE; }

 

Слід зазначити, що саме виклик функції SetWizardMode() визначає режим майстра. Пропущення такого виклику перетворює майстер у звичайне вікно властивостей зі сторінками властивостей.

6) конструктор вікна властивостей майстра реалізувати у спосіб, аналогічний прикладу 6.1;

7) для кожного з вікон властивостей у функції OnSetActive() визначити, яка комбінація клавіш має характеризувати сторінку майстра (клавіші “Next”, “Back”, “Finish;

8) для кожного з шаблонів ресурсів кожної сторінки майстра визначити склад елементів керування, наприклад можна включити растрове зображення, скопійоване з стандартного графічного редактора Paint.

Повний текст створеної програми із майстром наведений у прикладі 6.2, а вигляд третьої сторінки – на рисунку 6.3. Натискання клавіші “Cancel” викликатиме стандартний обробник OnCancel(), таким чином усі проблеми, пов’язані з його обробкою, вирішуються автоматично.

 

Рисунок 6.3 – Вигляд вікна програми із майстром (остання сторінка)

 

Приклад 6.2 – Текст програми із використанням майстра

 

// файл App.h

 

class CApp: public CWinApp

{public: BOOL InitInstance(); };

 

class CPropDialog1: public CPropertyPage

{public: BOOL OnSetActive();

CPropDialog1(); };

 

class CPropDialog2: public CPropertyPage

{public: BOOL OnSetActive();

CPropDialog2(); };

 

class CPropDialog3: public CPropertyPage

{public: BOOL OnSetActive();

CPropDialog3(); };

 

class CSamplePropSheet: public CPropertySheet

{public: CSamplePropSheet();

private: CPropDialog1 page1;

CPropDialog2 page2;

CPropDialog3 page3; };

 

// файл App.h

#include < afxwin.h>

#include < afxdlgs.h>

#include " App.h"

#include " resource.h"

 

BOOL CApp:: InitInstance()

{CSamplePropSheet m_PropSheet;

m_PropSheet.SetWizardMode();

m_PropSheet.DoModal();

return TRUE; }

 

CApp App;

 

CPropDialog1:: CPropDialog1(){}

CPropDialog2:: CPropDialog2(){}

CPropDialog3:: CPropDialog3(){}

 

CSamplePropSheet:: CSamplePropSheet()

{ Construct(" Приклад програми", this);

page1.Construct(IDD_DIALOG1, 0);

page2.Construct(IDD_DIALOG2, 0);

page3.Construct(IDD_DIALOG3, 0);

AddPage(& page1);

AddPage(& page2);

AddPage(& page3); }

 

BOOL CPropDialog1:: OnSetActive()

{ CPropertySheet* psheet = (CPropertySheet*) GetParent();

psheet-> SetWizardButtons(PSWIZB_NEXT);

return CPropertyPage:: OnSetActive(); }

 

BOOL CPropDialog2:: OnSetActive()

{ CPropertySheet* psheet = (CPropertySheet*) GetParent();

psheet-> SetWizardButtons(PSWIZB_NEXT|PSWIZB_BACK);

return CPropertyPage:: OnSetActive(); }

 

BOOL CPropDialog3:: OnSetActive()

{ CPropertySheet* psheet = (CPropertySheet*) GetParent();

psheet-> SetWizardButtons(PSWIZB_FINISH|PSWIZB_BACK);

return CPropertyPage:: OnSetActive(); }

 

6.3 Контрольні завдання

 

1. Пояснити особливості конструкторів вікна та сторінки властивостей.

2. Пояснити особливості реалізації програм із використанням майстрів.

3. Створити вікно властивостей для керування станом властивостей дисплею вашого комп’ютера подібну сервісній компонентів Display Properties.

4. Створити майстер, що забезпечує підготовку до копіювання даних з одного обраного каталогу вашого комп’ютера у інший.

 







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.