Студопедия

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

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

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






Спільні елементи керування 1 страница






 

5.1 Загальна інформація про спільні елементи керування

Раніше згадувалося, що існують три типи елементів керування: стандартні, спільні та елементи керування ActiveX. Створення стандартних елементів керування розглядалося у розділі 3. Стандартні елементи керування суттєво поліпшують інтерфейс програм, розроблених для операційної системи Windows. Але стандартні елементи керування є лише початковим етапом розвитку програмних інтерфейсів. Їх подальший розвиток припав на появу операційної системи Windows’95, коли з’явилися спільні елементи керування. Ці нові елементи керування підтримуються MFC, починаючи з версії 4.0

Спільні елементи керування є розвитком стандартних елементів, вони додають нових, більш розширених можливостей, надають гнучкості програмі, роблять її більш привабливою з точки зору користувача. У таблиці 5.1 наведені спільні елементи керування відповідно Visual C++ 6.0.

 

Таблиця 5.1 – Спільні елементи керування

Назва елемента MFC клас Опис
вікно анімації CAnimateCtrl спеціальне вікно, призначене для відображення простих AVI файлів
заголовок CHeaderCtrl заголовок стовпчика таблиці
гаряча клавіша CHotKeyCtrl умовний елемент, призначений для підтримки заданих користувачем гарячих клавіш
список зображень CImageList список графічних зображень (використовується одночасно з іншими елементами керування)
список піктограм CListCtrl список піктограм та пов’язаних з ними текстових міток
індикатор CProgressCtrl візуальний індикатор, що показує ступінь виконання процесу
розширене поле редагування CRichEditCtrl поле вводу із розширеними можливостями редагування
регулятор CSliderCtrl візуальний елемент, що забезпечує регулювання ступеню виконання процесу
стрілка CSpinButtonCtrl елемент прокрутки з двома кнопками, доповнюється полем редагування
рядок стану CStatusBarCtrl вікно для відображення інформації про стан роботи програми
закладка CTabCtrl меню, організоване у вигляді закладок
панель інструментів CToolBarCtrl меню, організоване у вигляді кнопок із зображеннями
спливаюча підказка CToolTipCtrl невелике спливаюче вікно із текстом, що описує призначення елемента керування
дерево CTreeCtrl вікно, що відображає ієрархічний список елементів

 

Перелічені елементи керування називаються спільними (common controls), тому що використовуються багатьма програмними додатками операційної системи Windows. Можна із упевненістю сказати, що з багатьма з них ви користуєтесь.

Опис класів, відповідних спільним елементам керування та усіх функцій знаходиться у заголовочному файлі afxcmn.h. Таким чином усі програми зі спільними елементами керування містять таку директиву препроцесора:

 

#include < afxcmn.h>

 

Для ініціалізації загальних елементів керування також необхідно викликати API-функцію ініціалізації загальних елементів керування:

 

void InitCommonControls(VOID);


Звичайно, такий виклик здійснюється під час ініціалізації вікна програми, його можна зробити, наприклад у конструкторі головного вікна програми або у функції ініціалізації діалогового вікна. Більших складнощів для використання спільних елементів керування не виникає. Зазначимо лише, що у старих версіях Visual C++ додатково необхідно було підключати cпеціальну бібліотеку спільних елементів керування (comctl32. lib).

Усі спільні елементи керування є, за походженням, вікнами дочірнього типу, які наслідують властивості класу CWnd. Тому не випадково, що як буде видно надалі, усі спільні елементи керування можна створити функцією Create(). З іншого боку, при розміщенні ресурсів спільних елементів керування у шаблонах діалогових вікон, пов’язування із об’єктами відповідних класів відбувається так само, як і для стандартних елементів керування.

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

 

5.2.1 Порядок створення панелі інструментів

Серед спільних елементів керування, можливо, найбільш широко вико-ристовується панель інструментів. Панель інструментів є прямокутним дочірнім вікном, що містить одну чи більше кнопок з графічними зображеннями. Кнопки можуть займати декілька рядків у вікні програми. Коли користувач обирає кнопку панелі інструментів, програмі надсилається повідомлення. Як правило, кнопки панелі відповідають пунктам меню програми і, таким чином, забезпечують більш простий і візуально привабливий шлях вибору команд програми. На рисунку 5.1 зображено приклад панелі інструментів, взятої з програми Microsoft Word.

 

 

Рисунок 5.1 – Фрагмент панелі інструментів програми Microsoft Word

 

У MFC панель інструментів описується за допомогою класу CToolBarCtrl. CToolBarCtrl забезпечує функціональні можливості панелі інструментів. Вперше панелі інструментів (як і сам клас CToolBarCtrl) з’явилися з появою Windows’95 та Windows NT 3.51.

Об’єкти класу CToolBarCtrl містять декілька важливих структур даних: список зображень кнопок, їх текстових полів, список структур TBBUTTON, що об’єднує разом зображення, текстові поля, а також позицію, стан та ідентифікатор кнопки. При цьому кожна кнопка має індекс, відмінний від 0.

Для використання ПІ слід достримуватися такої послідовності дій:

1) оголосити об’єкт класу CToolBarCtrl у класі відповідного вікна;

2) створити графічне зображення панелі інструментів у редакторі ресурсів Visual C++;

3) за допомогою функції Create() зв’язати графічний ресурс панелі інструментів із відповідним об’єктом або пов’язати їх у спосіб, характерний для стандартних елементів керування діалогового вікна;

4) здійснити ініціалізацію структур TBBUTTON панелі інструментів та додати їх у панель за допомогою функції AddButtons();

5) додати зображення кнопок за допомогою функції AddBitmap();

6) за необхідністю організувати обробку повідомлень спливаючих підказок.

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

 

BOOL CToolBarCtrl:: Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

 

де dwStyle визначає стиль вікна панелі інструментів (зазначені у таблиці 5.2); rect – визначає розмір та положення панелі інструментів (має тип CRect); pParentWnd – покажчик на вікно-власник панелі інструментів; nID – іденти-фікатор панелі інструментів.

 

Таблиця 5.2 – Основні стилі визначення панелі інструментів

Стиль Коментар
WS_CHILD Стандартний стиль. Визначає, що ПІ є дочірнім вікном
WS_VISIBLE Стандартний стиль. Визначає видимість ПІ.
WS_BORDER Визначає наявність рамки вікна ПІ
CCS_TOP Розміщення ПІ у верхній частині вікна (за замовчуванням)
CCS_BOTTOM Розміщення ПІ у нижній частині вікна
CCS_ADJUSTABLE Положення ПІ може змінюватися користувачем
CCS_NODIVIDER Між ПІ та більківським вікном нема лінії-розподільника
CCS_NOHILITE ПІ не виділяється під час активації
CCS_NOMOVEY ПІ не може бути розтягнута по вертикалі
CCS_NOPARENTALIGN ПІ не може переміщуватися вгору чи вниз
CCS_NORESIZE Розміри ПІ не можуть бути змінені
TBSTYLE_TOOLTIPS ПІ використовуватиме спливаючі підказки
TBSTYLE_WRAPABLE Надто довга ПІ може автоматично переходити на новий рядок

 

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

 

5.2.2 Додавання кнопок у панель інструментів

Панель інструментів, створена функцією Create() не є ініціалізованою і не може використовуватися. Для застосування панелі інструментів тепер слід створити графічний ресурс панелі; ініціалізувати структури TBBUTTON, відповідні кнопкам; додати визначені кнопки у панель інструментів; додати зображення кнопок панелі інструментів.

Додавання кнопок у панель інструментів забезпечує функція AddButtons() із таким прототипом:

 

BOOL CToolBarCtrl:: AddButtons (int nNumButtons, LPTBBUTTON lpButtons);

 

її параметрами є: nNumButtons – кількість кнопок, що додається у панель; lpButtons – покажчик на масив типу TBBUTTON, який складається зі структур з інформацію про кнопки, які додаються у панель інструментів. Розмір масиву має співпадати з параметром nNumButtons.

Із кожною кнопкою пов’язується об’єкт структури TBBUTTON, яка містить інформацію про індекс зображення, ідентифікатор кнопки, стиль оформлення та початковий стан. Структура TBBUTTON має такий вигляд:

 

typedef struct _TBBUTTON {

int iBitmap; // індекс зображення кнопки (> 0) int idCommand; // ідентифікатор програми, відповідний натиску кнопки BYTE fsState; // початковий стан кнопки BYTE fsStyle; // стиль кнопки DWORD dwData; // параметр, що визначається користувачем int iString; // індекс рядка кнопки

} TBBUTTON;

 

Додатково до опису зазначимо:

- iBitmap є індексом зображення кнопки і відраховується від 0, значення NULL означає відсутність зображення;

- idCommand є ідентифікатором команди програми, позв'язаної з кнопкою; якщо кнопка натиснута – надсилається повідомлення WM_COMMAND, якщо кнопка має стиль TBSTYLE_SEP idCommand задається рівним 0;

- fsState визначає початковий стан кнопки, який може бути комбінацією таких значень, наведених у таблиці 5.3;

- fsStyle визначає стиль кнопки відповідно до таблиці 5.4.

 

Таблиця 5.3 – Визначення початкових станів кнопок

Значення константи Коментар
TBSTATE_CHECKED кнопка натиснута
TBSTATE_ENABLED кнопка активна й може бути натиснута
TBSTATE_HIDDEN кнопка є скритою та неактивною
TBSTATE_INDETERMINATE кнопка виділена сірим кольором і неактивна
TBSTATE_PRESSED кнопка натиснута
TBSTATE_WRAP усі наступні кнопки розташовуватимуться на наступному рядку

 

Таблиця 5.4 – Визначення стилів кнопок

Значення константи Коментар
TBSTYLE_BUTTON стандартна кнопка
TBSTYLE_CHECK кнопка із перемиканням станів (натиснуто – не натиснуто)
TBSTYLE_CHECKGROUP кнопка із перемиканням станів у групі
TBSTYLE_GROUP стандартна кнопка у групі
TBSTYLE_SEP кнопка-розподільник

 

5.2.3 Додавання зображень до кнопок панелі інструментів

Зображення кнопок панелі інструментів додаються за допомогою функції AddBitmap(). При цьому одна кнопка має повний розмір 24x22 пікселі, а графічне зображення кнопки – 16x15 пікселі. Зображення кнопок не зберігаються по-одинці, а містяться у єдиному файлі toolbar.bmp, що зберігає зображення усіх кнопок. Наприклад, шість кнопок мають розмір 16x6 = 96 пікселів.

Функції додавання кнопок мають такі прототипи:

 

int CToolBarCtrl:: AddBitmap(int nNumButtons, UINT nBitmapID);

int CToolBarCtrl:: AddBitmap(int nNumButtons, CBitmap* pBitmap);

 

У разі успішного виконання, обидві функції повертають індекс першого зображення. Параметрами функції є такі: nNumButtons – кількість кнопок у файлі зображень; nBitmapID – ідентифікатор ресурсу растрового зображення кнопок; pBitmap – покажчик на об’єкт типу CBitmap, що містить зображення кнопок.

5.2.4 Додаткові функції роботи з панелями інструментів

Після того, як панель інструментів ініціалізовано, її розмір встановлюється відповідно до розміру батьківського вікна. Але, якщо змінити розміри вікна, розмір панелі інструментів не зміниться. Цю проблему можна вирішити за допомогою функції AutoSize():

 

void CToolBarCtrl:: AutoSize();

 

Стан окремої кнопки ПІ встановлюється за допомогою функції PressButton():

BOOL CToolBarCtrl:: PressButton(int nID, BOOL bPress = TRUE);

 

де nID – номер кнопки, що необхідно натиснути або відпустити; bPress= TRUE означає натискування зазначеної кнопки, bPress=FALSE – її вивільнення.

Перевірка стану кнопки забезпечує функція CheckButton():

 

BOOL CheckButton(int nID, BOOL bCheck = TRUE);

 

де nID - номер кнопки, стан якої перевіряється; bCheck – стан, який перевіряється (може приймати значення TRUE або FALSE).

Для приховання кнопки можна використати функцію HideButton():

 

BOOL CToolBarCtrl:: HideButton(int nID, BOOL bHide = TRUE);

де nID – номер кнопки, що необхідно заховати, bHide – ознака, яка має значення TRUE, якщо кнопку необхідно приховати, FALSE – якщо показати.

Активація та деактивація кнопок реалізується функцією EnableButton():

 

BOOL CToolBarCtrl:: EnableButton(int nID, BOOL bEnable = TRUE);

 

де nID – номер кнопки, що необхідно активізувати (деактивізувати); bEnable має значення TRUE, якщо кнопку активізують; FALSE - якщо відключають.

 

5.2.5 Розробка програми із використанням панелі інструментів

Для роботи з панеллю інструментів необхідно дотримуватися такої послідовності дій:

1. У редакторі ресурсів створити зображення кнопок панелі інструментів, зафіксувати ідентифікатор (наприклад IDR_TOOLBAR1 – значення за замовчуванням);

2. У класі головного вікна програми оголосити об’єкт панелі інструментів:

сlass CMainWin:: public CFrameWnd

{ CToolBarCtrl m_TB; // об’єкт панелі інструментів

public: void OnSize(UINT How, int Width, int Height);

…………

void InitToolBar(); };

 

3. У тест програми додати директиву препроцесора для підключення спільних елементів керування:

#include < afxcmn.h>

 

4. Оголосити глобальним масив структур tbButton[3]:

 

TBBUTTON tbButton[2]; // масив панелі інструментів із трьох кнопок

 

5. Видозмінити конструктор класу головного вікна у такий вигляд:

 

CMainWin:: CMainWin()

{……..

InitCommonControls(); // ініціалізація спільних елементів керування

void InitToolBar(); // ініціалізація панелі інструментів

void OnShow(); // обробник показу панелі інструментів

void OnHide(); // обробник приховання панелі інструментів

}

6. У карту повідомлень додати макрокоманди:

ON_WM_PAINT()

ON_WM_SIZE()

ON_COMMAND(ID_SHOWTB, OnShow)

ON_COMMAND(ID_HIDETB, OnHide)

7. Описати обробник зміни розміру панелі інструментів:

void CMainWin:: OnSize(UINT How, int Width, int Height)

{m_TB.AutoSize(); }

8. Описати обробник відображення панелі інструментів:

void CMainWin:: OnShow()

{m_TB.ShowWindow(SW_RESTORE); }

9. Описати обробник приховання панелі інструментів:

void CMainWin:: OnShow()

{m_TB.ShowWindow(SW_HIDE); }

10. Описати функцію ініціалізації панелі інструментів:

 

void CMainWin:: InitToolBar()

{RECT r;

r.left=r.top=r.right=r.bottom=0;

m_TB.Create(WS_VISIBLE | WS_CHILD | WS_BORDER, r, this, IDR_TOOLBAR1);

tbButton[0].iBitmap=0;

tbButton[0].idCommand=ID_FIRST;

tbButton[0].fsState=TBSTATE_ENABLED;

tbButton[0].fsStyle=TBSTYLE_BUTTON;

tbButton[0].dwData=0;

tbButton[0].iString=0;

tbButton[1].iBitmap=1;

tbButton[1].idCommand=ID_SECOND;

tbButton[1].fsState=TBSTATE_ENABLED;

tbButton[1].fsStyle=TBSTYLE_CHECK;

tbButton[1].dwData=0;

tbButton[1].iString=0;

m_TB.AddButtons(2, tbButton); // додавання масиву кнопки у панель інструментів

m_TB.AddBitmap(2, IDR_TOOLBAR1); // додавання зображень

}

 

5.3 Створення спливаючих підказок панелей інструментів

 

Кожен користувач системи Windows напевно помічав, як під час наведення курсора миші на окремі елементи інтерфейсу з’являлися невеличкі ін-формаційні віконця, що містять текст із описом властивості елемента, на який наведено курсор. На рисунку 5.2 зображено приклади спливаючих підказок.

 

Рисунок 5.2 − Приклади відображення спливаючих підказок

 

Спливаючі підказки не є обов’язковими з технічної точки зору, але необхідними для реалізації сучасного інтерфейсу програми, для надання додаткової інформації для користувача. Якщо спливаючі підказки реалізовані у програмі і курсор миші знаходиться більше 0.5 секунди над елементом, для якого створено підказку, програмі надсилається повідомлення WM_NOTIFY. Це повідомлення обробляється макрокомандою ON_NOTIFY() та її різновидом ON_NOTIFY_RANGE(). Остання макрокоманда забезпечує обробку повідомлень від набору однотипних елементів керування, що як раз підходить для організації спливаючих підказок панелі інструментів. Макрокоманда ON_NOTIFY_RANGE() має такий прототип:

 

ON_NOTIFY_RANGE(wNotifyCode, id, idLast, OnTTipHandler)

 

де wNotifyCode – код повідомлення нотифікації, що для спливаючої підказки матиме вигляд TTN_NEEDTEXT; id – перший ідентифікатор у діапазоні ідентифікаторів; idLast – останній ідентифікатор діапазону; OnTTipHandler – ім’я обробника, що викликається у відповідь на повідомлення нотифікації.

Прототип обробника має вигляд:

 

void OnTTipHandler (UINT idNotUsed, NMHDR * Hdr, LRESULT * resultNotUsed);

 

де idNotUsed – ідентифікатор, пов’язаний з повідомленням WM_NOTIFY (ос-кільки не є унікальним – не використовується); Hdr – спеціальний параметр типу NMHDR, що містить інформацію про повідомлення нотифікації; resultNotUsed – також не використовується.

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

typedef struct tagNMHDR {

HWND hwndFrom; // дескриптор вікна, який надіслав повідомленняUINT idFrom; // ідентифікатор елемента, який надіслав повідомлення UINT code; // код нотифікації (зазначені у таблиці 5.5).} NMHDR;

Елемент типу NMHDR у свою чергу входить до структури TOOLTIPTEXT:

 

typedef struct { NMHDR hdr;

LPTSTR lpszText;

WCHAR szText[80];

HINSTANCE hinst;

UINT uflags;

} TOOLTIPTEXT, FAR *LPTOOLTIPTEXT;

 

Таблиця 5.5 – Визначення стилів кнопок панелі інструментів

Значення константи Коментар
NM_CLICK користувач натиснув ліву клавішу в межах елемента керування
NM_DBLCLK користувач двічі натиснув ліву клавішу в межах елемента керування
NM_KILLFOCUS елемент керування втратив фокус
NM_OUTOFMEMORY елемент керування не може завершити операцію за браком пам’яті
NM_RCLICK користувач натиснув праву клавішу в межах елемента керування
NM_RDBLCLK користувач двічі натиснув праву клавішу в межах елемента керування
NM_RETURN елемент керування – у фокусі і користувач натиснув Enter
NM_SETFOCUS елемент керування отримав фокус

 

Параметрами структури TOOLTIPTEXT є: hdr – спеціальна структура, яка дозволяє передати покажчик на структуру TOOLTIPTEXT як параметр повідомлення WM_NOTIFY; lpszText – покажчик на рядок, що містить текст підказки елемента керування; szText – буфер, який отримує текст підказки; hInst – дескриптор об’єкта, який містить рядок ресурсу, що використовується як під-казка; uflags – прапорець, що вказує спосіб інтерпретації параметра idFrom структури NMHDR.

Таким чином, якщо для панелі інструментів необхідно створити спливаючі підказки, у програму слід внести такі зміни:

1. Під час створення об’єкта панелі інструментів зазначити стиль TBSTYLE_TOOLTIPS підтримки спливаючих підказок:

 

m_TB.Create(WS_VISIBLE | WS_CHILD | TBSTYLE_TOOLTIPS, r, this, IDR_TOOLBAR1);

 

2. У черзі повідомлень головного вікна програми зазначити макрокоманду обробки повідомлень нотифікації для спливаючих підказок:

 

ON_NOTIFY_RANGE(TTN_NEEDTEXT, 0, IDR_TOOLBAR1, OnTTip)

 

3. У відповідному класі головного вікна спочатку оголосити прототип, а потім і реалізувати код обробника OnTTip(), який наведено у прикладі 5.1.

 

Приклад 5.1 – Обробник повідомлень спливаючих підказок

void CMainWin:: OnTTip(UINT idNotUsed, NMHDR *hdr, LRESULT *ResultNotUsed)

{switch(hdr-> idFrom)

{case ID_FIRST_EXIT:

((TOOLTIPTEXT *)hdr)-> lpszText=" Exit"; break;

case ID_SECOND_MESSAGE:

((TOOLTIPTEXT *)hdr)-> lpszText=" SECOND MESSAGE"; break;

}}

 

Увесь текст програми із використанням панелі інструментів наведений у прикладі 5.2, а результат виконання – на рисунку 5.3.

 

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

 

// main.h

class CMain: public CFrameWnd

{public: void OnFirst();

void OnTTip(UINT idNotUsed, NMHDR *hdr, LRESULT *ResultNotUsed);

void InitToolBar();

void OnExit();

CMain();

DECLARE_MESSAGE_MAP()

private: CToolBarCtrl m_TB;

};

 

class CApp: public CWinApp

{public: BOOL InitInstance(); };

// main.app

#include < afxwin.h>

#include < afxcmn.h>

#include " Main.h"

#include " resource.h"

 

CMain:: CMain()

{Create(NULL, " Example with toolbar", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1));

RECT a;

a.bottom=a.left=a.right=a.top=0;

InitCommonControls();

m_TB.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|CCS_TOP| TBSTYLE_TOOLTIPS, a, this, IDR_TOOLBAR1);

InitToolBar();

}

 

BEGIN_MESSAGE_MAP(CMain, CFrameWnd)

ON_COMMAND(ID_FILE_FIRST, OnFirst)

ON_COMMAND(ID_FILE_EXIT, OnExit)

ON_NOTIFY_RANGE(TTN_NEEDTEXT, 0, IDR_TOOLBAR1, OnTTip)

END_MESSAGE_MAP()

 

BOOL CApp:: InitInstance()

{m_pMainWnd = new CMain;

m_pMainWnd-> ShowWindow(m_nCmdShow);

m_pMainWnd-> UpdateWindow();

return TRUE; }

 

CApp App;

 

void CMain:: OnExit()

{int r=MessageBox(" You really want to Exit", " Exit",

MB_YESNO | MB_ICONEXCLAMATION);

if(r==IDYES)SendMessage(WM_CLOSE); }

void CMain:: InitToolBar()

{TBBUTTON tb[2];

tb[0].iBitmap=0;

tb[0].idCommand=ID_FILE_EXIT;

tb[0].fsState=TBSTATE_ENABLED;

tb[0].fsStyle=TBSTYLE_BUTTON;

tb[0].dwData=0;

tb[0].iString=0;

 

tb[1].iBitmap=1;

tb[1].idCommand=ID_FILE_FIRST;

tb[1].fsState=TBSTATE_ENABLED;

tb[1].fsStyle=TBSTYLE_BUTTON;

tb[1].dwData=0;

tb[1].iString=0;

m_TB.AddButtons(2, tb);

m_TB.AddBitmap(2, IDR_TOOLBAR1);

}

 

void CMain:: OnTTip(UINT idNotUsed, NMHDR *hdr, LRESULT *ResultNotUsed)

{ switch(hdr-> idFrom)

{case ID_FILE_EXIT: ((TOOLTIPTEXT*)hdr)-> lpszText=" Exit"; break;

case ID_FILE_FIRST: ((TOOLTIPTEXT*)hdr)-> lpszText=" First"; break;

}}

 

void CMain:: OnFirst() {MessageBox(" First item"); }

 

 

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

 

5.4 Елемент стрілка та робота з ним

Під час створення MFC-програм доволі часто необхідно встановлювати та змінювати поточні параметри. Якщо ці параметри мають цілий числовий тип, можна скористатися спеціальним спільним елементом керування, що має назву spin або стрілка. Його зовнішній вигляд демонструє рисунок 5.4.

Цей елемент власне, є смугою прокрутки, у якій вилучена сама смуга і залишені лише дві кнопки: «вгору» і «вниз». За допомогою цих кнопок користувач має змогу змінювати поточний стан стрілки і, таким чином, змінювати значення певного параметра програми. Стрілка має певний обмежений діапазон змін, що може визначатися програмно.

 

 

Рисунок 5.4 – Використання стрілки у програмі встановлення часу. Стрілка розташована праворуч. Текст «2004» міститься у приятельському вікні стрілки

 

Стрілка може використовуватися із додатковим елементом відображення інформації про її стан – спеціальним приятельським вікном. Саме воно відображує поточне положення стрілки.

У MFC стрілка подається за допомогою класу CSpinButtonCtrl. Зазвичай оголошення об’єкта розташовується в межах класу відповідного вікна, наприклад діалогового вікна, як це наведено у прикладі 5.3.

 

 

Приклад 5.3 – Оголошення класу зі стрілкою

class CSDialog: public CDialog

{public: void OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB);

BOOL OnInitDialog();

CSDialog(UINT id, CWnd *Owner): CDialog(id, Owner){}

DECLARE_MESSAGE_MAP()

private: CEdit *edd2;

CSpinButtonCtrl m_Spin; // оголошення стрілки

};

 

Окрім оголошення, стрілку необхідно фізично створити. Для цього, як і раніше, використовується функція CSpinButtonCtrl:: Create():

 

BOOL CSpinButtonCtrl:: Create(DWORD dwStyle, RECT& rect, CWnd* pParentWnd, UINT nID);

 

де параметр dwStyle визначає стиль стрілки, rect – її положення та розмір, pParentWnd є покажчиком на батьківське вікно, nID – ідентифікатор.

Найбільш різнобічним є визначення стилю. Окрім стандартних стилів WS_CHILD, WS_VISIBLE, WS_BORDER визначаються додаткові (таблиця 5.6).

 

Таблиця 5.6 – Визначення стилів кнопок

Значення константи Коментар
UDS_ALIGNLEFT розташування стрілки ліворуч приятельського вікна
UDS_ALIGNRIGHT розташування стрілки праворуч приятельського вікна
UDS_WRAP зациклювання стрілок в межах визначеного діапазону
UDS_ARROWKEYS можливість використання клавіатури для зміни значень

Приятельським вікном виступає поле редагування. У такому полі користувач може записати необхідне значення. Підключення приятельського вікна здійснюється функцією SetBuddy() (англійською “Buddy” є приятель):

 

CWnd* CSpinButtonCtrl:: SetBuddy(CWnd* pWndBuddy);

 

де pWndBuddy є покажчиком на приятельське вікно. Функція повертає покажчик на можливого попереднього «приятеля».

Клас CSpinButtonCtrl також має й ряд інших необхідних функцій. Зміна діапазону значень стрілки може здійснюватися за допомогою функції SetRange() класу CSpinButtonCtrl:

 

void CSpinButtonCtrl:: SetRange(int nLower, int nUpper);

 

де nLower, та nUpper – нижня та верхня межі діапазону стрілки, відповідно. За замовчуванням стрілка має діапазон значень від 0 до 100. Ніщо не заперечує проти встановлення негативних значень діапазону.






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