Show/Hide Static Panes

MFC static splitter windows have a significant limitation. Their panes can't be hidden or shown dynamically. To solve the problem I overrode the CSplitterWnd. The new class can hide a splitter window column. Sure, it's only one approach to the problem, but it's a good example anyway.

//////////////////////////////////////////////////////////////////
//
// splitex.h
// (c) 1997, Oleg G. Galkin

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
// (c) 1997, Oleg G. Galkin

#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()


Comments

  • Dr

    Posted by wang gang on 03/05/2015 06:42pm

    Very usefule!Thanks

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Organizations are increasingly gravitating toward mobile-first application development as they assess the need to revamp their application portfolios to support touch computing and mobility. Consumerization has brought higher expectations for application usability along with the mobile devices themselves. Enterprises are increasingly shifting their new application acquisitions and development efforts toward mobile platforms. With this backdrop, it is natural to expect application platform vendors to invest in …

  • Thanks to wide spread cloud hosting and innovations small businesses can meet and exceed the legacy systems of goliath corporations. Explore the freedom to work how you want, with a phone system that will adapt to your evolving needs and actually save you lots of expense—read Get an Enterprise Phone System without High Cost and Complexity. The article clearly illustrates: The only hardware you'll need is phone equipment for advanced voice and fax. How to join all your employees, mobile devices, …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date