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类才可以。


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


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



展开阅读全文

没有更多推荐了,返回首页