MFC基于单文档分割窗口

创建一个MFC单文档应用程序命名为test

打开资源管理器Dialog,右击鼠标,插入两个对话框选择基于CFormView类

属性style改为child,broad改为none

在对话框中插入类,分别命名为cDialogData,cDialogA.

打开类视图,右击CMainFrm类,选择属性,重写OnCreateClient函数。

在MainFrm.h中加入CSplitterWnd m_wndSplitter;
    CSplitterWnd m_wndSplitter2;的定义

在MainFrm.cpp中加入头文件DialogData.h和DialogA.h

在OnCreateClient函数中添加以下代码

	// 创建静态分割窗口,一行两列
	if(!m_wndSplitter.CreateStatic(this, 1, 2))
		return FALSE;

  //再把左边窗口分为两行一列
	  if(m_wndSplitter2.CreateStatic(&m_wndSplitter,2,1,WS_VISIBLE|WS_CHILD, 
	      m_wndSplitter.IdFromRowCol(0, 0))==NULL) 
	      return FALSE; //将第0行0列再分开2行1列 

	// 创建右面窗格中的视图
	if(!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CDialogA),CSize(200,1000), pContext))
		return FALSE;

	  // 创建左上面窗格中的视图
	  if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CyyyView),CSize(800, 800), pContext)) 
		  return FALSE;
	 
	  // 创建左下面窗格中的视图
	  if(!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(cDialogData),CSize(800, 200), pContext))
		  return FALSE;

	  /* if(!m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CDialogA),CSize(200, 800), pContext))
	  return FALSE;*/
	  CRect r;
	  GetClientRect(&r);
	  m_wndSplitter.SetColumnInfo( 0, r.Width()/3, 0 );
	  //m_wndSplitter.SetColumnInfo( 0, r.Width()/3, 1 );
	  m_wndSplitter.RecalcLayout();
	  m_wndSplitter2.SetRowInfo(0,r.Height()/2,0);
	  m_wndSplitter2.SetRowInfo(1,r.Height()/2,0);
	  m_wndSplitter2.RecalcLayout();

就分好了,但是为什么不加入

  CRect r;
	  GetClientRect(&r);
	  m_wndSplitter.SetColumnInfo( 0, r.Width()/3, 0 );
	  //m_wndSplitter.SetColumnInfo( 0, r.Width()/3, 1 );
	  m_wndSplitter.RecalcLayout();
	  m_wndSplitter2.SetRowInfo(0,r.Height()/2,0);
	  m_wndSplitter2.SetRowInfo(1,r.Height()/2,0);
	  m_wndSplitter2.RecalcLayout();

这些设置窗口大小的函数时总是报错,而且运行不出来view区域。

这样运行出来的效果如MFC基于单文档分割窗口_第1张图片图所示。

如果想要设置每个窗口的大小随意变动,则要

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	// TODO: 在此添加专用代码和/或调用基类
	//CRect rc;
	 获取框架窗口客户区的CRect 对象
	//GetClientRect(&rc);

	// 创建静态分割窗口,一行两列
	if(!m_wndSplitter.CreateStatic(this, 1, 2))
		return FALSE;
	//窗口的再分割
	 if(m_wndSplitter2.CreateStatic(&m_wndSplitter,2,1,WS_VISIBLE|WS_CHILD, 
	     m_wndSplitter.IdFromRowCol(0, 0))==NULL) 
	     return FALSE; //将第0行0列再分开2行1列 
	 if(m_wndSplitter3.CreateStatic(&m_wndSplitter,2,1,WS_VISIBLE|WS_CHILD, 
		 m_wndSplitter.IdFromRowCol(0, 1))==NULL) 
		 return FALSE; //将第0行0列再分开2行1列 

	// 创建右下面窗格中的视图
	if(!m_wndSplitter3.CreateView(1, 0, RUNTIME_CLASS(CDialogStatus),CSize(200,200), pContext))
		return FALSE;

	  // 创建右上面窗格中的视图
	  if(!m_wndSplitter3.CreateView(0, 0, RUNTIME_CLASS(CyyyView),CSize(800, 800), pContext)) 
		  return FALSE;
	 
	  // 创建左下面窗格中的视图
	  if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(cDialogData),CSize(800, 200), pContext))
		  return FALSE;

	  if(!m_wndSplitter2.CreateView(1,0, RUNTIME_CLASS(CDialogA),CSize(200, 800), pContext))
		  return FALSE;

	  //CRect r;
	  //GetClientRect(&r);
	  m_wndSplitter.SetColumnInfo(0,800, 100);
	  m_wndSplitter2.SetRowInfo(0, 400, 100);
	  m_wndSplitter3.SetRowInfo(0, 200, 100);
	  m_wndSplitter.RecalcLayout();
	  m_wndSplitter2.RecalcLayout();
	  m_wndSplitter3.RecalcLayout();

	return TRUE;
}
运行出来就如第二张图所示了。

MFC基于单文档分割窗口_第2张图片

设置的思路图在最后一张图上。MFC基于单文档分割窗口_第3张图片

你可能感兴趣的:(MFC)