天天看点

【VS开发】CSplitterWnd的定制使用

一、基本的CSplitterWnd的使用

1. 在CMainFrame中添加一个CSplitterWnd成员:

 CSplitterWnd m_splitterwnd1;

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

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;

  //return

CFrameWnd::OnCreateClient(lpcs, pContext);

 }

 运行后就可以看到生成了分割为左右两个视图的窗口。

二、为分割窗添加一些自己需要的功能

 从系统的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,

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

0, 10);    //重新设置左边一栏的宽度,这里设置为0,即收起

  RecalcLayout();         //重新构建窗口布局

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    

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: 在此添加消息处理程序代码和/或调用默认值

  //CSplitterWnd::OnMouseMove(nFlags, point);  

使用CSplitterWnd分割窗口(二)