1. CWnd *pParentWnd - родительское окно. 2. CDocument* pDoc -
документ, для которого вы хотите создать вид. 3. CRect rect - положение вида
на родителе. 4. CRuntimeClass* pViewClass - runtime class нового вида. 5.
UINT nViewID - идентификатор вида на его родителе.
Вот такая функция
по этим параметрам создаст новый вид:
CView* CreateDlgView(CWnd *pParentWnd, CDocument* pDoc, CRect rect, CRuntimeClass* pViewClass, UINT nViewID)
{
// Сначало мы создаем экземпляр класса вида.
CView* pView = (CView*) pViewClass->CreateObject();
// Теперь для создания вида нам нужно заполнить структуру CCreateContext
CCreateContext CreateContext;
CreateContext.m_pCurrentDoc = pDoc; // Документ, для которого создаем вид.
CreateContext.m_pCurrentFrame = NULL;
CreateContext.m_pLastView = NULL;
CreateContext.m_pNewDocTemplate = pDoc->GetDocTemplate(); // Шаблон документа.
CreateContext.m_pNewViewClass = pViewClass; // runtime class вида.
// Вот здесь мы создаем окно вида на его родителе.
if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
rect, pParentWnd, nViewID, &CreateContext))
{
return NULL;
}
// Первая функция, которую мы должны вызвать после создания вида, это OnInitialUpdate()
pView->OnInitialUpdate();
// Перерисуем вид.
pView->RedrawWindow();
// И все готово. Теперь мы можем его использовать как обычный контрол.
return pView;
}
Примечание: Когда уничтожается документ, он удаляет все
виды, привязанные к нему. При удалении, вида, документ ищет среди родителей вида
первый попавшийся фрейм и уничтожает. Такая ситуация чревата опасностями. Когда
я делал в MDI приложении дополнительный вид справа для каждого документа, то
столкнулся с ситуацией когда при закрытии одного из документов у меня
закрывалось все приложение. Проблема оказалась в том, что мой дополнительный вид
расположен на контрол баре, который расположен на главном фрейме. При закрытии
одного из документов, этот документ сначала удалял главный вид и CChildFrame, на
котором этот вид расположен. Потом документ удалял второй, дополнительный вид,
ближайшим родительским фреймом для которого, был CMainFrame. Соответственно он
удалял главное окно приложения.
Происходит это в функции void
CDocument::OnCloseDocument(). Вот кусок кода из нее, в которой удаляются все
виды и их фреймы.
while (!m_viewList.IsEmpty())
{
// get frame attached to the view
CView* pView = (CView*)m_viewList.GetHead();
ASSERT_VALID(pView);
CFrameWnd* pFrame = pView->GetParentFrame();
ASSERT_VALID(pFrame);
// and close it
PreCloseFrame(pFrame);
pFrame->DestroyWindow();
// will destroy the view as well
}
Если переопределить эту функцию, то
можно избежать такой ситуации.