MFC Dialog中嵌入View、动态创建View的方法

清泛原创
代码如下,亲测有效:
//.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的用法详解》。

MFC CView FrameWnd CSplitterWnd

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部