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
people.

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
public:
 CExpandDlgDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
 //{{AFX_DATA(CExpandDlgDlg)
 enum { IDD = IDD_EXPANDDLG_DIALOG };
 CButton m_Devide;
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CExpandDlgDlg)
protected:
 virtual void DoDataExchange(CDataExchange* pDX);
 //}}AFX_VIRTUAL
 int m_nNormalWidth;
 int m_nExpandedWidth;
 BOOL m_bExpanded;

// Implementation
protected:
 HICON m_hIcon;
 void ExpandyaContract();
 // Generated message map functions
 //{{AFX_MSG(CExpandDlgDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnButtonAdvanced();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};


void CExpandDlgDlg::OnButtonAdvanced()
{
 // TODO: Add your control notification handler code here
 ExpandyaContract();
}

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

 GetWindowRect(rcDlg);

 if (!m_bExpanded)
 {
  m_nExpandedWidth = rcDlg.Width();
  m_Devide.GetWindowRect(rcMarker);
  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);
  }
 }
 else
 {
  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;
}

Downloads

Download source code – 11 Kb

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read