Rollup Control






4.94/5 (49 votes)
Apr 13, 2001
2 min read

385281

6497
A 3DSMax like Rollup control
Introduction
I wanted the same graphic control that 3DSMax use in the pages 'create' and 'modify'. It is called a 'Rollup Window Control', which allows one to roll and unroll dialog boxes and to scroll them in the control's client area. The CRollupCtrl
MFC class is the result. The class definition and implementation are in the files RollupCtrl.h and RollupCtrl.cpp, which are included in the demo project.
Features
- The control is derived from the
CWnd
class and can be created in any window. - Pages are composed of a title, visualized by a button and a template (the dialog box).
- Pages can have several states. They can be rolled/unrolled but can also be active and inactive. To roll-unroll a page allows you to hide or show dialog box, respectively. To deactivate a page, lock the dialog box in the rolled state.
- The control is resizable and can also scroll pages. To scroll pages you can use the scrollbar or click inside an open dialog box and drag outside it to scroll the control.
Using the Control
To use this control in your application, add the RollupCtrl.h and RollupCtrl.cpp files to your project. The creation of the control is made by calling the CRollupCtrl::Create(...)
method. There are two ways to insert a page.
RUNTIME_CLASS
methodCreate a dialog box in the resource editor 'ex. IDD_PAGE1' with the
WS_CHILD
style. Generate the declaration and implementation files class (ex.CPage1Dlg
) of your dialog box with the assistance of the MFC Classwizard. Then addDECLARE_DYNCREATE(CPage1Dlg)
in the declaration of the class andIMPLEMENT_DYNCREATE(CPage1Dlg,
CDialog)
in the implementation.Then insert the page in this way
pwndRollupCtrl->InsertPage("Caption", IDD_PAGE1, RUNTIME_CLASS(CPage1Dlg) );
CDialog::Create
methodAs
RUNTIME_CLASS
method, create a dialog box in the resource editor. Generate the declaration and implementation files class of your dialog box. Then create the dialog box like thisCPage1Dlg* pwndPage1 = new CPage1Dlg;
pwndPage1->Create(MAKEINTRESOURCE(IDD_PAGE1), pwndRollupCtrl);and insert the page as follows
pwndRollupCtrl->InsertPage("Caption", pwndPage1 );
This code has been tested only on W2K. If you have any other suggested improvements, please let me know for the next release.
User Methods
V1.00
BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID); int InsertPage(const char* caption, CDialog* pwndTemplate, BOOL bAutoDestroyTpl=TRUE, int idx=-1); int InsertPage(const char* caption, UINT nIDTemplate, int idx=-1); int InsertPage(const char* caption, UINT nIDTemplate, CRuntimeClass* rtc, int idx=-1); void RemovePage(int idx); void RemoveAllPages(); void ExpandPage(int idx, BOOL bExpand=TRUE); void ExpandAllPages(BOOL bExpand=TRUE); void EnablePage(int idx, BOOL bEnable=TRUE); void EnableAllPages(BOOL bEnable=TRUE); RC_PAGEINFO* CRollupCtrl::GetPageInfo(int idx);
V1.01
void ScrollToPage(int idx, BOOL bAtTheTop=TRUE); int MovePageAt(int idx, int newidx); BOOL IsPageExpanded(int idx); BOOL IsPageEnabled(int idx); int GetPagesCount();
V1.02
BOOL IsAutoColumnsEnabled(); void EnableAutoColumns(BOOL bEnable=TRUE); BOOL SetColumnWidth(int nWidth); BOOL SetPageCaption(int idx, LPCSTR caption);
History
- v1.0
31/03/01: Created
- v1.01
13/04/01: AddedScrollToPage
method
Added automatic page visibility toExpandPage
method
Added Mousewheel support
15/04/01: Added mouse capture checking onWM_MOUSEMOVE
dialog msg
AddedSetCursor
on DialogWM_SETCURSOR
AddedMovePageAt
method
17/04/01: Fixed Group Boxes displayed over Buttons
20/04/01: AddedIsPageExpanded
andIsPageExpanded
methods
Added PopupMenu
Added Button subclassing (now button's focus not drawn)
- v1.02
10/06/02: Added pages dividing up into columns
17/06/02: AddedSetPageCaption
method
19/11/02: Fixed_RemovePage
method
29/10/03: Background color forAfxRegisterWndClass