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