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

9.4. Додатки mdi, робота з шаблонами

MDI (multi document interface) – це додатки, які можуть працювати з декількома документами одразу. Тобто можна відкрити декілька документів одною програмою. MDI-додаток відображає інформацію як у головному вікні додатку, так і у дочірніх вікнах. Головне вікно є похідним від класу CMDIFrameWnd, а дочірні вікна від класу CMDIChildWnd.

Завдяки класам шаблонів можливо підключити до програми декілька видів документів. Така програма може працювати з різними типами документів.

Якщо додаток створити на основі MDI та додати декілька шаблонів, отримаємо программу, яка може відкривати різні типи документів по декілька вікон в одному головному вікні.

9.4.1. Приклад додатку mdi з одним шаблоном

Створити MDI додаток з використанням MFC AppWizard можливо через меню File → New. На вкладці Projects потрібно вибрати пункт MFC AppWizard (exe) (рис. 9.1). На 1-му кроці виберіть Multiple documents (рис. 9.2).

MFC AppWizard створює для додатку з багатовіконним інтерфейсом декілька основних класів (табл. 9.4):

Таблиця 9.4

Перелік класів додатку MDI з одним шаблоном

Назва класу

Базовий клас

Опис

CMultiApp

CWinApp

Головний клас додатку

CMainFrame

CMDIFrameWnd

Клас головного вікна додатку

CChildFrame

CMDIChildWnd

Клас дочірнього вікна MDI

CMultiDoc

CDocument

Клас документа додатку

CMultiVeiw

CView

Клас виду документа

9.4.2. Приклад додатку mdi з декількома шаблонами

Приклад знаходиться у папці DISK\Structure\MultiTemplate.

Створимо програму на основі MDI-інтерфейсу, з 3-ма шаблонами, дамо їй назву MultiTemplate. Схему цього додатку показано на рис. 9.14.

Рис. 9.14. Схема підключення класів, у додатку MultiTemplate

Додамо новий клас документа CDMultiPredDoc2. В класи документів додамо строкові змінні:

CString str;

Ці змінні заповнимо в конструкторах класів різними даними, щоб на екрані можна було бачити з яким документом працює наш додаток.

Додамо клас виду CDMultiPredView1, та клас CScroll похідний від CScrollView. Коди функцій OnDraw будуть виводити на екран рядки str зі своїх документів:

void CDMultiPredView0::OnDraw(CDC* pDC)

{

CDMultiPredDoc0* pDoc = GetDocument();

pDC->TextOut (10,10,pDoc->str + " Представление 0");

}

void CDMultiPredView1::OnDraw(CDC* pDC)

{

CDMultiPredDoc1* pDoc

= (CDMultiPredDoc1*) GetDocument();

pDC->TextOut (10,10,pDoc->str + " Представление 1");

}

Змінимо перший шаблон і додамо ще 2 шаблона в функцію InitInstance:

BOOL CDMultiPredApp::InitInstance()

{

.............................................................

CMultiDocTemplate*pDocTemplate0

= new CMultiDocTemplate(

IDR_DMULTITYPE0,

RUNTIME_CLASS(CDMultiPredDoc0),

RUNTIME_CLASS(CChildFrame),

// custom MDI child frame

RUNTIME_CLASS(CDMultiPredView0));

AddDocTemplate(pDocTemplate0);

CMultiDocTemplate*pDocTemplate1

= new CMultiDocTemplate(

IDR_DMULTITYPE1,

RUNTIME_CLASS(CDMultiPredDoc1),

RUNTIME_CLASS(CChildFrame),

RUNTIME_CLASS(CDMultiPredView1));

AddDocTemplate(pDocTemplate1);

CMultiDocTemplate*pDocTemplate2

= new CMultiDocTemplate(

IDR_DMULTITYPE2,

RUNTIME_CLASS(CDMultiPredDoc0),

RUNTIME_CLASS(CChildFrame),

RUNTIME_CLASS(CScroll));

AddDocTemplate(pDocTemplate2);

.............................................................

};

Зверніть увагу на константи: IDR_DMULTITYPE0, IDR_DMULTITYPE1 та IDR_DMULTITYPE2, це ідентифікатори рядків і водночас ідентифікатори для меню. За ними кожному класу шаблону співставляється строковий параметр (було описано у п. 9.3), а також меню. Отже для кожного шаблону може бути своє меню.

Як видно з рис. 9.14 всі класи документів та видів співставляються один з одним через клас CChildFrame, тому для зміни видів, для підключення нових типів документів, ми додамо саме в цей клас відповідні функції, які зв’яжемо з відповідними пунктами меню:

void OnTemplate0() – створення файлу на основі 0-го шаблону;

void OnTemplate1() – створення файлу на основі 1-го шаблону;

void OnTemplate2() – створення файлу на основі 2-го шаблону.

Якщо створено 2 та більше шаблонів, то при запуску або відкритті нового документа буде виводитися стандартний MFC-й діалог (рис. 9.15), де буде вказано усі шаблони додані через функцію AddDocTemplate:

Рис. 9.15. Приклад діалогу MFC для вибору шаблону, за яким буде створено новий документ

Розглянемо функції для створення документів за різними шаблонами, без стандартного діалогу вибору шаблона. В цих функціях одразу буде створено новий документ за певним шаблоном:

void CChildFrame::OnTemplate0()

{

per_temp = 0;

CMultiDocTemplate* pDocTemplate;

POSITION pos;

pos = AfxGetApp()->GetFirstDocTemplatePosition();

pDocTemplate = (CMultiDocTemplate*)

AfxGetApp()->GetNextDocTemplate(pos);

pDocTemplate->OpenDocumentFile(NULL);

}

void CChildFrame::OnTemplate1()

{

per_temp = 1;

CMultiDocTemplate* pDocTemplate;

POSITION pos;

pos = AfxGetApp()->GetFirstDocTemplatePosition();

pDocTemplate = (CMultiDocTemplate*)

AfxGetApp()->GetNextDocTemplate(pos);

pDocTemplate = (CMultiDocTemplate*)

AfxGetApp()->GetNextDocTemplate(pos);

pDocTemplate->OpenDocumentFile(NULL);

}

void CChildFrame::OnTemplate2()

{

per_temp = 2;

CMultiDocTemplate* pDocTemplate;

POSITION pos;

pos = AfxGetApp()->GetFirstDocTemplatePosition();

pDocTemplate = (CMultiDocTemplate*)

AfxGetApp()->GetNextDocTemplate(pos);

pDocTemplate = (CMultiDocTemplate*)

AfxGetApp()->GetNextDocTemplate(pos);

pDocTemplate = (CMultiDocTemplate*)

AfxGetApp()->GetNextDocTemplate(pos);

pDocTemplate->OpenDocumentFile(NULL);

}

Ці функції виконують таку послідовність дій: 1) задається вказівка на клас шаблона та змінна для визначення позиції; 2) викликається функція класу шаблона GetFirstDocTemplatePosition для вибору початкової позиції шаблонів; 3) функцією GetNextDocTemplate переходимо на потрібний шаблон; як видно з коду, виклик функції робиться стільки разів, скільки потрібно для переходу на потрібний шаблон; 4) створення нового документа відбувається у функції OpenDocumentFile, параметр NULL вказує саме на необхідність створення нового документа. В цьому параметрі можна вказати шлях до певного файлу на диску, у такому разі відбудеться відкриття існуючого файлу (ім’я функції OpenDocumentFile перекладається як «відкрити файл документа»).

Результат роботи додатку можна бачити на рисунку 9.16:

Рис. 9.16. Вікно додатку MultiTemplate на основі різних шаблонів

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