在写MFC单文档程序的时候,常常会用到窗口分隔,以下提供窗口分隔的方法给大家参考。
1.首先,新建任意单文档工程,Style选择标准MFC;
2.在MainFrm.h中,添加如下声明:
public:
CSplitterWnd m_mainsplitter;
CSplitterWnd m_leftsplitter;
CSplitterWnd m_leftmiddlesplitter;
CSplitterWnd m_rightmiddlesplitter;
CSplitterWnd m_rightsplitter;
BOOL m_bSplitter;
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
3.在MainFrm.cpp中,添加如下代码,记得把CXXView更改成对应的View:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
//窗口的分割
//autumoon
if(m_mainsplitter.CreateStatic(this,1,4)==FALSE)
{
return FALSE;
}
m_bSplitter = TRUE;
//绑定视图
CRect cRect;
GetClientRect(&cRect);
if(m_mainsplitter.CreateView(0,0,RUNTIME_CLASS(CShowSelInfoView),
CSize(cRect.Width()/2,cRect.Height()/2),pContext)==FALSE)
{
return FALSE;
}
if(m_mainsplitter.CreateView(0,1,RUNTIME_CLASS(CShowSelInfoView),
CSize(cRect.Width()/4,cRect.Height()),pContext)==FALSE)
{
return FALSE;
}
if(m_mainsplitter.CreateView(0,2,RUNTIME_CLASS(CShowSelInfoView),
CSize(cRect.Width()/4,cRect.Height()),pContext)==FALSE)
{
return FALSE;
}
if(m_mainsplitter.CreateView(0,3,RUNTIME_CLASS(CShowSelInfoView),
CSize(0,cRect.Height()),pContext)==FALSE)
{
return FALSE;
}
return TRUE;
}
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
CRect crFram;
GetClientRect(&crFram);
if(m_bSplitter)
{
//定义分割窗口的初始大小
m_mainsplitter.SetColumnInfo(0,crFram.Width()/2 - 100 > 0 ? crFram.Width()/2 - 100 : 0,10);
m_mainsplitter.SetColumnInfo(1,200,10);
m_mainsplitter.SetColumnInfo(2,crFram.Width()/2 - 100 > 0 ? crFram.Width()/2 - 100 : 0,10);
m_mainsplitter.SetColumnInfo(3,0,10);
m_mainsplitter.RecalcLayout();
}
}
4.在MainFrm.h中添加头文件 #include "XXView.h"
5.重要的一步,在XXView中添加一个Doc声明,class CXXDoc;
6.编译。
不出意外话,窗口分隔成功,但是该窗口并不能随着窗口的拖动而变化,原因在于OnSize()函数消息没有添加。
这部分的内容就作为家庭作业自己解答吧(¬_¬),提示使用Ctrl+Shift+X可以快速添加消息响应。
以下,附带一个横竖四个窗口的分隔代码,供参考。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
//窗口的分割
//autumoon
//创建一个静态分栏窗口,分为一行二列
if(m_mainsplitter.CreateStatic(this,1,2)==NULL)
return FALSE;
CRect rect;
GetClientRect(rect);
//将CCSplitterWndView连接到0行0列窗格上
m_mainsplitter.CreateView(0,0,RUNTIME_CLASS(CTifMegerDocView),CSize(rect.Width() - BLOCK_SIZE > 0 ? rect.Width() - BLOCK_SIZE : 0, rect.Height()), pContext);
if(m_rightsplitter.CreateStatic(&m_mainsplitter,2,1,WS_CHILD|WS_VISIBLE,
m_mainsplitter.IdFromRowCol(0, 1))==NULL)
return FALSE; //将第0行1列再分开2行1列
//将FormView1类连接到第二个分栏对象的0行0列
m_rightsplitter.CreateView(0,0,RUNTIME_CLASS(CTifMegerDocView),CSize(BLOCK_SIZE, rect.Height() - BLOCK_SIZE),pContext);
//将FormView2类连接到第二个分栏对象的1行0列
m_rightsplitter.CreateView(1,0,RUNTIME_CLASS(CTifMegerDocView),CSize(BLOCK_SIZE, BLOCK_SIZE),pContext);
return TRUE;
}
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
CRect crFram;
GetClientRect(crFram);
if(m_bSplitter)
{
//定义分割窗口的初始大小
m_mainsplitter.SetColumnInfo(0, crFram.Width() - BLOCK_SIZE > 0 ? crFram.Width() - BLOCK_SIZE : 0, 10);
m_mainsplitter.SetColumnInfo(1, BLOCK_SIZE, 10);
m_rightsplitter.SetRowInfo(0, crFram.Height() - BLOCK_SIZE, 10);
m_rightsplitter.SetRowInfo(1, BLOCK_SIZE, 10);
m_mainsplitter.RecalcLayout();
}
}