当前位置:C++技术网 > 资讯 > MFC单文档指定视图分割

MFC单文档指定视图分割

更新时间:2016-08-12 20:14:18浏览次数:1+次

比如现在有A,Bl两个View,A是启动项,现在想在B分割视图,怎么操作?

C++技术网解答:

    在文档/视图结构中,视图用来显示文档中的数据,也可对视图进行分割,从而使视图显示不同的信息,并且可以在视图中嵌入控件,进行更多的操作。

    我们用分割的视图来显示不同的内容,通过CSplitterWnd类可以实现视图分割,当改变分割窗口的大小时,窗口的客户区将自动重新绘制。我们可以使用CSplitterWnd类的成员函数CreateStatic来创建一个分割窗口。这个窗口相当于把一个窗口的客户区划分为多个子窗口组成的窗口,如下图所示:

    然而这只是一个形式上的窗口,并不能映射多个视图,不能达到分割视图的效果。当分割的窗口被拖动改变之后,也就意味着分割的视图的大小也就发生了变化,也就可以通知视图更新所有子视图。分割窗口给用户提供了操作的界面接口。

    CSplitterWnd类的成员函数CreateStatic的声明如下:


virtual BOOL CreateStatic(
   CWnd* pParentWnd,
   int nRows,
   int nCols,
   DWORD dwStyle = WS_CHILD | WS_VISIBLE,
   UINT nID = AFX_IDW_PANE_FIRST 
);
     我们可以指定子窗口的行列数,即可决定子窗口的个数。CSplitterWnd类的思想是一个分割的子窗口对应一个分割的视图,这样对应关系很简单。我们现在知道如何创建分割窗口后,下面就是创建分割的子视图来和分割的子窗口对应起来。

    创建视图使用CSplitterWnd类的成员函数CreateView,CreateView函数声明如下:


virtual BOOL CreateView(
   int row,
   int col,
   CRuntimeClass* pViewClass,
   SIZE sizeInit,
   CCreateContext* pContext 
);

     参数和创建子窗口差不多,不过这里的行列号就是我们创建分割子窗口指定的行数和列数之内的值。设置好行列号后,创建好的子视图就会放在指定行列号的分割子窗口中。第三个参数是指定一个CRuntimeClass类指针,也就是我们被分割的视图。第四个参数为视图的初始大小。最后一个参数为环境类指针,在框架创建客户区窗口的CMainFrame::OnCreateClient的参数中会传递这个环境指针。

    为了让CSplitterWnd类一直有效,最好是将框架类中将CSplitterWnd类作为成员对象存在,这样创建的分割窗口和分割视图就不会自动消失了。

    下面是示例代码:


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
    //分割一个2行2列的窗口,m_wndSplitter是在CMainFrame框架类中的CSplitterWnd类对象
    m_wndSplitter.CreateStatic(this, 2, 2);
    //创建相应的子视图
    m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CViewB),CSize(200,200), pContext);
    m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CViewB),CSize(200,200), pContext);
    m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CViewB),CSize(200,200), pContext);
    m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CViewB),CSize(200,200), pContext);
    return TRUE;//设置返回值
    //return CFrameWnd::OnCreateClient(lpcs, pContext);  //不调用基类的方法
}
     实现的效果就是上图所示的两行两列的四个分割窗口和四个分割视图,而且每一个分割窗口对应一个视图。