WTL Rolldown Control
Introduction
Even thought this implementation seems to be a port of the MFC Rollup Control by Johann Nadalutti, I started to develop it some days before the first post of the above-mentioned article. Nevertheless, I need to thank Johann Nadalutti for his great work that gave me the opportunity to improve my implementation.
This implementation consists of two classes: CRolldownCtrl<TChild>
implements the actual Rolldown control while CRolldownContainer
implements a manager, which provides the visual area for the Rolldown controls.
The class definitions and implementations are in the file AtlRolldownCtrl.h
, which are included in the demo project.
Requirements
You will require the WTL Libraries; these can be downloaded from the Microsoft site. If the WTL Libraries have no meaning to you, see Introduction to WTL - Part 1.
How to use the control in your WTL App
To use this control in your application, add the header file AtlRolldownCtrl.h
to your project and then add CRolloutContainer m_RolloutContainer;
to the class definition that will be using the control.
- Create a dialog box in the resource editor with the
WS_CHILD
style and its WTL dialog class as usual (e.g.CDlg1
).
Note: TrapIDOK
andIDCANCEL
else the dialog will be destroyed if the user presses either RETURN or ESC. - Add
CRolloutCtrl<CDlg1> m_dlg1;
to the class declaration that will be using the control. - Create the control in the
OnCreate
function and add it to the container, e.g.:m_dlg1.Create(m_RolloutContainer.m_hWnd, _T("My Rollout Control")); m_RolloutContainer.AddRollout(m_dlg1);
Repeat these steps for additional Rolldown controls.
The final OnCreate
function may look like this:
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
...
m_RolloutContainer.Create(m_hWnd);
...
m_dlg1.Create(m_RolloutContainer.m_hWnd, _T("Rollout Control 1"));
m_RolloutContainer.AddRollout(m_dlg1);
m_dlg2.Create(m_RolloutContainer.m_hWnd, _T("Rollout Control 2"));
m_RolloutContainer.AddRollout(m_dlg2);
m_dlg3.Create(m_RolloutContainer.m_hWnd, _T("Rollout Control 3"));
m_RolloutContainer.AddRollout(m_dlg3);
...
}
CRolloutCtrl
User Methods:
Creation
HWND Create(HWND hWndParent, LPCTSTR szWindowName, _U_RECT rect = NULL,
DWORD dwStyle = 0, DWORD dwExStyle = 0, DWORD dwExRcStyle = 0,
UINT nID = 0U, LPVOID lpCreateParam = NULL);
BOOL SubclassWindow(HWND hWnd);
Attributes
bool IsExpanded();
Returns true
if the control is expanded or false
otherwise.
Operations
void GetRect(bool fExpanded, RECT* pRect);
Returns the bounding rectangle of the expanded (fExpanded = true
) or collapsed (fExpanded = false
) control.
void Expand(bool fExpand = true);
void ToggleExpandCollapse();
Expands (fExpand = true
) or collapses (fExpand = false
) the control.
CRolloutContainer
User Methods:
Creation
HWND Create(HWND hWndParent, LPCTSTR lpstrTitle = NULL, DWORD dwStyle = 0,
DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL);
HWND Create(HWND hWndParent, UINT uTitleID, DWORD dwStyle = 0,
DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL);
Operations
void GetClientSize(SIZE* pClientSize);
Returns the size the container needs to display all Rolldown controls.
int GetSpacing();
void SetSpacing(int nSpacing);
Gets and sets the inter Rolldown spacing.
int AddRollout(HWND hWndRollout);
Adds a Rolldown control to the container. If the return value is greater than or equal to 0, it is the zero-based index to the Rolldown control in the container. The return value is -1 if an error occurs.
bool RemoveRollout(HWND hWndRollout);
bool RemoveRollout(int nIndex);
bool RemoveAllRollouts();
Removes one or all Rolldown controls from the container.
int GetRolloutCount();
Retrieves the count of contained Rolldown controls.
HWND GetRollout(int nIndex);
Retrieves the window handle of a Rolldown control.
void ExpandRollout(HWND hWndRollout, bool fExpand = true, bool fUpdate = true);
void ExpandRollout(int nIndex, bool fExpand = true, bool fUpdate = true);
void ExpandAllRollouts(bool fExpand = true);
Expands (fExpand = true
) or collapses (fExpand = false
) one or all Rollout controls. If fUpdate
is set to true
, the layout will be recalculated.
bool IsRolloutExpanded(HWND hWndRollout);
bool IsRolloutExpanded(int nIndex);
Returns true
if the control is expanded or false
otherwise.
void RolloutEnabled(HWND hWndRollout, bool fEnable);
void RolloutEnabled(int nIndex, bool fEnable);
Enables (fEnable = true
) or disables (fEnable = false
) the specified rollout control.
bool IsRolloutEnabled(HWND hWndRollout);
bool IsRolloutEnabled(int nIndex);
Returns true
if the control is enabled or false
otherwise.
void ScrollToRollout(HWND hWndRollout);
void ScrollToRollout(int nIndex);
Scrolls the specified Rolldown control into view.