Студопедия

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

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

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






Ініціалізація програми






Раніше ми багато разів розглядали послідовність ініціалізації, що має місце у функції ініціалізації СWinApp:: InitInstance() програми. Для програми, що створюється в межах концепції “Документ – вигляд”, ця функція має дещо іншу структуру. Це показує приклад 9.5.

 

Приклад 9.5 – Визначення функції ініціалізації для проектів, відповідних концепції “Документ – вигляд”

 

BOOL CApp:: InitInstance()

{ SetDialogBkColor(); // встановлення кольору фону вікна (стандартно – сірий колір)

LoadStdProfileSettings(); // завантаження стандартного файла ініціалізації

CSingleDocTemplate* pDocTemplate; // оголошення шаблону документа

pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,

RUNTIME_CLASS(CSampleDoc),

RUNTIME_CLASS(CMainFrame), // основне рамкове вікно SDI

RUNTIME_CLASS(CSampleView));

AddDocTemplate(pDocTemplate);

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

if (! ProcessShellCommand(cmdInfo)) return FALSE;

m_pMainWnd-> ShowWindow(SW_SHOW);

m_pMainWnd-> UpdateWindow();

return TRUE; }

 

9.3 Збереження та завантаження документів

Клас CObject містить функцію Serialize(), що автоматично викликається під час збереження або завантаження документа. Клас CArchive забезпечує автоматизацію функцій обробки файлів та містить перевантажені операції введення-виведення у вигляді операцій уставлення у потік та вибирання з потоку: “> > ” та “< < ”. При цьому сама функція серіалізації має такий прототип:

virtual void CObject:: Serialize(CArchive& ar);

 

Параметр ar є об’єктом типу CArchive, що є потоком серіалізації. Функція Serialize() має перевизначатися для кожного класу, що має на меті операції введення-виведення. Перевизначена функція серіалізації має насамперед викликати свого аналога, визначеного у базовому класі.

Для реалізації серіалізації у визначенні класу використовують макрос DECLARE_SERIAL() і макрос IMPLEMENT_SERIAL() у файлі реалізації функцій.

Для перевірки знаходження файлів у стані завантаження або збереження використовують функції: CArchive:: IsLoading() та CArchive:: IsStoring().

Їх прототипи мають вигляд:

 

BOOL CArchive:: IsLoading();

BOOL CArchive:: IsStoring();

 

Дані функції повертають ненульове значення у випадку, коли відбувається завантаження (збереження) і нульове значення, коли такі операції не здійснюються. Всередині функцій серіалізації функції IsLoading() та IsStoring() використовуються з метою перевірок стану процесів, наприклад:

 

void CAge:: Serialize(CArchive& ar)

{ CObject:: Serialize(ar);

if(ar.IsStoring()) ar < < m_years;

else ar > > m_years;

}

 

9.4 Особливості функцій класів CDocument та CView

 

Об’єкти класу CDocument є частиною набору команд маршрутизації і, отже, отримують команди від стандартних компонентів інтерфейсу користувача, наприклад пункту меню “File Save”. За допомогою цього способу відкритий документ одержує команди, відправлені активним об’єктом вигляду. Якщо документ не обробляє поточну команду, він переправляє команду до шаблону документа, який і забезпечує керування.

Коли дані документа змінюються, кожен з його станів вигляду має відображати зазначені модифікації. Клас CDocument містить спеціальну функцію UpdateAllViews(), яка повідомляє стани вигляду про зміни, що наступили, і, таким чином, ці стани мають змогу змінюватися. В аналогічний спосіб користувач за допомогою цієї ж функції запитується чи слід модифікувати файл перед закриттям.

Функція UpdateAllViews() повідомляє усі об’єкти вигляду про зміни у документі і має такий прототип:

 

void CDocument:: UpdateAllViews(CView* pSender, LPARAM lHint= 0L,

CObject* pHint = NULL);

 

Параметрами функції є: pSender – покажчик на об’єкт вигляду, що забезпечує зміну документа або NULL, якщо усі об’єкти вигляду мають змінитися; lHint – містить інформацію про зміни, що настали; pHint – покажчик на об’єкт, що зберігає інформацію про зміни.

Функція SetModifiedFlag() встановлює прапорець, який показує, що документ змінювався з моменту останнього збереження.

 

void CDocument:: SetModifiedFlag (BOOL bModified = TRUE);

 

Єдиний параметр: bModified – прапорець, який вказує чи змінювався документ.

Наступний клас CView забезпечує основні функціональні можливості визначених програмістом класів вигляду. Об’єкт вигляду приєднується до документа і діє як посередник між документом і користувачем: вигляд виконує відображення документа на екрані і інтерпретує операції введення користувача у якості операцій з документом. Об’єкт вигляду також здійснює відображення і документа для його подальшого перегляду перед друком і для самого друку.

Однією з найбільш корисних класу є функція GetDocument(). Вона повертає покажчик на об’єкт типу CDocument, зв'язаний з об’єктом вигляду і NULL якщо вигляд не є приєднаним до документа. Її прототип:

 

CDocument *CView:: GetDocument ();

Якщо у спосіб, описаний у підрозділі 9.3 реалізувати програму, що підтримуватиме концепцію “Документ – вигляд” (із використанням MFC Application Wizard), можна отримати програму, показану у прикладі 9.6. Від програми, що автоматично створюватиметься MFC Application Wizard вона відрізнятиметься відсутністю коментарів та де-яких оголошених “про всяк випадкок” параметрів. Звичайно, за бажанням кожен може відтворити проект MFC Application Wizard, але наводити його у посібнику немає потреби – кожен має змогу побудувати такий проект власноруч. Його вміст повністю залежатиме від опцій, що встановлюються під час виконання майстра побудови проектів. Зазначимо, що вміст програми не є зразком прозорості, особливо з точки зору запуску програми, що відбувається у функції InitInstance().

 

Приклад 9.6 – Приклад програми, створеної за допомогою Application Wizard

 

// MainFrm.h: interface of the CMainFrame class

 

class CMainFrame: public CFrameWnd

{protected: CMainFrame();

DECLARE_DYNCREATE(CMainFrame)

public: virtual ~CMainFrame();

protected: DECLARE_MESSAGE_MAP()

};

 

class CSampleApp: public CWinApp

{public: CSampleApp();

virtual BOOL InitInstance();

DECLARE_MESSAGE_MAP()

};

 

class CSampleDoc: public CDocument

{protected: CSampleDoc();

DECLARE_DYNCREATE(CSampleDoc)

public: virtual BOOL OnNewDocument();

virtual void Serialize(CArchive& ar);

virtual ~CSampleDoc();

protected: DECLARE_MESSAGE_MAP()

};

 

class CSampleView: public CView

{protected: CSampleView();

DECLARE_DYNCREATE(CSampleView)

public: CSampleDoc* GetDocument();

virtual void OnDraw(CDC* pDC);

virtual ~CSampleView();

protected: DECLARE_MESSAGE_MAP()

};

 

// MainFrm.cpp: implementation of the CMainFrame class

#include < afxwin.h>

#include " MainFrm.h"

#include " resource.h"

 

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

END_MESSAGE_MAP()

 

CMainFrame:: CMainFrame(){ }

CMainFrame:: ~CMainFrame(){ }

 

BEGIN_MESSAGE_MAP(CSampleApp, CWinApp)

ON_COMMAND(ID_FILE_NEW, CWinApp:: OnFileNew)

ON_COMMAND(ID_FILE_OPEN, CWinApp:: OnFileOpen)

END_MESSAGE_MAP()

 

CSampleApp:: CSampleApp(){ }

 

CSampleApp theApp;

 

CSampleDoc:: CSampleDoc(){ }

CSampleDoc:: ~CSampleDoc(){ }

 

BOOL CSampleApp:: InitInstance()

{ CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CSampleDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CSampleView));

AddDocTemplate(pDocTemplate);

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

if (! ProcessShellCommand(cmdInfo)) return FALSE;

m_pMainWnd-> ShowWindow(SW_SHOW);

m_pMainWnd-> UpdateWindow();

return TRUE;

}

 

IMPLEMENT_DYNCREATE(CSampleDoc, CDocument)

 

BEGIN_MESSAGE_MAP(CSampleDoc, CDocument)

END_MESSAGE_MAP()

 

BOOL CSampleDoc:: OnNewDocument()

{ if (! CDocument:: OnNewDocument()) return FALSE;

return TRUE; }

 

void CSampleDoc:: Serialize(CArchive& ar)

{ if (ar.IsStoring()) { }

else { }

}

 

IMPLEMENT_DYNCREATE(CSampleView, CView)

 

BEGIN_MESSAGE_MAP(CSampleView, CView)

END_MESSAGE_MAP()

CSampleView:: CSampleView(){ }

CSampleView:: ~CSampleView(){ }

 

void CSampleView:: OnDraw(CDC* pDC) { CSampleDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc); }

 

CSampleDoc* CSampleView:: GetDocument()

{ ASSERT(m_pDocument-> IsKindOf(RUNTIME_CLASS(CSampleDoc)));

return (CSampleDoc*)m_pDocument;

}

9.5 Стандартні ідентифікатори команд, що використовуються у кон-цепції “Документ – вигляд”

Для кожного командного ідентифікатора програми існує стандартний рядок повідомлення, що знаходиться у файлі PROMPTS.RC. Ідентифікатор рядка меню має мати те саме значення, що й ідентифікатор команди. Таблиця 9.1 містить стандартні значення ідентифікаторів і відповідні ним виклики функцій.

 

Таблиця 9.1 – Стандартні ідентифікатори та відповідні ним функції

Позначення ідентифікатора Стандартний виклик функцій Коментар
ID_FILE_NEW CWinApp:: OnFileNew () створює новий порожній документ
ID_FILE_OPEN CWinApp:: OnFileOpen () відкриває існуючий документ
ID_FILE_CLOSE CDocument:: OnFileClose () закриває відкритий документ
ID_FILE_SAVE CDocument:: DoSave () зберігає поточний документ
ID_FILE_SAVE_AS CDocument:: OnFileSaveAs() зберігає поточний документ із іншою назвою
ID_FILE_SAVE_COPY_AS COleServerDoc:: OnFileSaveCopyAs() зберігає копію поточного документа з іншою назвою
ID_FILE_PAGE_SETUP Нема стандартного обробника викликає специфічний для програми діалог встановлення властивостей документа
ID_FILE_PRINT_SETUP CWinApp:: OnFilePrintSetup() викликає стандартний діалог властивостей друку
ID_FILE_PRINT CView:: OnFilePrint () викликає стандартний діалог друку файла
ID_FILE_PRINT_PREVIEW CView:: OnFilePrintPreview () викликає режим перегляду файла перед друком
ID_EDIT_CLEAR CEdit:: Clear() очищує поточний вибір
ID_EDIT_CLEAR_ALL Нема стандартного обробника очищує повний документ
ID_EDIT_COPY CEdit:: Copy() копіює поточний вибір у буфер
ID_EDIT_CUT CEdit:: Cut() вирізає поточний вибір у буфер
ID_EDIT_FIND OnEditFindReplace () починає операцію пошуку
ID_EDIT_PASTE CEdit:: Paste() уставляє поточний вибір з буфера
ID_EDIT_REPEAT   повторює останню операцію
ID_EDIT_REPLACE OnEditFindReplace () починає операцію заміни
ID_EDIT_SELECT_ALL   обирає увесь документ
ID_EDIT_UNDO CEdit:: Undo() відмінює останню здійснену операцію
ID_EDIT_REDO Нема стандартного обробника повторює останню операцію
ID_WINDOW_NEW CMDIFrameWnd:: OnWindowNew() відкриває нове вікно в активному документі
ID_WINDOW_ARRANGE OnMDIWindowCmd() впорядковує піктограми внизу mdi вікна
ID_APP_ABOUT Нема стандартного обробника викликає вікно about
ID_APP_EXIT CWinApp:: OnAppExit () забезпечує вихід з програми
ID_HELP_INDEX CWinApp:: OnHelpIndex () відображує список файла допомоги
ID_HELP_USING CWinApp:: OnHelpUsing () відображує допомогову інформацію про використання файла допомоги
ID_HELP CWinApp:: OnHelp () відображує допомогову інформацію стосовно обраного контексту
ID_DEFAULT_HELP CWinApp:: OnHelpIndex () відображує допомогу за замовчуванням
ID_VIEW_TOOLBAR   переключає стан панелі інструментів з активного на неактивне та навпаки
ID_VIEW_STATUS_BAR   переключає стан рядка стану з активного на неактивний та навпаки

 

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

 

1. Пояснити особливості організації класів програми, побудованій відповідно концепції “Документ-Вигляд”.

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

3. Пояснити термін “серіалізація”.

4. Побудувати проект типу “MFC AppWizard (exe)” та пояснити його складові.







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