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