
- •Перелік умовних скорочень
- •2 Створення каркасу mfc-програми
- •2.2 Структура простої mfc – програми
- •3 Діалогові вікна та стандартні елементи керування
- •3.1 Модальні і немодальні діалогові вікна
- •//Зв’язування покажчика ed та ресурсу idc_edit1
- •4 Робота з графікою та текстом
- •5 Спільні елементи керування
- •Int cTabCtrl::SetCurSel(int nItem ); // nItem – номер елемента
- •6 Використання вікон властивостей та майстрів
- •7 Спеціальні типи меню Та їх використання
- •7.1 Загальні відомості про спеціальні типи меню
- •8 РозробкА програм для роботи з незалежними растровими зображеннями
- •8.2 Опис складових структур формату dib
- •8.4 Реалізація функцій класу cDib
- •9 Елементи концепції “документ – вигляд”
- •9.1 Загальні особливості концепції “Документ – вигляд”
- •Приклад 9.1 – Реалізація класу головного вікна відповідно до концепції “Документ – вигляд”
- •Приклад 9.2 – Вигляд класу документа для проекту відповідно до кон-цепції “Документ – вигляд”
- •9.2.4 Створення шаблону документа
- •9.2.5 Ініціалізація програми
- •10 Основи програмування баз даних
- •10.1 Загальні відомості про odbc
- •11 Використання потокової багатозадачності
- •12 Використання графічної бібліотеки opeNgl
- •Визначення парамерів текстури може забезпечуватися командами сімей-ства glTexParameter*():
- •Розробка системи планування робота
- •Післямова
- •Перелік посилань
- •Додаток а
- •Предметний покажчик
- •61166 Харків, просп. Леніна, 14.
9.2.5 Ініціалізація програми
Раніше ми багато разів розглядали послідовність ініціалізації, що має місце у функції ініціалізації С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 Контрольні завдання
Пояснити особливості організації класів програми, побудованій відповідно концепції “Документ-Вигляд”.
Пояснити принципи реалізації динамічного створення об’єктів.
Пояснити термін “серіалізація”.
Побудувати проект типу “MFC AppWizard (exe)” та пояснити його складові.