Chinaunix首页 | 论坛 | 博客
  • 博客访问: 408408
  • 博文数量: 51
  • 博客积分: 2030
  • 博客等级: 大尉
  • 技术积分: 1109
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-15 08:11
文章分类

全部博文(51)

文章存档

2022年(1)

2016年(2)

2015年(1)

2014年(2)

2013年(4)

2011年(9)

2010年(2)

2009年(5)

2008年(14)

2007年(11)

我的朋友

分类: 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);

通过以上代码即给单文档应用程序添加了四张视图。其中的 viewclass1viewclass2位于同一个Frame的两个窗口,即视图分割。参数 700 表明此处的视图位于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);

/// 以上红色字体为添加的代码,目的是使的分割ID7的窗口的第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);

}

}

阅读(3729) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~