Студопедия

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

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

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






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






 

BOOL CAnimateCtrl:: Seek(UINT nTo);

 

де nTo – номер кадру пошуку (0 – перший, 65536 – останній, -1 – також останній).

 

г) функція зупинки Stop() має простий запис: BOOL CAnimateCtrl:: Stop();

Зазвичай об’єкт вікна анімації оголошується у класі відповідного вікна, наприклад:

 

СAnimateCtrl film;

 

Створення порожнього вікна анімації може здійснюватися, наприклад у конструкторі головного вікна програми:

 

CMainWin:: CMainWin()

{Create(NULL, " Avi", WS_OVERLAPPEDWINDOW, rectDefault, NULL,

MAKEINTRESOURCE(IDR_MENU1));

film.Create(WS_CHILD | WS_VISIBLE | ACS_TRANSPARENT | ACS_CENTER,

CRect(0, 0, 350, 200), this, 1);

}

 

Відкриття відеокліпу вимагатиме діалогу відкриття файлів. Його можна реалізувати за допомогою стандартних діалогових форм, як наведено в обробнику OnOpen():

 

void CMainWin:: OnOpen()

{static char BASED_CODE szFilter[] = " Video Files (*.avi)|*.avi||"; // фільтр відкриття

CFileDialog a(TRUE, " *.avi", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, NULL);

a.DoModal(); // Активація діалогу відкриття файлів

if(a.GetFileName())film.Open(a.GetFileName()); // Програвання завантаженого кліпу

}

 

Зазначимо, що виклик стандартних діалогів підтримується заголовковим файлом afxdlgs.h. Повний текст програми наведений у прикладі 5.7.

 

Приклад 5.7 – Використання елемента анімації

 

// avi1.h: interface for the CMainWin class.

 

class CMainWin: public CFrameWnd

{public: void OnStop();

void OnPlay();

void OnOpen();

CMainWin();

DECLARE_MESSAGE_MAP()

private: CAnimateCtrl film; };

 

class CApp: public CWinApp

{public: BOOL InitInstance(); };

 

// avi1.cpp: implementation of the CMainWin class.

 

#include < afxwin.h>

#include < afxcmn.h>

#include < afxdlgs.h>

#include " resource.h"

#include " avi1.h"

 

CMainWin:: CMainWin()

{Create(NULL, " Avi", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1));

film.Create(WS_CHILD|WS_VISIBLE|ACS_TRANSPARENT| ACS_CENTER, CRect(0, 0, 350, 200), this, 1);

}

 

BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)

ON_COMMAND(ID_FILE_OP, OnOpen)

ON_COMMAND(ID_VIDEO_PLAY, OnPlay)

ON_COMMAND(ID_VIDEO_STOP, OnStop)

END_MESSAGE_MAP()

 

BOOL CApp:: InitInstance()

{m_pMainWnd = new CMainWin;

m_pMainWnd -> ShowWindow(m_nCmdShow);

m_pMainWnd -> UpdateWindow();

return TRUE; }

 

CApp App;

 

void CMainWin:: OnOpen()

{static char BASED_CODE szFilter[] = " Video Files (*.avi)|*.avi||";

CFileDialog a(TRUE, " *.avi", NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT, szFilter, NULL);

a.DoModal();

if(a.GetFileName())film.Open(a.GetFileName());

}

 

void CMainWin:: OnPlay() {film.Play(0, -1, -1); }

void CMainWin:: OnStop() {film.Stop(); }

 

Діючий фрагмент відеокліпу у вікні програми зображено на рисунку 5.10. Завантаження файла та його запуск здійснюється з меню “Video” програми.

 

 

Рисунок 5.10 – Вигляд програми із елементом анімації

 

5.9 Списки зображень та їх використання

 

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

Списки зображень (Image List) формуються у вигляду масивів растрових зображень [2, 3]. Формування списків потребує однакового розміру кожного з складових зображень. Після завершення формування списку звернення до елемента списку здійснюється за індексом, відлік якого починається з нуля.

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

У список зображень може входити маска монохромного растра, що використовується для створення прозорих зображень. API-функції підсистеми Win32 надають можливість виконувати відображення, замінення, злиття, введення, вилучення та переміщення зображень, створення та вилучення списків зображень. Ці функціональні можливості використовуються іншими елементами керування, що використовують масиви зображень. У MFC списки зображень забезпечуються за допомогою класу CImageList.

Клас CImageList містить ряд функцій, що забезпечують маніпулювання зображеннями, які містяться у списку. Для роботи зі списком зображень слід використовувати таку послідовність:

1) створити об’єкт типу CImageList;

2) використовуючи функцію Create(), визначити основні параметри списку;

3) додати у список зображення;

4) забезпечити інші необхідні операції зі списком зображень.

Функція Create() має декілька прототипів:

 

BOOL CImageList:: Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow);

BOOL CImageList:: Create(UINT nBitmapID, int cx, int nGrow, COLORREF crMask);

BOOL CImageList:: Create(LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREF crMask);

BOOL CImageList:: Create(CImageList& imagelist1, int nImage1, CImageList& imagelist2, int nImage2, int dx, int dy);

BOOL CImageList:: Create(CImageList* pImageList);

 

де cx та cy – горизонтальний та вертикальний розміри зображення у пікселях; nFlags – тип створюваного списку зображень (наведений у таблиці 5.8); nInitial – початкова кількість зображень у списку; nGrow – максимальний розмір списку; nBitmapID – ідентифікатори ресурсів, пов’язуваних зі списком; crMask – колір, що використовується для формування маски; lpszBitmapID – рядок із ідентифікаторами усіх ресурсів зображень; imagelist1 – покажчик на інший об’єкт типу CImageList; nImage1 – кількість зображень, що містяться у списку imagelist1; imagelist2 - покажчик на інший об’єкт типу CImageList; nImage2 - кількість зображень, що містяться у списку imagelist2; dx – відхилення осі x другого зображення відносно першого; dy - відхилення осі y другого зображення відносно першого; pImageList – покажчик на об’єкт типу CImageList.

 

Таблиця 5.8 – Значення параметра nFlags списку зображень

Значення константи Коментар
ILC_COLOR Використання параметрів за замовчуванням (звичайно ILC_COLOR4)
ILC_COLOR4 Використання 4-бітних (16 кольорів) зображень
ILC_COLOR8 Використання 8-бітних зображень
ILC_COLOR16 Використання 16-бітних зображень
ILC_COLOR24 Використання 24-бітних зображень
ILC_COLOR32 Використання 32-бітних зображень
ILC_COLORDDB Використання DDB зображень
ILC_MASK Використання маски. Список містить 2 зображення, з яких одне – монохромне, що і є маскою,

 

Додавання зображень у список здійснюється функцією Add():

 

int CImageList:: Add(CBitmap* pbmImage, CBitmap* pbmMask);

int CImageList:: Add(CBitmap* pbmImage, COLORREF crMask);

int CImageList:: Add(HICON hIcon);

 

де pbmImage – покажчик на бітове зображення або список зображень, pbmMask – покажчик на покажчик на бітове зображення, що містить маску, hIcon – дес-криптор піктограми, що містить маску і бітове зображення. Функція повертає індекс першого зображення, а якщо список не сформовано – повертає -1.

Формування списку наведено у прикладі 5.8.

 

Приклад 5.8 – Формування списку зображень

 

CImageList m_smallImageList;

// розмір зображень списку 16x16 пікселів, тип кольору 4-біти, розмір списку 1-2

m_smallImageList.Create(16, 16, ILC_COLOR4, 1, 2);

HICON hIcon = LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON2));

m_smallImageList.Add(hIcon);

hIcon = LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1));

m_largeImageList.Add(hIcon);

 

Сформований у такий спосіб список може використовуватися у інших спільних елементах керування (використовуваний у прикладах 5.10, 5.13).

Інші функції класу забезпечують його функціональність: GetImageCount() – повертає кількість зображень у списку, GetImageInfo() – повертає інформацію про зображення, Remove() – вилучає зображення зі списку.

 

5.10 Використання вікон перегляду дерев

 

5.10.1 Загальні відомості про вікна перегляду дерев

Вікно перегляду дерев (tree view control window) є спеціальним елементом, що відображає ієрархічний список елементів, наприклад, заголовків документів, індексних посилань або файлів та каталогів комп’ютера. Кожен елемент може містити текстову позначку або піктограму. Також елемент деревоподібної структури може містити посилання на список елементів, для яких він є батьком або коренем. Обираючи такий елемент та розкриваючи його, можна отримати доступ до усіх елементів ієрархічної структури.

Найбільш популярним прикладом застосування вікон перегляду дерев є програма Window Explorer (рисунок 5.11а), також вони використовуються у самому Visual C++ для відображення класів і функцій проектів(рисунок 5.11б).

 

а) б)

Рисунок 5.11 – Використання вікон перегляду дерев.

а – у програмі Windows Explorer; б – у Visual C++ 6.0

Для роботи з вікнами перегляду дерев MFC забезпечується двома класами: CTreeCtrl та СTreeView. Кожен з них відповідає різним випадкам застосування.

CTreeCtrl забезпечує загальний випадок застосування спільних елементів керування, наприклад як допоміжне вікно програми у сукупності з іншими спільними елементами керування. СTreeView є частиною концепції “Документ – область перегляду” та створювався для підтримки цієї програмної архітектури. СTreeView займає всю площину клієнтської області вікна.

Далі розглядаються особливості використання класу CTreeCtrl.

 

5.10.2 Створення вікон перегляду дерев

Створення об’єкта вікна перегляду дерева (далі просто – об’єкта дерева) відрізняється у випадку їх використання як елемента головного вікна програми та як елемента діалогового вікна.

Для створення об’єкта дерева у головному вікні необхідно спочатку здійснити два кроки:

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

2) застосувати функцію Create() для фізичного створення вікна дерева.

Для створення об’єкта дерева у діалоговому вікні початкова послідовність змінюється:

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

2) оголосити об’єкт класу CTreeCtrl у класі діалогового вікна;

3) у функції OnInitDialog() зв’язати об’єкт дерева та відповідний йому ресурс.

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

 

BOOL CTreeCtrl:: Create(DWORD dwStyle, const RECT& rect,

CWnd* pParentWnd, UINT nID);

 

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

Серед стилів вікна використовуються три стандартних: WS_CHILD, WS_VISIBLE, WS_BORDER, а також власні стилі вікна перегляду дерев, які вказуються у таблиці 5.9.

 

Таблиця 5.9 – Визначення стилів вікна перегляду дерев

Значення константи Коментар
TVS_HASLINES використання ліній, що з’єднують батьківські вузли дерева з дочірніми вузлами
TVS_LINESATROOT використання ліній, що з’єднують корінь дерева з дочірніми вузлами
TVS_HASBUTTONS використання клавіш “+” “− ” для позначення закритих та відкритих гілок дерева
TVS_EDITLABELS можливість редагування текстових позначок вузлів
TVS_SHOWSELALWAYS виділення обраного вузла дерева, навіть за втрати деревом фокусу
TVS_DISABLEDRAGDROP відключення можливості пересунення елементів за допомогою миші

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

 

5.10.3 Визначення вузлів дерева та додавання їх у дерево

Після використання функції Create() дерево залишається порожнім. І справді жоден елемент дерева ще не визначався.

Вузли дерева додаються за допомогою функції InsertItem():

 

HTREEITEM CTreeCtrl:: InsertItem(LPTVINSERTSTRUCT lpInsertStruct);

HTREEITEM CTreeCtrl:: InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage,

int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam,

HTREEITEM hParent, HTREEITEM hInsertAfter);

HTREEITEM CTreeCtrl:: InsertItem (LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);

HTREEITEM CTreeCtrl:: InsertItem (LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent=TVI_ROOT, HTREEITEM hInsertAfter=TVI_LAST);

 

InsertItem() має декілька прототипів. Як видно, перший з них використовує покажчик на структуру TVINSERTSTRUCT. Другий, насправді, потребує заповнення усіх параметрів елемента TV_ITEM цієї структури, інші ж – використовують окремі його параметри. Таким чином, без розгляду структур нам ніяк не обійтись.

Структура TV_INSERTSTRUCT визначається у такий спосіб:

 

typedef struct _TV_INSERTSTRUCT{

HTREEITEM hParent;

HTREEITEM hInsertAfter;

TV_ITEM item;

} TV_INSERTSTRUCT;

 

де hParent – дескриптор батьківського елемента для поточного вузла дерева, який приймає значення TVI_ROOT або NULL у випадку, коли вузол сам є коренем дерева; hInsertAfter – дескриптор елемента за яким послідовно додається поточний елемент, або визначення способу за яким здійснюється додавання:

TVI_FIRST – додавання до початку списку,

TVI_LAST – додавання у кінець списку,

TVI_SORT – додавання у список із алфавітним сортуванням.

Наступний елемент структури – TV_ITEM сам є складною структурою, що містить детальну інформацію про те, який саме елемент додається у дерево:

 

typedef struct _TV_ITEM

{UINT mask;

HTREEITEM hItem;

UINT state;

UINT stateMask;

LPSTR pszText;

int cchTextMax;

int iImage;

int iSelectedImage;

int cChildren;

LPARAM lParam;

} TV_ITEM, FAR *LPTV_ITEM;

 

Таблиця 5.10 показує зміст параметрів та їх можливі значення.

 

Таблиця 5.10 – Зміст структури TV_ITEM

Тип та ім’я поля структури Ім’я поля. Стандартні значення полів
UINT mask   ознака полів структури, які містять інформацію
TVIF_HANDLE – інформація міститься у полі hItem
TVIF_STATE – інформація міститься у полях state та stateMask
TVIF_TEXT – інформація міститься у полях pszText, cchTextMax
TVIF_IMAGE – інформація міститься у полі iImage
TVIF_SELECTEDIMAGE – інформація міститься у полі iSelectedImage
TVIF_CHILDREN IMAGE – інформація міститься у полі iChilren
TVIF_PARAM – інформація міститься у полі lParam
HTREEITEM hItem ідентифікатор елемента, якому належить структура
UINT state   cтан елемента дерева
TVIS_DISABLED – неактивний та недоступний елемент
TVIS_DROPHILITED – елемент виділений кольором
TVIS_EXPANDED – гілка під елементом є розкритою
TVIS_ EXPANDEDONCE – гілка під елементом розкрита на один рівень
TVIS_FOCUSED – елемент отримав фокус
TVIS_SELECTED – елемент обраний
UINT stateMask стан, що необхідно отримати (такі ж значення, що й у полі state)
LPSTR pszText покажчик на рядок із текстовою позначкою елемента дерева
int cchTextMax розмір масиву рядка текстової позначки
int iImage індекс зображення (якщо таке визначено)
int iSelectedImage індекс зображення для обраного елемента (якщо таке визначено)
int cChildren кількість нащадків елемента дерева
LPARAM lParam інформація користувача про елемент дерева

 

5.10.4 Функції обробки вікон перегляду дерев

До класу CTreeCtrl належить багато функцій. Ми розглянемо тільки найбільш цікаві з точки зору подальшої розробки програм.

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

 

BOOL CTreeCtrl:: Expand(HTREEITEM hItem, UINT nCode);

 

де hItem – дескриптор елемента дерева, що має розгорнутися;

nCode – код, який вказує спосіб розгортання вузла. Приймає значення:

TVE_COLLAPSE – усі гілки більш низького рівня згортаються;

TVE_COLLAPSERESET – уся структура дерева згортається;

TVE_EXPAND – усі гілки більш низького рівня розгортаються;

TVE_TOGGLE – стан гілок змінюється на протилежний (розгорнутий – згортається і навпаки згорнутий – розгортається).

Усі дії функції Expand() здійснюються відносно елемента, вказаного у параметрі hItem.

Наступна функція GetSelectedItem() визначає, який елемент дерева є обраним у даний момент часу:

 

HTREEITEM CTreeCtrl:: GetSelectedItem();

 

Функція – Select() діє протилежним чином і обирає елемент дерева:

 

BOOL CTreeCtrl:: Select(HTREEITEM hItem, UINT nCode);

 

де hItem – дескриптор елемента, який необхідно обрати;

nCode – тип дії з обраним елементом дерева. Приймає такі значення:

TVGN_CARET – елемент обирається у звичайний спосіб;

TVGN_DROPHILITE – елемент обирається для операції переміщення;

TVGN_FIRSTVISIBLE – дерево прокручується таким чином, що обраний елемент стає першим.

Якщо nCode містить значення TVGN_CARET, батьківське вікно отримує повідомлення TVN_SELCHANGING та TVN_SELCHANGED.

Для отримання інформації про елемент дерева можна використати функцію GetItem():

 

BOOL CTreeCtrl:: GetItem (TV_ITEM* pItem);

 

де pItem – покажчик на структуру типу TV_ITEM.

У протилежному випадку, щоб задати інформацію про елемент дерева – використовується функція SetItem():

 

BOOL CTreeCtrl:: SetItem(TV_ITEM* pItem);

BOOL CTreeCtrl:: SetItem(HTREEITEM hItem, UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam);

 

де pItem – покажчик на структуру типу TV_ITEM, що містить нові атрибути елемента. Інші параметри є цілком відповідними полям структури TV_ITEM.

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

 

BOOL CTreeCtrl:: DeleteItem(HTREEITEM hItem);

 

де hItem – дескриптор елемента, що підлягає вилученню. Якщо hitem має значення TVI_ROOT, з дерева вилучаються усі елементи.

Сформований попередньо список зображень, можна використати для позначення вузлів дерева і приєднати за допомогою списку SetImageList():

 

CImageList* CTreeCtrl:: SetImageList(CImageList * pImageList, int nImageListType);

 

де pImageList – покажчик на приєднуваний список зображень, nImageListType – тип списку зображень (має два основних значення: TVSIL_NORMAL та TVSIL_STATE – відповідно списки звичайних та визначених користувачем зображень). SetImageList() повертає попередньо сформований список зображень.

 

5.10.5 Повідомлення нотифікації вікон перегляду дерев

Під час виконання дій із елементами вікна перегляду дерев батьківському вікну надсилаються повідомлення нотифікації WM_NOTIFY. Ці повідомлення можна відповідним чином програмно обробити. Їх ілюструє таблиця 5.11.

 

Таблиця 5.11 – Повідомлення вікон перегляду дерев

Код повідомлення Коментар
TVN_BEGINDRAG початок операції перетягування елемента мишею (натиснута ліва клавіша)
TVN_BEGINRDRAG початок операції перетягування елемента мишею (натиснута права клавіша)
TVN_BEGINLABELEDIT початок редагування позначки елемента
TVN_DELETEITEM повідомляється про вилучення елемента
TVN_ENDLABELEDIT закінчення редагування позначки елемента
TVN_GETDISPINFO визначення інформації, необхідної для відображення елемента
TVN_ITEMEXPANDED список дочірніх елементів, створених батьківським вузлом, розгорнуто або згорнуто
TVN_ITEMEXPANDING список дочірніх елементів, створених батьківським вузлом, розгортається або згортається
TVN_KEYDOWN повідомляється про натискання клавіші
TVN_SELCHANGED елемент дерева замінено іншим елементом
TVN_SELCHANGING передбачається заміна одного елемента дерева іншим
TVN_SETDISPINFO оновлюється інформація, необхідна для відображення елемента

 

Перераховані повідомлення обробляються спеціальними функціями – обробниками такого вигляду:

void Ім’я_повідомлення (NMHDR *hdr, LRESULT *Result);

Під час обробки повідомлень, що надходять від вікон перегляду дерев, параметр hdr вказуватиме на структуру типу NM_TREEVIEW. Цей тип визначається у такий спосіб [1, 9]:

 

typedef struct tagNMTREEVIEW {

NMHDR hdr;

UINT action;

TVITEM itemOld;

TVITEM itemNew;

POINT ptDrag;

} NMTREEVIEW, FAR *LPNMTREEVIEW;

 

де hdr – стандартна структура типу NMHDR. Ідентифікаційний код записується у поле Code структури. Дескриптор вікна, від якого надійшло повідомлення, передається у поле hwndFrom структури NMHDR. Поле Action структури NM_TREEVIEW містить інформацію, специфічну для даного ідентифікаційного коду. У структурах itemOld та itemNew міститься інформація відповідно про попередній обраний елемент (якщо такий існував) та про новий обраний елемент (якщо такий є). Положення курсору миші на момент передавання пові-домлення заховано у полі ptDrag.

Для повідомлень TVN_SELCHANGING та TVN_SELCHANGED структура itemOld описує попередній обраний елемент, а itemNew – новий обраний. Для повідомлень TVN_ITEMEXPANDING та TVN_ITEMEXPANDED у структурі itemNew міститься інформація про попередника даної гілки (у дереві). Для повідомлення TVN_DELETEITEM у структурі itemOld міститься інформація про вилучений елемент.

Для повідомлень TVN_SELCHANGING та TVN_ITEMEXPANDING функція-обробник має встановлювати параметр Result, у значення 0 для дозволу на виконання дії, та значення не-0 для заборони дії. В інших повідомленнях цей параметр ігнорується.

 

5.10.6 Відображення дерев у головному вікні програми

Визначимо особливості побудови програми, що відображує дерево у го-ловному вікні:

1) додати у клас головного вікна визначення об’єкта дерева та оголосити прототипи функції ініціалізації дерева, згортання гілок та розгортання, функцію оновлення вікна:

 

class CMain: public CFrameWnd

{public: void OnPaint(); // функція оновлення вікна

void OnExpand(); // функція розгортання вузлів дерева

void OnCollapse(); // функція згортання вузлів дерева

void InitTree(); // функція ініціалізації дерева

CMain(); // конструктор головного вікна

DECLARE_MESSAGE_MAP()

private: CTreeCtrl m_Tree; // об’єкт дерева

};

2) оголосити глобальні змінні програми та директиви препроцесора:

 

#define ID_TREE 400002

#define NUM 5

HTREEITEM hTreeCtrl[30]; // масив вузлів дерева

HTREEITEM hTreeCurrent; // поточний вузол

int i; // кількість вузлів

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

 

CMain:: CMain()

{Create(NULL, " Використання дерева", WS_OVERLAPPEDWINDOW, rectDefault,

NULL, MAKEINTRESOURCE(IDR_MENU1));

InitCommonControls();

RECT r; r.left=r.top=30; r.right=220; r.bottom=200;

m_Tree.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_EDITLABELS |

TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT, r, this, ID_TREE);

InitTree();

}

 

4) реалізувати функцію ініціалізації дерева InitTree():

void CMain:: InitTree()

{TV_INSERTSTRUCT tvs;

TV_ITEM tvi;

tvs.hInsertAfter=TVI_LAST; tvi.mask=TVIF_TEXT;

tvi.pszText=" One";

tvs.hParent=TVI_ROOT;

tvs.item=tvi;

hTreeCtrl[0]=m_Tree.InsertItem(& tvs);

hTreeCurrent=hTreeCtrl[0];

 

tvi.pszText=" Two";

tvs.hParent=hTreeCtrl[0];

tvs.item=tvi;

hTreeCtrl[1]=m_Tree.InsertItem(& tvs);

 

tvi.pszText=" Three";

tvs.hParent=hTreeCtrl[1];

tvs.item=tvi;

hTreeCtrl[2]=m_Tree.InsertItem(& tvs);

 

tvi.pszText=" Four";

tvs.hParent=hTreeCtrl[2];

tvs.item=tvi;

hTreeCtrl[3]=m_Tree.InsertItem(& tvs);

 

tvi.pszText=" Five";

tvs.hParent=hTreeCtrl[2];

tvs.item=tvi;

hTreeCtrl[4]=m_Tree.InsertItem(& tvs);

i=5; }

 

5) визначити карту повідомлень програми:

 

BEGIN_MESSAGE_MAP(CMain, CFrameWnd)

ON_WM_PAINT()

ON_COMMAND(ID_TREE_EXPAND, OnExpand)

ON_COMMAND(ID_TREE_COLLAPSE, OnCollapse)

END_MESSAGE_MAP()

 

6) визначити обробники OnExpand(), OnCollapse(), OnPaint():

 

void CMain:: OnPaint()

{CPaintDC dc(this);

TV_ITEM tvi;

char str1[40];

char str2[40];

tvi.hItem = hTreeCurrent;

tvi.pszText = str1;

tvi.cchTextMax = sizeof(str1)-1;

tvi.mask=TVIF_TEXT | TVIF_HANDLE;

m_Tree.GetItem(& tvi);

wsprintf(str2, " Current Selection %s", tvi.pszText);

dc.TextOut(2, 220, str2, strlen(str2)); }

 

void CMain:: OnExpand() {m_Tree.Expand(hTreeCurrent, TVE_EXPAND); }

void CMain:: OnCollapse() {m_Tree.Expand(hTreeCurrent, TVE_COLLAPSE); }

 

В результаті побудови програми маємо отримати програму, зовнішній вигляд якої зображений на рисунку 5.12.

 

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

 

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

 

Приклад 5.9 – Використання вікна перегляду дерева

// файл t1.h

class CMain: public CFrameWnd

{public: void OnPaint();

void OnExpand();

void OnCollapse();

void InitTree();

CMain();

DECLARE_MESSAGE_MAP()

private: CTreeCtrl m_Tree; };

 

class CApp: public CWinApp






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