Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

1.4. Короткий опис mdi програми

MDI-додаток має меню, але дозволяє користувачеві одночасно працювати більш ніж з одним документом. У цьому розділі будуть розглянуті тексти програм, які створює AppWizard при виборі такого виду програми. При цьому вибирається наступне налаштування: відсутня підтримка операцій з базами даних та складеними документами, але є панель інструментів та рядок стану, оперативна довідка, коментарі в тексті програми, функції з бібліотеки MFC підключені у вигляді DLL-модулів. Як і у випадку із SDI-додатком, це налаштування AppWizard пропонує за замовчуванням на всіх етапах після першого. Основна увага в цьому розділі приділяється відмінностям у тексті програм від розглянутого в попередньому розділі SDI-додатку. За допомогою майстра AppWizard створимо додаток FirstMDI. При цьому створюється шість класів, назви яких перераховані нижче.

CAboutDlg – клас діалогу для вікна About.

CFirstMDIApp – клас для програми в цілому, породжений CWinApp.

CFirstMDIDoc – клас документа.

CFirstMDIView – клас виду.

CMainFrame – клас фрейму вікна.

CChildFrame – клас вікна, який зв’язує між собою класи документа та вікна виду.

Заголовок Арр-класу додатку представлений нижче:

FirstMDI.h - головний файл заголовка для програми FirstMDI

// FirstMDI.h: Головний файл заголовка для програми FIRSTMDI

//

#if !defined(AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_)

#define AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_

#if _MSC_VER >= 1000

#pragma once

#endif // _MSC_VER >= 1000

#ifndef __AFXWIN_H__

#error включення stdafx.h передує включенню цього файлу для РСН

#endif

#include "resource.h" // Головні символи.

/////////////////////////////////////////////////////////////////////////////

// CFirstMDIApp:

// Використання цих класів наводиться в FirstMDI.cpp.

//

class CFirstMDIApp: public CWinApp

{

public:

CFirstMDIApp();

// Перевантаження.

// Перевантажені віртуальні функції,

// сформовані ClassWizard-ом.

//{{AFX_VIRTUAL(CFirstMDIApp).

public:

virtual BOOL InitInstance();

//}}AFX_VIRTUAL

// Реалізація.

//{{AFX_MSG(CFirstMDIApp)

afx_msg void OnAppAbout();

// УВАГА!! Тут ClassWizard буде додавати і

// видаляти функції-члени.

// не редагуйте текст у цих блоках!

//}} AFX_MSG

DECLARE_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ буде вставляти додаткові

// оголошення перед попереднім рядком.

#endif // !defined(AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_)

У чому ж відмінність цього файлу від FirstSDI.h? Тільки в іменах класів. Навіть конструктор той же самий. Функція OnAppAbout() в точності повторює варіант для SDI-додатків. Текст функції InitInstance() наступний:

BOOL CFirstMDIApp::InitInstance()

{

AfxEnableControlContainer();

// Стандартна ініціалізація.

// Якщо ви не будете використовувати цю функцію або

// бажаєте зменшити розмір виконуваного модуля,

// видаліть ті із наступних нижче підпрограм

// ініціалізації, у яких немає необхідності.

#ifdef _AFXDLL

Enable3dControls(); // Цю функцію слід викликати у тому

// випадку, якщо використовуються DLL-модулі MFC.

#else

Enable3dControlsStatic(); // Цю функцію слід викликати

// у тому випадку, якщо функції з MFC

// прикомпоновуються статично.

#endif

// Змініть ключ реєстрації, під яким зберігаються

// установки.

// Цей рядок потрібно змінити відповідно найменуванню

// вашої фірми або організації.

SetRegistryKey(_T("Local AppWizard-Generated Applications")

LoadStdProfileSettings(); // Завантажити стандартний

// файл опцій INI (включаючи MRU).

// Зареєструвати шаблон документа. Шаблон документа

// служить в якості сполучної ланки між документами,

// фреймом вікна і видами.

CMultiDocTemplate* pDocTemplate;

pDocTemplate = new CMultiDocTemplate(

IDR_FIRSTMTYPE,

RUNTIME_CLASS(CFirstMDIDoc),

RUNTIME_CLASS(CChildFrame), // Фрейм дочірніх вікон MDI.

RUNTIME_CLASS(CFirstMDIView));

AddDocTemplate(pDocTemplate);

// Створити фрейм головного MDI-вікна.

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame->LoadFrame(IDR_MAINFRAME))

return FALSE;

m_pMainWnd = pMainFrame;

// Розбиття командного рядка для команд оболонки, DDE

// і відкриття файлів.

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

// Розподілити функції, задані в командному рядку,

if (!ProcessShellCommand(cmdInfo))

return FALSE;

// Головне вікно програми ініціалізований, так що можна

// показати і поновити його.

pMainFrame->ShowWindow(m_nCmdShow);

pMainFrame->UpdateWindow();

return TRUE;

}

У чому ж різниця? Тут допоможе WinDiff – засіб, який входить до складу Visual C++ і викликати який можна з меню Tools (Інструменти). Використовуючи WinDiff, порівняйте версії функції InitInstance() в файлах програм додатків FirstSDI та FirstMDI. Після порівняння видно, що, крім імен класів, є такі відмінності.

• MDI-додаток формує екземпляр класу CMultiDocTemplate, a SDI-додаток – класу CSingleDocTemplate. Докладно про це буде розказано у розділі 9.

• MDI-додаток організовує головне вікно і потім виводить його на екран.

• має місце клас дочірнього вікна MDI-додатку CChildFrame, який зв’язує між собою класи документа та вікна виду (у SDI-додатку це клас головного вікна CMainFrame).

Це порівняння дає чітке уявлення про переваги парадигми Документ/Вид – досить серйозна відмінність у функціонуванні програми досягається невеликими фрагментами текстів програм проекту, причому наскільки це можливо всі подробиці їх реалізації приховані від розробника.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]