Show/Hide Static Panes | CodeGuru

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 […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 7, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

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()
CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.