如何在MFC单文档中创建多视图

基本步骤如下:

1.首先创建一个MFC单文档应用程序。

2.添加4个MFC类TopLView、BottomLView、TopRView、BottomRView,基类为CView。

3.添加一个MFC类CControlForm,基类为CFormView,对话框ID默认。

4.创建一个切分类,如MySplitter,基类为CSplitterWnd(默认基类选项中无此类,自己添加即可)。

5.在框架类Cmainframe的头文件中,添加2个MySplitter的变量(因为下面要进行两次切分操作)。

6.重写框架类Cmainframe的OnCreateClient函数,如下:

 //第一次静态切分CreateStatic,一行两列

if (!m_wndSplitter.CreateStatic(this,1,2)) 

  return FALSE;

//第二次静态切分(将第一次切分后的第二列再分为2*2)及所有的子视图创建(CreateView函数)。

 if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CControlForm), CSize(100, 100), pContext) || 
  !m_wndSplitter2.CreateStatic(&m_wndSplitter,2,2,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0, 1))||
  !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(TopLView), CSize(350, 240), pContext) || 
  !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) || 
  !m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(TopRView), CSize(350, 240), pContext) || 
  !m_wndSplitter2.CreateView(1, 1, RUNTIME_CLASS(BottomRView), CSize(350, 240),  pContext)) 
 { 
  m_wndSplitter.DestroyWindow(); 
  return FALSE; 
 }

// return CFrameWnd::OnCreateClient(lpcs, pContext);      //注释掉原有的响应函数

注意:记得在Mainfrm.h中添加以上五个视图类的头文件:

#include "CControlForm.h"
#include "TopLView.h"
#include "TopRView.h"
#include "BottomLView.h"
#include "BottomRView.h"

6. 切分视图完成,结果如下:

 如何在MFC单文档中创建多视图 - 老柯 - 菜鸟的朝圣之路

其中,最左的视图为FormView类型,操作类似对话框(可以在Resource-Dialog看到其对应的对话框资源);右边四个的操作则类似普通视图。

 

补充内容:

a. 此时创建的各个子视图之间的分割条可以拖动,以改变视图其大小。如果想固定分割条,则需要重载MySplitter类的鼠标响应函数。可以通过一个Bool型变量来控制是否可以拖动分割条:

 if (Isvisable)  //Isvisable在构造函数中已被初始为FALSE
 {
  CSplitterWnd::OnLButtonDown(nFlags, point);
 }

b. 还可以通过重载MySplitter类的OnDrawSplitter函数来改变分割条的样式。以下为该函数代码:

 #define LP RGB(128,128,128)
 #define RB RGB(192,192,192)

 //如果pDC 为 NULL则仅使分割窗口区域无效
 if (pDC == NULL)
 {
  RedrawWindow(rect, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);
  return;
 }
 ASSERT_VALID(pDC);

 CRect rc = rect;
 
 switch(nType) 
 { 
 case splitBorder:
  //重画分割窗口边界
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1); 
  pDC->Draw3dRect(rc,RB,RB); 
  return; 
 case splitBox:
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1); 
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1);
  pDC->FillSolidRect(rc,RGB(128,128,128)); 
  pDC->Draw3dRect(rc,RB,RB);
  return; 
 case splitBar: 
  //重画分割条 
  pDC->FillSolidRect(rc,RGB(192,192,192));
  rc.InflateRect(-1,-1); 
  pDC->Draw3dRect(rc,RB,RB);  
  return; 
 default: 
  ASSERT(FALSE); 
 } 
 //填充中间的部分
 pDC->Draw3dRect(rect, GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT));

注:以上程序在vs2008上调试成功。

转载网址:http://blog.163.com/fk1007@126/blog/static/30036739200921991633565/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值