Как создать дополнительные Виды при помощи
функции CreateNewFrame()
Функция CDocTemplate::CreateNewFrame() создаёт
дополнительные виды (views) документа в приложении
MDI, написанном с использованием Microsoft Foundation Class
Library. Прототип функции CreateNewFrame() выглядит
следующим образом:
CFrameWnd * CDocTemplate::CreateNewFrame(CDocument *, CFrameWnd *)
Для вызова этой функции необходимо указать ей
два парметра: указатель на объект CDocument (документ,
для которого функция создаст вид) и указатель на
фреймовое окно, свойства которого будут
продублированы. Как правило, второй параметр
функции NULL.
Когда приложение вызывает CreateNewFrame(), то
создаётся новое фреймовое окно и вид в этом окне.
Тип фреймового окна и тип вида зависят от шаблона
документа (CDocTemplate), связанного документом,
указанным при вызове функции CreateNewFrame().
Чтобы лучше понять использование CreateNewFrame(),
давайте рассмотрим два примера.
Первый пример, это файл WINMDI.CPP в исходном коде
Microsoft Foundation Class Library. WINMDI.CPP объявляет функцию
CMIDFrameWnd::OnWindowNew() которая вызывает CreateNewFrame() для
добавления дополнительного фрейма и вида для
указанного документа. Приложение вызывает
OnWindowNew() каждый раз, когда пользователь выбирает
New в меню приложения MDI.
Функция OnWindowNew() содержит две существенные
строчки:
CFrameWnd * pFrame =
pTemplate->CreateNewFrame(pDocument, pActiveChild);
pTemplate->InitialUpdateFrame(pFrame, pDocument);
Этот код создаёт и отображает новый фрейм и вид
документа.
Другой пример, это файл DOCMULTI.CPP, который так же
находится в исходном коде MFC. Функция
CMultiDocTemplate::OpenDocumentFile() включает в себя следующий
код:
CFrameWnd * pFrame = CreateNewFrame(pDocument, NULL);
ЗАМЕЧАНИЕ: Второй параметр равен NULL, так как
функция OpenDocumentFile() предполагает, что программист
не заинтересован в дублировании других фреймов,
которые содержат Виды этого документа.
Пример CHKBOOK так же демонстрирует создание
дополнительных фреймов и видов документов. В
CHKBOOK.CPP, функция CChkBookApp::OpenDocumentFile() включает в себя
следующий код:
CChkBookDoc * pDoc =
(CChkBookDoc*)CWinApp::OpenDocumentFile(lpszFileName);
if (pDoc == NULL)
return NULL;
CMDIChildWnd * pframe =
((CMDIFrameWnd *)AfxGetApp()->m_pMainWnd)->MDIGetActive();
CFrameWnd * pNewFrame =
m_pCheckViewTemplate->CreateNewFrame(pDoc, NULL);
if (pNewFrame == NULL)
return pDoc;
m_pCheckViewTemplate->InitialUpdateFrame(pNewFrame, pDoc);
Далее идут две причины, по которым Вы
используете CreateNewFrame():
- Исходный код CDocTemplate::CreateNewFrame() содержится в
DOCTEMPL.CPP. Он включает следующее:
if (!pFrame->LoadFrame(m_nIDResource,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, // стили фрейма поумолчанию
NULL, &context)
Так как этот код создаёт фреймовое окно с NULL в
качестве родителького окна, то MFC в качестве
родительского окна использует главное окно
приложения.
- CreateNewFrame() создаёт как фрейм так и Вид, а не только
Вид.
Если по некоторым причинам, CreateNewFrame() не совсем
соответствует Вашим целям, то её исходный код
очень полезен для представления себе механизма
создания фреймов и видов.
|