全部博文(51)
分类: C/C++
2014-05-22 14:03:39
单文档同样可以显示多张视图,即在单文档应用程序类里在应用程序实例化函数InitInstance里通过添加文档模板函数 AddDocTemplate(pDocTemplate);来给应用程序添加多个文档模板就可以了。当然同一个时刻只能显示一张视图,但如果进行视图分割,在同一时刻则可以显示多张视图。当然在添加了多张视图以后,当要显示某张视图时,需要做视图切换才可以。这个动作可以同坐在MainFrm类里要做命令映射来实现。如
ON_COMMAND_RANGE(ID_VIEW_BEGIN, ID_VIEW_END,&CMainFrame::OnChangeView),MainFrm头文件里需要做函数声明 afx_msg void OnChangeView(UINT viewID);
例如:添加视图
pDocTemplate = new CSDIDocTemplate(
ID_VIEW_FINANCING,
RUNTIME_CLASS(docclass),
RUNTIME_CLASS(frameclass),
RUNTIME_CLASS(viewclass1),7,0,0);
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
pDocTemplate = new CSDIDocTemplate(
ID_VIEW_FINANCING,
RUNTIME_CLASS(docclass),
RUNTIME_CLASS(frameclass),
RUNTIME_CLASS(viewclass2),7,1,0);
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
pDocTemplate = new CSDIDocTemplate(
ID_VIEW_FINANCING,
RUNTIME_CLASS(docclass),
RUNTIME_CLASS(frameclass),
RUNTIME_CLASS(viewclass3));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
pDocTemplate = new CSDIDocTemplate(
ID_VIEW_FINANCING,
RUNTIME_CLASS(docclass),
RUNTIME_CLASS(frameclass),
RUNTIME_CLASS(viewclass4));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
通过以上代码即给单文档应用程序添加了四张视图。其中的 viewclass1,viewclass2位于同一个Frame的两个窗口,即视图分割。参数 7,0,0 表明此处的视图位于freme的第0行第0列。
参数7,1,0表明此处的视图位于frame的第1行第0列。7是视图分割ID。这样程序运行时就在同一个窗口里可以同时看到两张视图的内容。即把当前窗口分割成了两行1列。默认
/// 视图切换函数
void CMainFrame::OnChangeView(UINT viewID)
{
switch(viewID)
{
case ID_VIEW1:
{
ActivateView(RUNTIME_CLASS(CView1));
break;
}
case ID_VIEW2:
{
ActivateView(RUNTIME_CLASS(CView2));
break;
}
default:
break;
}
这对映射的ID写事件处理函数就可以切换视图了。
默认情况下MFC对视图的分割规则是 :每个视图的高度 = 客户区的总高度 / 总行数
每个视图的宽度 = 客户区的总宽度 / 总列数
如果要改变默认的分割大小则需要修改SDIFrame里的 OnCreateClient函数里的代码
代码如下
while (TmpPos)
{
CSDIDocTemplate* pTemplate = (CSDIDocTemplate*)pApp->GetNextDocTemplate(TmpPos);
if (pTemplate->m_nSplitterID == nID)
{
// create view
int nRow = pTemplate->m_nRow, nCol = pTemplate->m_nCol;
if ( 7 == nID && 0 == nRow && 0 == nCol )
{
cy += 80;
}
CSize sizeDefault(cx, cy);
/// 以上红色字体为添加的代码,目的是使的分割ID为7的窗口的第0行第0列的高度比默认的高度高80个像素
pContext->m_pNewDocTemplate = pTemplate;
pContext->m_pNewViewClass = pTemplate->GetViewClass();
if (!m_SplitInfo[nID].m_wndSplitter.CreateView(nRow, nCol,
pContext->m_pNewViewClass, sizeDefault, pContext))
return FALSE;
Template->m_pView = (CView*)m_SplitInfo[nID].m_wndSplitter.GetPane(nRow, nCol);
}
}