窗口切分

      这几天用到了窗口的切分,开始时很迷惑,也找了很多资料,但始终没有找到很理想的代码。几天过去了,思路也渐渐清晰了些。下面把我对窗口切分的理解跟大家分享一下,还请各位多多指正。。

 

1. 动态切分窗体

1). 首先利用AppWizard创建工程项目时在第4部中选中"Advanced Options"对话框中的"Use splut window"选项

2).

//in file: MainFrame.h   class:CMainFrame

protected:

CSplitterWnd m_wndSplitter;

3).

MFC机制重写了OnCreateClient()函数,代码如下:

//in file: MainFrame.cpp

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*LPCS*/,

CCreateContext* pContext)

{

        return m_wndSplitter.Create(this,

        2,2,                                //TODO:adjust the number of rows,columns

        CSize(10,10),                //TODO:adjust the minimum pane size

        pContext);

}

 

2.静态切分窗体

1).

//in file: MainFrame.h   class:CMainFrame

protected:

CSplitterWnd m_wndSplitter;

2).

//in file: MainFrame.cpp

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
     //创建一个静态切分窗口,分为1行2列
     CRect rect;
     GetClientRect(rect);
     if(m_wndSplitter.CreateStatic(this,1,2)==NULL)     //将当前视图分隔为1行2列
          return FALSE;
     //第一个视图的创建

     m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CFrame_OpenGLView),CSize(300,0)),pContext);
     //第二个视图的创建 
     m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyView),CSize(0,0),pContext);
     

     return TRUE; 
}

注:其中CreateView()的第四个参数为 子窗口显示的最小尺寸

 

3.窗体的静态嵌套切分

1).

//in file: MainFrame.h   class:CMainFrame

protected:

CSplitterWnd m_wndSplitter1;

CSplitterWnd m_wndSplitter2;

2).

//in file: MainFrame.cpp

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
     //创建一个静态切分窗口,分为1行2列
     CRect rect;
     GetClientRect(rect);
     if(m_wndSplitter1.CreateStatic(this,1,2)==NULL)     //将当前视图分隔为1行2列
          return FALSE;

     //第一个视图的创建 
     m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CFrame_OpenGLView),CSize(rect.Width()*1/4,rect.Height()),pContext);
 
     //创建第二个切分窗口,以2行1列的方式嵌入到第一个切分窗口的第一行第二列(0,1)视图中

     if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHILD | WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0,1))==NULL)
          return FALSE;

     //第二个视图的创建
     m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CMyView),CSize(rect.Width()*3/4,rect.Height()*3/4),pContext);
     //第三个视图的创建

     m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CTextView),CSize(rect.Width()*3/4,rect.Height()*1/4),pContext);

     

     //设定初始化后当前激活状态的视图为第一个1行1列的(0,1)

     SetActiveView((CFrame_OpenGLView*) m_wndSplitter1.GetPane(0,1));

 

     return TRUE; 
}

你可能感兴趣的:(File,null,Class)