MFC单文档窗口分隔

在写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();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值