为了实现该功能我们需要对CSplitterWnd进行增强,具体实现如下:

一、定义头文件

//////////////////////////////////////////////////////////////////

//

// splitex.h

class CSplitterWndEx : public CSplitterWnd

{

protected:

   int m_nHidedCol;    // hide column number, -1 if all columns

                       // are shown

public:

   CSplitterWndEx();

   void ShowColumn();

   void HideColumn(int colHide);

// ClassWizard generated virtual function overrides

   //{{AFX_VIRTUAL(CSplitterWndEx)

   //}}AFX_VIRTUAL

// Generated message map functions

protected:

   //{{AFX_MSG(CSplitterWndEx)

      // NOTE - the ClassWizard will add and remove member

      //        functions here.

      //}}AFX_MSG

    DECLARE_MESSAGE_MAP()

};

二、具体实现代码

//////////////////////////////////////////////////////////////////

//

// splitex.cpp

#include "stdafx.h"

#include "splitex.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

//////////////////////////////////////////////////////////////////

/

// CSplitterWndEx

CSplitterWndEx::CSplitterWndEx() :

    m_nHidedCol(-1)

{

}

void CSplitterWndEx::ShowColumn()

{

   ASSERT_VALID(this);

   ASSERT(m_nCols < m_nMaxCols);

   ASSERT(m_nHidedCol != -1);

   int colNew = m_nHidedCol;

   m_nHidedCol = -1;

   int cxNew = m_pColInfo[m_nCols].nCurSize;

   m_nCols++;    // add a column

   ASSERT(m_nCols == m_nMaxCols);

   // fill the hidden column

   int col;

   for (int row = 0; row < m_nRows; row++)

   {

      CWnd* pPaneShow = GetDlgItem(

         AFX_IDW_PANE_FIRST + row * 16 + m_nCols);

      ASSERT(pPaneShow != NULL);

      pPaneShow->ShowWindow(SW_SHOWNA);

      for (col = m_nCols - 2; col >= colNew; col--)

      {

         CWnd* pPane = GetPane(row, col);

         ASSERT(pPane != NULL);

         pPane->SetDlgCtrlID(IdFromRowCol(row, col + 1));

      }

      pPaneShow->SetDlgCtrlID(IdFromRowCol(row, colNew));

   }

   // new panes have been created -- recalculate layout

   for (col = colNew + 1; col < m_nCols; col++)

      m_pColInfo[col].nIdealSize = m_pColInfo[col - 1].nCurSize;

   m_pColInfo[colNew].nIdealSize = cxNew;

   RecalcLayout();

}

void CSplitterWndEx::HideColumn(int colHide)

{

   ASSERT_VALID(this);

   ASSERT(m_nCols > 1);

   ASSERT(colHide < m_nCols);

   ASSERT(m_nHidedCol == -1);

   m_nHidedCol = colHide;

   // if the column has an active window -- change it

   int rowActive, colActive;

   if (GetActivePane(&rowActive, &colActive) != NULL &&

       colActive == colHide)

   {

      if (++colActive >= m_nCols)

         colActive = 0;

      SetActivePane(rowActive, colActive);

   }

   // hide all column panes

   for (int row = 0; row < m_nRows; row++)

   {

      CWnd* pPaneHide = GetPane(row, colHide);

      ASSERT(pPaneHide != NULL);

      pPaneHide->ShowWindow(SW_HIDE);

      pPaneHide->SetDlgCtrlID(

         AFX_IDW_PANE_FIRST + row * 16 + m_nCols);

      for (int col = colHide + 1; col < m_nCols; col++)

      {

         CWnd* pPane = GetPane(row, col);

         ASSERT(pPane != NULL);

         pPane->SetDlgCtrlID(IdFromRowCol(row, col - 1));

      }

   }

   m_nCols--;

   m_pColInfo[m_nCols].nCurSize = m_pColInfo[colHide].nCurSize;

    RecalcLayout();

}

BEGIN_MESSAGE_MAP(CSplitterWndEx, CSplitterWnd)

//{{AFX_MSG_MAP(CSplitterWndEx)

   // NOTE - the ClassWizard will add and remove mapping macros here.

//}}AFX_MSG_MAP

END_MESSAGE_MAP()