Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

WTL Rolldown Control

0.00/5 (No votes)
4 Mar 2002 1  
A WTL Rolldown control as seen in 3DSMax

Sample Image - WtlRolldownCtrl.gif

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.

  1. Create a dialog box in the resource editor with the WS_CHILD style and its WTL dialog class as usual (e.g. CDlg1).
    Note: Trap IDOK and IDCANCEL else the dialog will be destroyed if the user presses either RETURN or ESC.
  2. Add CRolloutCtrl<CDlg1> m_dlg1; to the class declaration that will be using the control.
  3. 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_* to RCCM_*.
Fixed page dragging.
Fixed focus drawing.

4 Dec 2001

Added CRolloutCtrlButton to support tabing.
Added EnableRollout() to CRolloutContainer.
Fixed tabbing.

05 Mar 2002

Grayed context menu items of disabled rollout controls. CRolloutContainer::ExpandRollout and CRolloutCtrl::Expand still expand disabled rollout controls.

Known Limitations/Bugs

  • Inconsistent naming of the control within this article.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here