CResizableSheet(Ex) and CResizablePage(Ex)
These four classes handle resizable property sheets, wizards and the wizard 97 style dialogs, and are now fully based on my ResizableLib class library (see article).
The user will have the ability to resize the dialog, with consequent rearrangement of child windows. You can control the minimum and maximum size allowed, as well as the maximized size and position of the dialog. The size grip is displayed by default, but you may turn it off. Automatic Save/Restore the dialog's size and position, along with the active page, is also supported.
Conversion of a previously existant property sheet or wizard should be very simple.
I will talk about non-Ex classes for the rest of the article, but the same concepts applies for Wizard 97 dialogs.
The Sample Applications
This is a view of the sample dialog at minimum size as a property sheet and in wizard mode:
Note that the minimum width is not the default. You may see how to do this in the next section.
This is a screenshot of the resizable version of Wizard97 sample project coming with Visual C++.
Usage - Step by Step
Add the ResizableLib to your project's workspace, as explained in the relative article.
Create a property sheet or wizard dialog and do the relative associations with MFC classes, for example using the Property Sheet component, or take one you have already made which you want to be resizable. You don't need to change any window style to have the dialog resizing.
Include 'ResizableSheet.h' in the property sheet associated header file.
Search and replace all
CPropertySheet occurences with
CResizableSheet in both your .cpp and .h files, just as if your property sheet class was derived from
CResizableSheet instead of
Include 'ResizablePage.h' in the property pages associated header file.
Search and replace all
CPropertyPage occurences with
CResizablePage in both your .cpp and .h files, just as if your property page classes were derived from
CResizablePage instead of
The same applies for wizard dialogs, of course.
Your property sheet header file should appear like this:
#include <span class="code-string">"MyPropertyPages.h"</span>
#include <span class="code-string">"ResizableSheet.h"</span>
class CMyPropertySheet : public CResizableSheet
CMyPropertySheet(CWnd* pWndParent = NULL);
OnInitDialog override you may change the initial settings of your property sheet, such as the minimum size and automatic save/restore, that can optionally set also the active page.
EnableSaveRestore(_T("Properties"), TRUE, TRUE);
Your property pages header file should appear like this:
#include <span class="code-string">"ResizablePage.h"</span>
class CMyPropertyPage1 : public CResizablePage
In each page's
OnInitDialog override you only have to set a layout for your controls. You specify where to attach the top-left and bottom-right corners by horizontal/vertical percentage or using predefined constants.
AddAnchor(IDC_LIST1, TOP_LEFT, CSize(50,70));
AddAnchor(IDC_PICTURE1, CSize(50,0), CSize(100,70));
AddAnchor(IDC_GROUP1, CSize(0,70), BOTTOM_RIGHT);
m_ctlEdit1.AddString(_T("Just a single item to test the "
"listbox behavior with very long lines..."));
You are ready to rebuild your project and you will have a resizable property sheet or a wizard dialog just as you wanted.
For further details, see the next section.
The property sheet class inherits from CResizableLayout, CResizableGrip, CResizableMinMax, CResizableState and obviously from CPropertySheet.
The property page class inherits from CResizableLayout and obviously from CPropertyPage. The other classes are not needed.
CResizableSheet(UINT nIDTemplate, CWnd* pParentWnd = NULL)
CResizableSheet(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL)
CResizablePage(UINT nIDTemplate, CWnd* pParentWnd = NULL)
CResizablePAge(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL)
The first form is the default constructor.
The second and the third forms are needed to reproduce the construction scheme of a
CPropertySheet/Page derived class. Since the dialog resource template is needed by the
CPropertySheet/Page constructor, you have to call one of these forms of the
CResizableSheet/Page constructor. This is the reason why replacing one class with the other will work.
void EnableSaveRestore(LPCTSTR pszSection, BOOL bRectOnly, BOOL bWithPage = FALSE)
Enables automatic save/restore on dialog's open/close operations. The first argument is the same as in
TRUE, the minimized/maximized state is not saved/restored. The last argument is a flag for restoring the active page (active page is always saved). Should be called after all the layout settings.
If you want details on how these settings are stored, look at
CWinApp::m_pszRegistryKey on MFC documentation.
- Implemented in the various base classes, see ResizableLib article.
Member functions to set/reset maximized size and position may seem rather useless, since you don't have a maximize box in the window's caption. I left them because I think it should be possible to enable caption buttons, playing a little with window's styles.
I hope these classes can make some programmers' life a little easier. I also want to thank Jerzy Kaczorowski for his unique support during the port of
CResizableDialog code to property sheets.
ResizableLib is now complete. This required a partial rewriting, but I hope it will benefit of all the improvements made to the library (and the bugs too).
The CVS tree is now on Source Forge.
28 Jul 2000
- Initial public release.
27 Oct 2000
- Fixed bug with stacked tabs.
- Controls that need refresh now display correctly.
- Replaced internal structure with a
13 Mar 2001
- Fixed a bug with radio buttons and group boxes (thanks to Matt Philmon)
- Changed copyright note
11 Jun 2001
- New implementation and integration with ResizableLib
15 Jul 2001
- Updated to new ResizableLib release
- Complete integration with the library, now using new callback anchors
- Added support for 'Wizard 97' style dialogs
28 Oct 2001
- Version 1.1 (CVS Tag: SF_1_1)
- Fixed a bug with CTRL+Tab while navigating Wizard dialogs
- Added static build configurations to all projects