Expanding Dialog

This article was contributed by D.Sivakumar

This article is based on
an article
contributed by
Peter Pearson .
Since I found my own version of this solution to be quite useful,
in implementing expanding dialogs, I thought I would share mine with others
as well. What I’ve done is to consolodate the code into a single function and
provide a couple of bug fixes. Hopefully, this version will be of use to other

The single function is called ExpandyaContaract. Please note that I also changed
the order in which the EnableWindow function is called. As per the original code,
the static field also gets disabled. The other changes are the setting of the
m_bExpanded flag to FALSE so that dialog starts with contracted mode and
the calling of the ExpandyaContaract function from OnInitDialog.

// CExpandDlgDlg dialog

class CExpandDlgDlg : public CDialog {
// Construction
 CExpandDlgDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
 CButton m_Devide;

 // ClassWizard generated virtual function overrides
 virtual void DoDataExchange(CDataExchange* pDX);
 int m_nNormalWidth;
 int m_nExpandedWidth;
 BOOL m_bExpanded;

// Implementation
 HICON m_hIcon;
 void ExpandyaContract();
 // Generated message map functions
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnButtonAdvanced();

void CExpandDlgDlg::OnButtonAdvanced()
 // TODO: Add your control notification handler code here

void CExpandDlgDlg::ExpandyaContract()
 CRect rcDlg, rcMarker;


 if (!m_bExpanded)
  m_nExpandedWidth = rcDlg.Width();
  m_nNormalWidth = (rcMarker.right - rcDlg.left);

  rcDlg.SetRect(rcDlg.left, rcDlg.top, rcDlg.left + m_nNormalWidth+12,
  rcDlg.top + rcDlg.Height());

  HWND hWndChild = ::GetDlgItem(m_hWnd, IDC_STATIC_DEVIDE);

  while (hWndChild != NULL)
   hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT);
   ::EnableWindow(hWndChild, m_bExpanded);
  rcDlg.SetRect( rcDlg.left, rcDlg.top, rcDlg.left + + m_nExpandedWidth,
  rcDlg.top + rcDlg.Height() );

  HWND hWndChild = ::GetDlgItem(m_hWnd, IDC_STATIC_DEVIDE);

  while (hWndChild != NULL)
   hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT);
   ::EnableWindow(hWndChild, m_bExpanded);

 MoveWindow(rcDlg, TRUE);
 m_bExpanded = !m_bExpanded;


Download source code – 11 Kb

More by Author

Must Read