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; }