Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TPG_BOOK_02_02.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.74 Mб
Скачать

Приклад 9.1 – Реалізація класу головного вікна відповідно до концепції “Документ – вигляд”

сlass CMainFrame : public CFrameWnd

{DECLARE_DYNCREATE(CMainFrame)

public: CMainFrame ();

DECLARE_MESSAGE_MAP()

};

Клас документа породжується від класу CDocument. Він також містить макрос DECLARE_DYNCREATE() для забезпечення динамічного створення об’єктів. Також клас документа у складі містить карту повідомлень усіх команд, пов’язаних із змінами стану документа. Функції класу мають забезпечувати обробку даних документа.

Деякі функції класу CDocument мають перевизначатися. Наприклад, функція virtual BOOL CDocument::OnNewDocument();

Доволі часто наново визначається також і функція Serialize(). Приклад 9.2 ілюструє створення класу документа.

Приклад 9.2 – Вигляд класу документа для проекту відповідно до кон-цепції “Документ – вигляд”

class CSampleDoc : public CDocument

{DECLARE_DYNCREATE(CSampleDoc)

public:

CSampleDoc();

BOOL OnNewDocument();

void Serialize(Carchive &arch);

DECLARE_MESSAGE_MAP()

};

Клас вигляду забезпечує керування відображенням документа. Об’єкт класу перекриває об’єкт головного вікна програми і забезпечує виконання основних функцій. При цьому такі операції, як зміна розміру вікна та згортання-розгортання все-таки залишаються за класом головного вікна та його обробниками. Клас вигляду є нащадком класу CView або будь-якого дочірнього до CView класу (наприклад CScrollView). Клас вигляду також оголошується динамічним і містить макрос DECLARE_DYNCREATE().

Клас СView містить ряд корисних функцій. Під час створення програми не обов’язково перевизначати більшість з них. Але одна функція – OnDraw() має перевизначатися завжди. OnDraw() викликається якщо вигляд документа програми має оновлюватися і у цьому сенсі нагадує функцію OnPaint(). OnDraw() має такий прототип:

virtual void CView::OnDraw ( CDC* pDC ) = 0;

де pDC – є покажчиком на контекст пристрою, що має використовуватися для відображення документа. Зазначимо, що раніше у функції OnPaint() було необхідно отримувати поточний контекст пристрою вікна, а у функції OnDraw() він є параметром за замовчуванням. Функція OnDraw() має перевизначатися у кожному класі, дочірньому від СView.

Приклад 9.3 демонструє вигляд класу вигляду у своїй найстислішій формі.

Приклад 9.3 – Клас вигляду відповідно до концепції “Документ – вигляд”

сlass CSampleView : public CView

{DECLARE_DYNCREATE(CSampleView)

public: void OnDraw(CDC *dc);

DECLARE_MESSAGE_MAP()

};

Для забезпечення увімкнення режиму динамічного створення об’єктів необхідно, по-перше, додати макроси DECLARE_DYNCREATE() до описів відповідних створюваних класів, по-друге, – додати у програмний файл макрокоманди IMPLEMENT_ DYNCREATE() для класів вікна, вигляду та документа:

IMPLEMENT_ DYNCREATE(CMainFrame, CFrameWnd)

IMPLEMENT_ DYNCREATE(CSampleView, CView)

IMPLEMENT_ DYNCREATE(CSampleDoc, CDocument)

9.2.4 Створення шаблону документа

Породжені класи документа, вигляду, головного вікна мають об’єднуватися у шаблоні документа.

Шаблон SDI-документа є об’єктом класу CSingleDocTemplate. Його конструктор має вигляд:

CSingleDocTemplate::CSingleDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass );

Параметрами конструктора є:

nIDResource – що визначає ідентифікатор ресурсів, які використовуються необхідним типом документа (може містити меню, піктограми, акселератори та ресурси у вигляді рядків тексту);

pDocClass – покажчик на динамічно створюваний об’єкт класу документа; цей клас є спадкоємцем CDocument, що визначається для подання документів програми;

pFrameClass – покажчик на динамічно створюваний об’єкт класу го-ловного вікна; цим класом може бути клас, породжений від CFrameWnd або безпосередньо сам клас CFrameWnd, якщо головне вікно програми успадковує усі властивості CFrameWnd за замовчуванням;

pViewClass – покажчик на динамічно створюваний об’єкт класу вигляду; клас виводиться з CView і має на меті відображення документів проекту.

Ресурс у вигляді рядка складається з підрядків (кількістю до семи), що відокремлюються один від одного символом '\n' символ (символ '\n' також використовується як заповнювач, якщо підрядок є порожнім). У підрядках описується тип документа. Приклад ресурсного рядка наведений у прикладі 9.4:

Приклад 9.4 – Приклад опису ресурсного рядка

// MYCALC.RC

STRINGTABLE PRELOAD DISCARDABLE

BEGIN

IDR_MAINFRAME "MyCalc Windows Application \nSheet \nWorksheet

\n Worksheets (*.myc) \n.myc \nMyCalcSheet \n MyCalc Worksheet"

END

Ресурсний рядок складається з таких елементів:

  1. заголовок вікна;

  2. ім’я документа за замовчуванням (інакше - Untitled);

  3. ім’я типу документа;

  4. ім’я фільтра файлів (“File of type”);

  5. розширення файлів документа (наприклад “*.txt”);

  6. ідентифікатор файла у базі даних реєстрації;

  7. імена типу файла у базі даних реєстрації.