Суть этого шага сводится к проблеме как нам получить все шаблоны существующие в документе и документы связанные с этими шаблонами. Общая структура в MFC представляет из себя дерево, которое из двух уровней. В CWinApp мы можем получать шаблоны, а из шаблонов документы.
CWinApp -> CDocTemplate ........ CDocTemplate -> CDocument .........
Ну давайте попробуем ? Создайте приложение MDI, просто выберите тип и нажмите Finish и все. Потом создайте пункт в меню, к которому мы с Вами привяжем демонстрационный код. Реакция на событие пусть будет в классе документа.
///////////////////// // CMy22Doc commands void CMy22Doc::OnViewInfomdi() { }
Итак, нам нужно получить указатель на все шаблоны, которые есть у нас в документе. Такая возможность есть в классе WinApp, значит нам нужно сначала на него получить указатель.
void CMy22Doc::OnViewInfomdi() { CWinApp* MyApp=AfxGetApp(); }
Теперь можно получить указатель и на шаблон документов. Это можно сделать функцией GetFirstDocTemplatePosition. Если шаблона нет, то вернется NULL - это есть начальная позиция для перебора.
void CMy22Doc::OnViewInfomdi() { // Step1 CWinApp* MyApp=AfxGetApp(); // Step2 POSITION pos; pos=MyApp->GetFirstDocTemplatePosition(); if (pos!=NULL) { AfxMessageBox("Yes Template"); } }
Вот теперь мы спокойно можем идти по всем шаблонам используя функцию GetNextDocTemplate. Эта функция и обносит указатель, который при ситуации, что шаблона больше нет станет NULL.
void CMy22Doc::OnViewInfomdi() { // Step1 CWinApp* MyApp=AfxGetApp(); // Step2 POSITION pos; pos=MyApp->GetFirstDocTemplatePosition(); // Step 3 while (pos!=NULL) { CDocTemplate* cd=MyApp->GetNextDocTemplate(pos); } }
Теперь мы можем получать документы из шаблона и из свойства. Общая логика опять повторяется.
void CMy22Doc::OnViewInfomdi() { // Step1 CWinApp* MyApp=AfxGetApp(); // Step2 POSITION pos; pos=MyApp->GetFirstDocTemplatePosition(); // Step 3 while (pos!=NULL) { CDocTemplate* cd=MyApp->GetNextDocTemplate(pos); // Step 4 if (cd!=NULL) { POSITION DocPos; DocPos=cd->GetFirstDocPosition(); while (DocPos!=NULL) { CDocument* cdoc=cd->GetNextDoc(DocPos); if (cdoc!=NULL) { AfxMessageBox(cdoc->GetTitle()); } } } } }
Вот так можно получить список, например, всех возможно открытых документов из шаблонов. И вообще проводить групповые действия над всеми открытыми документами. Например, печатать все :-). Или закрыть или сохранить :-). Хорошо это.