MFC 视图分栏,分割窗口,在一个窗口设置对话框

使用CSplitterWnd分割窗口()

 

1.1、基本的CSplitterWnd的使用


1.1.1 在CMainFrame中添加一个CSplitterWnd成员:
  CSplitterWnd m_splitterwnd1;


1.1.2  基于CView创建两个新的视图类,CViewLeft和CViewRight,一个用于在左边显示,一个用于在右边显示。


1.1.3  重载CMainFrame的OnCreateClient函数,在并其中调用CSplitterWndr的CreateStatic函数创建该分割窗口,CreateView函数创建左右两个视图,SetColumnInfo设定分割窗口的列的宽度:
  BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*pContext)
  {
    // TODO: 在此添加专用代码和 / 或调用基类
    m_mysplitter1.CreateStatic(this, 1, 2);        // 创建一个一行二列的分割窗口
    m_mysplitter1.CreateView(0, 0, RUNTIME_CLASS(CViewLeft),CSize(0, 0),
      pContext);      // 建立第 0 行第 0 列的视图
    m_mysplitter1.CreateView(0, 1,RUNTIME_CLASS(CViewRight), CSize(0, 0),
      pContext);      // 建立第 0 行第 1 列的视图

  m_mysplitter1.SetColumnInfo(0,250, 10);    //设定某列的宽度,这里表示设定第0列的理想宽度为250像素,最小宽度为10像素(什么是最小宽度?没弄明白)

  return TRUE;

    //returnCFrameWnd::OnCreateClient(lpcs, pContext);
  }
 
  运行后就可以看到生成了分割为左右两个视图的窗口。

 

1.2、为分割窗添加一些自己需要的功能
  从系统的CSplitterWnd类派生一个新类。
  在类视图中右键,选择“添加”->“类”,在弹出窗口中选择MFC类,输入新类的名字CMySplitter,基类选择为CWnd(这里基类的选项里面没有CSplitterWnd,所以要先选择Cwnd)。然后把生成的MySplitter.h和MySplitter.cpp里面的三个地方的“Cwnd”改成“CSplitterWnd”。
  MySplitter.h中:
    class CMySplitter : public CSplitterWnd
  Mysplitter.cpp中:
    IMPLEMENT_DYNAMIC(CMySplitter, CSplitterWnd)
    BEGIN_MESSAGE_MAP(CMySplitter, CSplitterWnd)
   
1.2.1  双击分隔栏展开或者收起左边的一栏
  重载OnLButtonDblClk函数:
  void CMySplitterWnd::OnLButtonDblClk(UINT nFlags, CPoint point)
  {
    // TODO: 在此添加消息处理程序代码和 / 或调用默认值

    //CSplitterWnd::OnLButtonDblClk(nFlags,point);
    int left, min;
    GetColumnInfo(0, left, min);        // 得到第 0 栏(即左边的一栏)的宽度
    if(left == 0 || left == min)         // 如果当前已经是收起的状态
    {
      SetColumnInfo(0, 250, 10);      // 重新设置左边一栏的宽度,这里设置为 250 ,即展开
    }
    else
    {
      SetColumnInfo(0, 0, 10);       // 重新设置左边一栏的宽度,这里设置为 0 ,即收起
    }
    RecalcLayout();                  // 重新构建窗口布局
  }
 
1.2.2  设置分隔栏的宽度
  在CMySplitter的构造函数中(这里是把宽度设为11像素):
  m_cxSplitterGap = 11;
  m_cxSplitter = 11;     
  几个相关变量的意义:
  //int     m_cxSplitter,     m_cySplitter;                                         //     size     of     splitter     bar   
  //int     m_cxBorderShare,     m_cyBorderShare;               //     space     on     either     side     of    splitter   
  //int     m_cxSplitterGap,     m_cySplitterGap;                 //     amount     of     space     between     panes   
  //int     m_cxBorder,     m_cyBorder;                                                       //     borders     in     client     area       
 
1.2.3  禁止拖动分隔栏的位置
(1)重载OnLButtonDown函数,改成什么都不做:
  void CMySplitter::OnLButtonDown(UINT nFlags, CPoint point)
  {
    //TODO: 在此添加消息处理程序代码和/或调用默认值   
    //CSplitterWnd::OnLButtonDown(nFlags,point);
  }
(2)重载OnMouseMove函数,也改成什么都不做:
  void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
  {
    //TODO: 在此添加消息处理程序代码和/或调用默认值

设置窗口为对话框,添加控件()


2. 添加CFormView类作为视图类
在(一)中学会了如何分割窗口,但是在1.2中如果窗口的CEditView, CTreeView,CView类,这些类是不支持添加对话框的,只有在1.2中设置添加CFormView类才可以。


CFormView CView 类的派生类 , CFormView 类里可以放很多控件 , 带有菜单并可以添加控件的工程
在ClassWizard里添加新的类,基类选为CFormView类。在此之前必须新建一个对话框资源,在对话框的设置里面,把style的popup 弹出改成child 下层,不然的话会出现错误: Debug Assertion Failed! FILE viewform.cpp , line 69。
2.1 新建一个对话框资源,在对话框的设置里面,把style的popup 弹出改成child 下层


2.2 在ClassWizard里添加新的类,基类选为CFormView类



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值