Creating a View on a Dialog
- You should hide the previous parent window.
- You should override the OnMouseActivate method in your view in order to prevent an assertion in the base implementation
// =============================================
// In the creator window --
// =============================================
// when you want to show the view
void CViewOnDlgView::OnShowdlgBtn()
{
// Add the desired document template
CDocTemplate* pDocTemplate = NULL ;
pDocTemplate = new CMultiDocTemplate(
IDR_INNERVIEW,
RUNTIME_CLASS(CrInnerDoc),
RUNTIME_CLASS(CChildFrame),
// custom MDI child frame
RUNTIME_CLASS(CrInnerView));
AfxGetApp()->AddDocTemplate(pDocTemplate);
// Create an instance of the desired document template
CString processName;
bool bIsFound = false ;
CWinApp* pApp = AfxGetApp();
POSITION curTemplatePos =
pApp->GetFirstDocTemplatePosition();
while (curTemplatePos)
{
pDocTemplate =
pApp->GetNextDocTemplate(curTemplatePos);
if (pDocTemplate)
{
pDocTemplate->GetDocString(processName ,
CDocTemplate::docName);
if ( processName == "InnerView")
{
bIsFound = true ;
break ;
}
else
processName = "";
}
}
if (bIsFound)
pDoc = pDocTemplate->OpenDocumentFile(NULL );
// send a message to the view to move itself to
// the dialog
POSITION pos = pDoc->GetFirstViewPosition();
while (pos)
{
CView* pView = pDoc->GetNextView(pos);
pView->SendMessage(WM_SHOW_ON_DLG, 0, 0);
}
}
// =============================================
// In the view you want to put on the dialog
// =============================================
int CrInnerView::ShowOnDlg(WPARAM wParam, LPARAM lParam)
{
// hiding the previous parent
GetParent()->ShowWindow(SW_HIDE);
// creating the bearer dialog
CrPopupDlg dlg;
dlg.SetView(this );
dlg.DoModal();
return 0;
}
// this method needs to be overridden to prevent
// an assertion
int CrInnerView::OnMouseActivate( CWnd* pDesktopWnd,
UINT nHitTest,
UINT message )
{
return MA_ACTIVATE;
}
// =============================================
// In the bearer dialog
// =============================================
BOOL CrPopupDlg::OnInitDialog()
{
if (m_pView && ::IsWindow(m_pView->m_hWnd))
{
// set this as the view's parent and save
// the old parent
m_pPrevParent = m_pView->SetParent(this );
// resize the view to the measures of the dlg
CRect rect;
GetClientRect(rect);
m_pView->MoveWindow(rect);
}
return TRUE;
}
void CrPopupDlg::SetView(CView* pView)
{
// saves a pointer to the view we want to attach
// to this dlg
m_pView = pView;
}
void CrPopupDlg::OnDestroy()
{
CDialog::OnDestroy();
// set the previous parent window back as active
// parent and destroy both windows
if (m_pPrevParent && ::IsWindow(m_pPrevParent->m_hWnd))
{
m_pView->SetParent(m_pPrevParent);
m_pView->GetParent()->DestroyWindow();
}
}