Expanding Dialog

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

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