WTL Rolldown Control






4.93/5 (9 votes)
Sep 4, 2001
3 min read

113221

2013
A WTL Rolldown control as seen in 3DSMax
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.
Updates
04 Sep 2001
- Initial public release.
28 Sep 2001
- Added Copyright/Disclaimer header.
- Added flag to update the layout to
ExpandRollout()
. - Changed the context menu. The Close Rollout item will be grayed out if the cursor is not over a rollout.
- Changed rollout container message names from
RCM_*
toRCCM_*
. - Fixed page dragging.
- Fixed focus drawing.
4 Dec 2001
- Added
CRolloutCtrlButton
to support tabing. - Added
EnableRollout()
toCRolloutContainer
. - Fixed tabbing.
05 Mar 2002
- Grayed context menu items of disabled rollout controls.
CRolloutContainer::ExpandRollout
andCRolloutCtrl::Expand
still expand disabled rollout controls.
Known Limitations/Bugs
- Inconsistent naming of the control within this article.