Зміст p>
Введення p>
3 p>
Аналіз та опис предметної області проекту 4 p>
Розробка об'єктної моделі
5 p>
Визначення об'єктів і класів p>
5 p>
Підготовка словника даних p>
5 p>
Визначення атрибутів об'єктів
6 p>
Визначення методів класів p>
7 p>
Спрощення класів при використанні успадкування і графічне зображення об'єктної моделі 7 p>
Реалізація об'єктної моделі на мові програмування C + + p>
9 p>
Реалізація класу книги p>
9 p>
Породження об'єктів p>
19 p>
Виклик операцій p>
20 p>
Використання успадкування p>
21 p>
Реалізація залежностей p>
22 p>
Аналіз отриманих результатів та висновки 23 p>
Знімок екрану програми p>
24 p>
Література p>
25 p>
Введення p>
Темою даної курсової роботи є вивчення об'єктно -орієнтованих можливостей мови C + + (номер варіанта 34). Предметнаобласть курсової роботи згідно варіанту - моделювання структури книги. p>
У методичному додатку були наведені особливості предметноїобласті, розглянутої в даній роботі, - у книзі виділяються компоненти:сторінка, глава, розділ. За умовою задачі необхідно реалізувати об'єктнумодель книги і написати програму з використанням класу C + +, якийвідображає структуру книги і наочно демонструє ефективністьвикористання об'єктно-орієнтованої технології розробки програм. p>
Для підвищення ефективності створення програмних комплексів іскорочення часу, відведеного на проектування і реалізацію кінцевогопродукту, фірма Microsoft рекомендує використовувати розроблену неюбібліотеку класів MFC (Microsoft Foundation Classes), що поставляється вскладі середовища розробки програм Microsoft Visual C + + 6. Томудодаток, створений під час написання даної курсової роботи, єдодатком, що використовує бібліотеку MFC, та розроблено у візуальній середовищі
Microsoft Visual C + + 6. Призначення цієї програми - наочнеподання у візуальній формі структури книги. p>
Аналіз та опис предметної області проекту p>
Предметна область даної курсової роботи була обрана в методичномудодатку: моделювання структури книги (варіант № 34). p>
Книга містить текстову інформацію (у простому випадку) і маєдеревоподібну структуру - книга складається з кількох розділів, розділскладається з кількох розділів, голова, у свою чергу, складається зі сторінок.
Особливий компонент книги, що полегшує її використання, - зміст, що маєтакож деревоподібну структуру. Недолік паперової книги - необхідністьчасто відкривати сторінки, що містять зміст, для визначення номерівпотрібних сторінок, далі необхідно здійснювати пошук цих сторінок повідомим номерами, на що знову йде якийсь час. В електроннихкнигах (наприклад, створених для перегляду за допомогою програми Adobe Acrobat
Reader) зміст завжди знаходиться перед очима читача і перехід напотрібну сторінку здійснюється простим клацанням миші по елементу,відповідному деякої сторінці. Крім того, у таких зміступоказуються всі сторінки, а не тільки перші сторінки голів, що такожспрощує навігацію по книзі. І в паперових, і в електронних книгах завждиприсутня можливість перевернути одну сторінку вперед або назад. Дляспрощення завдання і здійснення сумісності з книгами, створеними дляперегляду на ПК, орієнтованих на текстові операційні системи (типу
DOS), сторінку ми будемо розглядати як об'єкт, що містить винятковотекстову інформацію, видиму єдиним шрифтом і не містить жодногоформатування. Таким чином, можна уявити сторінку як масив зконстантним кількістю розташованих вертикально зверху внизгоризонтальних рядків, що містять константні кількість символів (у разівикористання немоношірінних шрифтів рядки мають постійну довжину,виражену у фізичних одиницях: сантиметрах, дюймах, пікселях і т.п.). p>
Розробка об'єктної моделі p>
Визначення об'єктів і класів p>
Згідно з моделлю програми, яка використовується бібліотекою MFC, будь-яке SDI -додаток повинен мати визначення наступних класів: клас додатки,породжений від CWinApp, клас вікна, породжений від CFrameWnd, класдокумента, породжений від CDocument, і клас подання, породжений від
CView. Оскільки додаток для перегляду книг виконано в стилі "Explorer", тотакож визначено клас подання змісту книги, породжений від
CTreeView. Крім того, клас подання сторінки книги породжений небезпосередньо від класу CView, а від успадкованого від CView класу - класу
CListView. Тобто сторінка книги має уявлення у вигляді списку її строк. p>
Клас, що відображає структуру книги, має назву CBookClass.
Визначено класи колекцій розділів, глав і сторінок - клас CRazdels,клас CGlavas і клас CPages відповідно; а також класи власнерозділу, глави та сторінки - клас CRazdel, клас CGlava і клас CPageвідповідно. p>
Підготовка словника даних p>
Додаток - глобальний об'єкт класу програми, що використовується дляузгодження роботи об'єктів інших стандартних класів MFC і длядозволу посилань всередині одних об'єктів на інші об'єкти. p>
Вікно програми - об'єкт візуального подання додатка,організовує взаємне розташування візуальних компонентів програми наекрані і реалізує стандартний інтерфейс взаємодії користувача зпрограмою. p>
Документ - інформація, яку користувач може зберігати в процесіроботи з додатком і потім зчитувати. p>
Представлення - засоби представлення документа користувачеві впроцесі виконання програми. p>
Призначена в основу MFC концепція документ/подання дозволяєвідокремити дані від засобів, за допомогою яких користувач маєможливість проглянути ці дані та маніпулювати ними. Об'єкти-документивідповідальні за зберігання, завантаження і вивантаження даних, а об'єкти -подання, які являють собою ті ж вікна, дозволяютькористувачеві переглядати дані на екрані і редагувати їхвідповідно логіці роботи програми. Об'єкт класу поданнямістить покажчик на об'єкт класу документа, який використовується длядоступу до членів-змінним цього класу, де власне і зберігаються дані. p>
Значення термінів книга, розділ, глава, сторінка, рядок і змісточевидні і не підлягають поясненню. p>
Визначення атрибутів об'єктів p>
У класі документа визначено відкритий атрибут - об'єкт класу
CBookClass: p>
class CBookDoc: public CDocument p>
(public: p>
CBookClass m_Book; p>
); p>
В клас документа включений відкритий член з тим, щоб не ускладнюватидоступ до нього з об'єктів класів подання. Визначення атрибутівінших класів відповідають класичному об'єктно-орієнтованогопідходу, який вимагає включати в клас закриті або захищені члени -змінні і відкриті члени-функції зчитування і модифікації цихзмінних. p>
Класи книги, розділу, глави і сторінки мають закриту член-зміннуm_Name класу CString. Оскільки книга має деревовидну структуру, то класикниги, розділу і глави відповідають гілкам дерева, а клас сторінки --листу цього дерева. Тому класи-гілки містять член-змінну класуколекції більш дрібних об'єктів (книга містить колекцію розділів, голова --колекцію сторінок), а сторінка містить член-змінну - масив об'єктівкласу CString (рядки цієї сторінки). Класи розділу і глави містятьчлени-змінні типу WORD - номери першої та останньої сторінок,належать даному розділу або чолі. Клас розділу містить такожномера першої і останньої голів, що належать до цього розділу. p>
У класі книги визначено закритий атрибут типу WORD, який зберігає номерсторінки, яка в даний момент часу проглядається користувачем.
Крім того, в класі книги визначені члени-покажчики на елементиуправління CTreeCtrl і CListCtrl, що дозволяють здійснювати при читанні книгиперехід від однієї сторінки до іншої. Для цієї ж цілі в класі сторінкивизначена член-змінна - вказівник на елемент дерева - типу HTREEITEM. p>
Для перебору всіх сторінок книги зручно користуватися не деревом, амасивом сторінок. Тому в класі книги визначена член-змінна --масив покажчиків на сторінки книги - MFC-класу CPtrArray. p>
Визначення методів класів p>
Крім відкритих членів-функцій, що здійснюють читання і модифікаціюзакритих членів-змінних, у класах, які використовуються в програмі, визначеніта інші члени-функції. p>
У класі книги визначені відкриті члени-функції, що здійснюютьперехід при читанні книги до попередньої і наступної сторінок. Крім того,в цьому класі визначена закрита член-функція RenewCtrls (), якавикликається вищезгаданими функціями при переході до іншої сторінки. Данафункція викликає глобальні функції RenewTree () і RenewList (), якіоновлюють візуальне зміст уявлень змісту та сторінкивідповідно. p>
Класи колекцій розділів, глав і сторінок (CRazdels, CGlavas і CPages)мають відкриті члени-функції DeleteRazdels (), DeleteGlavas () і
DeletePages () відповідно. Дані члени-функції здійснюютьзвільнення пам'яті, виділеної під зберігання книги, при відкритті іншогокниги або завершення роботи програми. p>
У класі книги перевантажені конструктор і деструктор за замовчуванням.
Конструктор обнуляє номер поточної сторінки для того, щоб при відкриттінової книги автоматично відображалася перша сторінка. Деструкторзапускає механізм звільнення пам'яті. p>
Спрощення класів при використанні успадкування і графічне зображенняоб'єктної моделі p>
Об'єктно-орієнтований підхід в програмуванні має одну дужепривабливу рису - можливість повторного використання вжерозробленого коду. По-перше, можна використовувати класи, створенііншими розробниками, не піклуючись про деталі реалізації методів усерединікласу. Прикладом можуть служити сотні класів з бібліотеки MFC. Але більшістотні переваги дає повторне використання коду, що реалізовуєтьсячерез механізм спадкоємства. p>
Клас, який використовує код іншого класу, називається похідним абопідкласом. Клас, що надає свій код іншого класу,називається базовим або суперкласу. Якщо є необхідність надатиметодам породженого класу можливість прямого доступу до члена-змінноїбазового класу, замість кваліфікаторов доступу private можна використовуватикваліфікаторов protected. Може виявитися, що методи базового класу,успадковані породженим класом, не зовсім відповідають специфіціостаннього і потребують певної модифікації. Для цього буде потрібнорозробити окремий метод Імя_Класса:: Метод (). Це і є перевантаженняметодів базового класу. Якщо бажано, щоб метод Імя_Класса:: Метод ()виконував те ж, що й метод базового класу, а потім і ще щось, тонайкращим способом досягти такого результату буде виклик
Імя_Базового_Класса:: Метод () всередині Імя_Класса:: Метод (). Але при цьому потрібновикористовувати повне ім'я методу базового класу, тобто саме
Імя_Базового_Класса:: Метод (). p>
У додатку класи книги, розділу, глави та сторінки успадковані від
CObject. Це необхідно для реалізації механізму завантаження документа зфайлу - метод Serialize () в цих класах перевантажується також, як і вкласі документа: void CBookDoc:: Serialize (CArchive & ar) p>
(m_Book.Serialize (ar); p>
) p>
Класи CRazdels, CGlavas і CPages успадковані від класу CObArray.
Тому для об'єктів цих класів можна викликати всі члени-функції,властиві класу масиву об'єктів. p>
Об'єктна модель книги p>
p>
Реалізація об'єктної моделі на мові програмування C + + p>
Реалізація класу книги p>
BookClass.h: p>
# if _MSC_VER> 1000
# pragma once
# endif// _MSC_VER> 1000 p>
# include "Razdels.h" p>
class CBookClass;extern void RenewTree (CTreeCtrl *, CBookClass *);extern void RenewList (CListCtrl *, CBookClass *); p>
class CBookClass: public CObject
(
DECLARE_SERIAL (CBookClass)private: p>
CRazdels m_Razdels; p>
CPtrArray m_pPages; p>
CTreeCtrl * pTreeCtrl; p>
CListCtrl * pListCtrl; p>
CString m_Name; p>
WORD m_ActivePage; void RenewCtrls () p>
( p>
RenewTree (pTreeCtrl, this); p>
RenewList (pListCtrl , this); p>
)public: p>
CRazdels * GetRazdels () p>
(return & m_Razdels; p>
) p>
CPtrArray * GetPages () p> < p> (return & m_pPages; p>
) void SetTreeCtrl (CTreeCtrl * TreeCtrl) p>
(pTreeCtrl = TreeCtrl;) void SetListCtrl (CListCtrl * ListCtrl) p>
(pListCtrl = ListCtrl; p>
) p>
CString * GetName () p>
(return & m_Name; p>
) p>
WORD GetActivePage () p>
(return m_ActivePage; p>
) void SetActivePage (WORD Page) p>
(m_ActivePage = Page; p>
RenewList (pListCtrl , this); p>
) void SetPreviousActivePage () p>
(if (m_ActivePage> 0) p>
(m_ActivePage -; p>
RenewCtrls (); p>
) p>
) void SetNextActivePage () p>
(if (m_ActivePage 1> m_Name; p>
WORD Count, Counter ; ar>> Count; for (Counter = 0; CounterSerialize (ar); m_Razdels.Add (Razdel); p>
) for (Counter = 0; CounterGetSize (); Counter2 ++) p>
( p>
CGlava * Glava = (CGlava *) Razdel-> GetGlavas () -
> GetAt (Counter2); for (WORD Counter3 = 0; Counter3GetPages () -
> GetSize (); Counter3 + +) m_pPages.Add (Glava-> GetPages () -
> GetAt (Counter3 )); p>
) p>
) p>
)
) p>
Razdels.h: p>
# if _MSC_VER> 1000
# pragma once
# endif// _MSC_VER> 1000 p>
# include "Razdel.h" p>
class CRazdels: public CObArray
(public: void DeleteRazdels ();
); p>
Razdels.cpp: p>
# include "stdafx.h"
# include "Razdels.h" p>
void CRazdels:: DeleteRazdels ()
( p>
WORD Counter; for (Counter = 0; CounterGetGlavas () -> DeleteGlavas (); delete Razdel; p>
) p>
RemoveAll ();
) p>
Razdel.h: p>
# if _MSC_VER> 1000
# pragma once
# endif// _MSC_VER> 1000 p>
# include "Glavas.h" p>
class CRazdel: public CObject
(
DECLARE_SERIAL (CRazdel)private: p>
CGlavas m_Glavas; p>
CString m_Name; p>
WORD m_FirstGlava; p>
WORD m_LastGlava; p>
WORD m_FirstPage; p>
WORD m_LastPage;public: p>
CGlavas * GetGlavas () p>
(return & m_Glavas; p>
) p>
CString * GetName () p> < p> (return & m_Name; p>
) p>
WORD GetFirstGlava () p>
(return m_FirstGlava; p>
) void SetFirstGlava (WORD FirstGlava) p>
(m_FirstGlava = FirstGlava; p>
) p>
WORD GetLastGlava () p>
(return m_LastGlava; p>
) void SetLastGlava (WORD LastGlava) p>
(m_LastGlava = LastGlava; p>
) p>
WORD GetFirstPage () p>
(return m_FirstPage; p>
) void SetFirstPage (WORD FirstPage) p>
(m_FirstPage = FirstPage; p>
) p>
WORD GetLastPage () p>
(return m_LastPage; p>
) void SetLastPage (WORD LastPage) p>
(m_LastPage = LastPage; p>
) p>
CRazdel () () ; void Serialize (CArchive &);
); p>
Razdel.cpp: p>
# include "stdafx.h"
# include "Razdel.h" p>
IMPLEMENT_SERIAL (CRazdel, CObject, 0) p>
void CRazdel:: Serialize (CArchive & ar)
( p>
CObject:: Serialize (ar); if (ar.IsLoading ()) p>
(ar>> m_Name>> m_FirstGlava>> m_LastGlava>> m_FirstPage>>m_LastPage; p>
WORD Count, Counter; ar>> Count; for (Counter = 0; CounterSerialize (ar); m_Glavas.Add (Glava); p>
) p> < p>)
) p>
Glavas.h: p>
# if _MSC_VER> 1000
# pragma once
# endif// _MSC_VER> 1000 p>
# include "Glava.h" p>
class CGlavas: public CObArray
(public: void DeleteGlavas ();
); p>
Glavas.cpp: p>
# include "stdafx.h"
# include "Glavas.h" p>
void CGlavas:: DeleteGlavas ()
( p>
WORD Counter; for (Counter = 0; CounterGetPages () -> DeletePages (); delete Glava; p>
) p>
RemoveAll ();
) p>
Glava.h: p>
# if _MSC_VER> 1000
# pragma once
# endif// _MSC_VER> 1000 p>
# include "Pages.h" p>
class CGlava: public CObject
(
DECLARE_SERIAL (CGlava)private: p>
CPages m_Pages; p>
CString m_Name; p>
WORD m_FirstPage; p>
WORD m_LastPage;public: p>
CPages * GetPages () p>
(return & m_Pages; p>
) p>
CString * GetName () p> < p> (return & m_Name; p>
) p>
WORD GetFirstPage () p>
(return m_FirstPage;) void SetFirstPage (WORD FirstPage) p>
(m_FirstPage = FirstPage; p>
) p>
WORD GetLastPage () p>
(return m_LastPage; p>
) void SetLastPage (WORD LastPage)
(m_LastPage = LastPage; p>
) p>
CGlava (){}; void Serialize (CArchive &);
); p>
Glava.cpp: p>
# include "stdafx.h"
# include "Glava.h" p>
IMPLEMENT_SERIAL (CGlava, CObject, 0) p>
void CGlava:: Serialize (CArchive & ar)
( p>
CObject:: Serialize (ar); if (ar.IsLoading ()) p>
(ar>> m_Name>> m_FirstPage>> m_LastPage; p>
WORD Count, Counter; ar>> Count; for (Counter = 0; CounterSerialize (ar); m_Pages.Add (Page); p>
) p>
)
) p>
Pages.h: p>
# if _MSC_VER> 1000
# pragma once
# endif// _MSC_VER> 1000 p>
# include "Page.h" p>
class CPages: public CObArray
(public: void DeletePages ();
); p>
Pages.cpp: p>
# include "stdafx.h"
# include "Pages.h" p>
void CPages:: DeletePages ()
( p>
WORD Counter; for (Counter = 0; Counter 1000
# pragma once
# endif// _MSC_VER> 1000 p>
# define CountOfStrings 37 p>
class CPage: public CObject
(
DECLARE_SERIAL (CPage)private: p>
CString m_Strings [CountOfStrings]; p>
CString m_Name; p>
HTREEITEM m_TreeItem;public: p>
CString * GetString (BYTE Index) p>
(return & m_Strings [Index]; p>
) p>
CString * GetName () p>
(return & m_Name; p>
) p>
HTREEITEM GetTreeItem () p>
(return m_TreeItem; p>
) void SetTreeItem (HTREEITEM TreeItem) p>
(m_TreeItem = TreeItem; p>
) p>
CPage (){}; void Serialize (CArchive &);
); p>
Page.cpp: p>
# include "stdafx.h"
# include "Page.h" p>
IMPLEMENT_SERIAL (CPage, CObject, 0) p>
void CPage:: Serialize (CArchive & ar)
( p>
CObject:: Serialize (ar); if (ar.IsLoading ()) p>
(ar>> m_Name; p>
BYTE Counter; for (Counter = 0; Counter> m_Strings [Counter]; p>
)
) p>
Породження об'єктів p>
У файлі Book.cpp оголошується глобальна змінна - об'єкт класупрограми CBookApp: p>
CBookApp theApp; p>
У перевантаженій функції-члені InitInstance () класу CBookApp створюютьсяоб'єкти класів документа, вікна та подання змісту: p>
BOOL CBookApp:: InitInstance () p>
( p>
CSingleDocTemplate * pDocTemplate; pDocTemplate = new CSingleDocTemplate ( p >
IDR_MAINFRAME, p>
RUNTIME_CLASS (CBookDoc), p>
RUNTIME_CLASS (CMainFrame), p>
RUNTIME_CLASS (CLeftView )); p>
AddDocTemplate (pDocTemplate); return TRUE; p>
) p>
Клас вікна CMainFrame містить захищений атрибут класу CSplitterWnd,що надає доступ до подання сторінки за допомогою виклику відкритоїчлен-функції класу CMainFrame: p>
class CMainFrame: public CFrameWnd p>
(protected: p>
CSplitterWnd m_wndSplitter; public: p>
CBookView * GetRightPane (); p>
); p>
Об'єкт класу книги є відкритим атрибутом класу документа: p>
class CBookDoc: public CDocument p>
(public: p>
CBookClass m_Book; p>
); p>
Всі структурні елементи книги (розділи, глави і сторінки) створюються вмомент завантаження файлу книги з диска через оператор new: p>
CRazdel * Razdel = new CRazdel; m_Razdels.Add (Razdel); p>
Виклик операцій p>
Виклик операцій для об'єктів в C + + може бути організований двомаспособами: p>
1) Якщо потрібно викликати операцію для змінної, яка є об'єктом якого-небудь класу, то використовується оператор .*: p>
Object.MemberFunc (); p>
2) Якщо змінна є покажчиком на об'єкт класу, то доступ до методів, що підтримуються даним класом, організовується через оператор -> *: pObject-> MemberFunc (); p>
Оскільки об'єкт класу книги є відкритим атрибутом класу документа,то доступ до членів класу книги здійснюється через вказівник на об'єкткласу документа. Т.ч., щоб викликати функцію-член доЛасса CBookClass,необхідно отримати спочатку покажчик на об'єкт класу CBookDoc: p>
CBookDoc * pDoc = GetDocument (); pDoc-> m_Book.SetTreeCtrl (& refCtrl); p>
Якщо члени-функції викликаються всередині їх класу, то виклик цих функційздійснюється безпосередньо без зазначення імені класу. Наприклад, усередині функції
CRazdels:: DeleteRazdels () здійснюється виклик членів-функцій, успадкованихвід базового класу CObArray: p>
void CRazdels:: DeleteRazdels () p>
( p>
WORD Counter; for (Counter = 0; CounterGetGlavas () -> DeleteGlavas ( ); delete Razdel; p>
) p>
RemoveAll (); p>
) p>
Використання успадкування p>
Згідно з концепцією об'єктно-орієнтованого програмування функціязавантаження файлу книги з диска повинна бути інкапсульовані в самому класі
CBookClass. Основні етапи створення класу, який може самостійноорганізувати збереження-відновлення (в документації на MFC застосовуєтьсятермін serialize-сериализация) власних членів-змінних перерахованінижче: p>
1.Об'явіть клас як похідний від CObject. p>
2.В оголошення класу включити макрос DECLARE_SERIAL. p>
3.В реалізацію класу включити макрос IMPLEMENT_SERIAL. p>
4.Перегрузіть метод Serialize (), успадкований від базового класу. p>
5.Перегрузіть для нового класу серед інших конструктор за замовчуванням. p>
Т.ч. в нашому випадку неминуче доводиться застосовувати механізмуспадкування класів. Як тільки ми оголосили клас книги похідним від
CObject, нам дозволяється використовувати сериализации даних. P>
Крім виконання вищевказаних п'яти пунктів необхідно такожперевантажити метод Serialize () і для класу документа: p>
void CBookDoc:: Serialize (CArchive & ar) p>
(m_Book.Serialize (ar); p>
)
Також як і метод Serialize () класу документа перевантажений метод
Serialize () класу книги не виконує безпосереднє читання тексту книгиз файлу. Цей метод витягує з файла тільки лише службову інформацію,визначаючи назву книги і кількість її розділів. Далі в циклі створюютьсяоб'єкти класу розділу, їм делегується завантаження з файлу розділів, далівідбувається додавання розділів в колекцію розділів книги. Аналогічнорозділ, завантаживши службову інформацію розділу, делегує завантаження голівкласу голови; голова, у свою чергу, делегує завантаження сторінок класусторінки, а вже сторінка викликає оператор завантаження з архіву, визначенийв MFC-класі CString. p>
Реалізація залежностей p>
Тут докладно зупинимося на механізмі «гортання» сторінок, тобтона переході до попередньої і наступної сторінок. При роботі зпевними елементами меню, кнопками панелі інструментів або при натисканніспеціальних віртуальних клавіш у програмі здійснюється «гортання»однієї сторінки вперед або назад. При цьому управління передається членам -функцій класу документа OnPagedown () і OnPageup (). Ці функції викликаютьчлени-функції класу книги SetNextActivePage () і SetPreviousActivePage (),які після оновлення номера активної сторінки викликають закриту член -функцію класу книги RenewCtrls (). Ця функція викликає глобальні функції
RenewTree () і RenewList (), передаючи їм як аргументи покажчики наелементи управління, відповідальні за відображення книги на екрані, і покажчикна об'єкт книги. Дані глобальні функції, отримавши доступ до активноїсторінці через вказівник на об'єкт книги, оновлюють відображення змістуі сторінки у відповідності з номером активної сторінки. p>
Для реалізації залежності між елементом переглядовому вікна деревазмісту і класу книги в класі сторінки визначений атрибут - покажчикна елемент дерева: p>
class CPage: public CObject p>
(private: p>
HTREEITEM m_TreeItem; p>
); p> < p> Даний покажчик дозволяє при натисканні мишею по номеру сторінки взмісті відображати сторінку з цим номером, а при «гортання»сторінок - виділяти у змісті номер активної сторінки. Останняздійснюється через виклик вищезгаданої функції RenewTree (): p>
void RenewTree (CTreeCtrl * TreeCtrl, CBookClass * Book) p>
( p>
CPage * Page = (CPage *) Book-> GetPages () -> GetAt (Book-> p>
GetActivePage ()); p>
TreeCtrl-> Select (Page-> GetTreeItem (), TVGN_CARET); p >
) p>
Аналіз отриманих результатів та висновки p>
У ході вивчення об'єктно-орієнтованих можливостей мови C + + буларозроблена програма, активно використовує об'єктно-орієнтованітехнології створення програмних комплексів, включаючи Microsoft Foundation
Classes. Дані технології дозволяють у короткий термін за рахунок економіїчасу на етапах проектування та реалізації об'єктної моделі створюватидосить складні програмні продукти з багатими функціональнимиможливостями. Це обумовлено двома причинами: p>
1) Немає необхідності «винаходити велосипед», тобто реалізовуватистандартні функції, властиві будь-якому додатку для Windows. Вся увагапрограміст приділяє безпосередньо реалізації особливостей даноїпрограми та створення об'єктної моделі даних, з якою доводиться працюватирозробляється з додатком. p>
2) Бібліотека Microsoft Foundation Classes пропонує програмістувикористовувати деякі стандартні для цієї бібліотеки концепціїпрограмування, такі як документ/подання, сериализация даних іт.д. Т.ч. середу Visual C + + є не тільки інструментальної середовищемрозробки програм, але також це середовище багато в чому може допомогти і на етапіпроектування, надаючи програмісту у використання деякікорисні майстра. p>
Об'єктно-орієнтований підхід дозволяє не тільки ефективно інаочно описати на мові C + + структуру книги, але також легко створитизручну для використання програму. Така модель книги достатня дляорганізації всіх дій, які необхідні програмі переглядуелектронних книг. p>
Знімок екрану програми p>
p>
Література p>
1.К. Грегорі. Використання Visual C + + 6. Спеціальне видання. -
М.; СПб.; К.: Видавничий дім «Вільямс», 2003 p>
2.К. Джамса. Вчимося програмувати на мові C + +. - М.: Світ, 2001. P>
3.Сабуров С. Мови програмування C і C + +. - М.: пізнавальна;книга плюс, 2001. p>
4.Страуструп Б. Дизайн і еволюція мови C + +. - М.: ДМК-Пресс, 2000. P>
5.Фрідман А. C/C + +. Архіви програм. - СПб.: БИНОМ, 2001. P>
p>