Шаг 199 - Шаблоны, документы и работа с ними

Суть этого шага сводится к проблеме как нам получить все шаблоны существующие в документе и документы связанные с этими шаблонами. Общая структура в 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()); 
		  }
	  }
	}	
}
}

Вот так можно получить список, например, всех возможно открытых документов из шаблонов. И вообще проводить групповые действия над всеми открытыми документами. Например, печатать все :-). Или закрыть или сохранить :-). Хорошо это.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.