//.h
CView *m_pDemoView;
//.cpp 构造函数或OnInitDialog函数
CMainContainer::OnInitDialog() //CDialog才有,像CWnd等没有OnInitDialog可以放在构造函数中,然后OnPaint()函数中改变大小并显示。
{
m_pDemoView = new CDemoView;
ASSERT(m_pDemoView);
if (!((CView*)m_pDemoView)->Create(NULL, NULL, WS_CHILD, CRect(0, 0, 0, 0), this, NULL, NULL))
{
AfxMessageBox(_T("Create view failed"));
return;
}
...
//显示FormView
m_pDemoView->MoveWindow(rect);
m_pDemoView->ShowWindow(SW_SHOW);
m_pDemoView->OnInitialUpdate(); //使用MDI框架创建视图时会自动被框架调用,这里的View是自行创建需要手动调一下
}
大致方法就是这样,先new一个View,然后Create创建,最后显示View。注意:
1、OnInitDialog是CDialog的函数,像CWnd等没有的话可以放在构造函数中,然后在OnPaint()函数中改变大小并显示视图。
2、OnInitialUpdate:使用MDI框架创建视图时会自动被框架调用,这里的View是自行创建的需要手动调一下。
另外:
FrameWnd内创建View的关键步骤:
CCreateContext context;
context.m_pCurrentDoc = GetActiveFrame()->GetActiveDocument();
context.m_pNewViewClass = RUNTIME_CLASS(CxxxView);
m_pChildFrame->LoadFrame(IDR_xxxTYPE, WS_OVERLAPPEDWINDOW, this, &context);
CSplitterWnd创建View:
//.h
CSplitterWnd m_wndSplitterH;
...
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
//.cpp
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CRect rectDummy;
CSize sizeDummy;
GetClientRect(rectDummy);
sizeDummy = rectDummy.Size();
sizeDummy.cy /= 2;
m_wndSplitterH.CreateStatic(this, 2, 1);
if (!m_wndSplitterH.CreateView(0, 0, RUNTIME_CLASS(CAssetsListTabView), sizeDummy, pContext))
{
TRACE0("Failed to create tab view\n");
return FALSE;
}
m_pTabView = (CAssetsListTabView*)m_wndSplitterH.GetPane(0, 0);
if (!m_wndSplitterH.CreateView(1, 0, RUNTIME_CLASS(CDlgPaneCtrl), sizeDummy, pContext))
{
TRACE0("Failed to create list pane\n");
return FALSE;
}
m_pOrderPaneCtrl = (CDlgPaneCtrl*)m_wndSplitterH.GetPane(1, 0);
return TRUE;
}
更多Split用法请参考:《MFC CSplitterWnd的用法详解》。