Click here to Skip to main content
16,016,580 members
Articles / Desktop Programming / MFC

CResizableDialog

Rate me:
Please Sign up or sign in to vote.
4.85/5 (53 votes)
25 Jul 2012CPOL 848.1K   15.1K   217   227
A CDialog derived class to implement resizable dialogs with MFC

CResizableDialog - What Is It & Why?

I wrote my own class to implement resizable dialogs mostly as an exercise of MFC and Windows programming. Later, I discovered that other people had written similar classes, but I didn't find one I really like that was as simple as my little projects.

Before you go any further, I have to warn you that I'm not a "guru". Surely something could be done better, but I think this class is at least easy to use.

The user will have the ability to resize the dialog, with consequent rearrangement of child windows, and 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 is also supported.

Conversion of a previously existent dialog should be very simple, as well as creation of a new resizable dialog.

Now implemented with ResizableLib (see article).

The Sample Application

This is a view of the sample dialogs:

Default min size is the one in the dialog template (and grip is visible)

Support for colored or bitmap background with a triangular size grip

This is a composite view, where you can see the maximized position is not the default:

A desktop snapshot with the dialog maximized and normal size overimpressed

You may see how to do this in the next section.  

Usage - Step by Step

Add the ResizableLib to your project's workspace, as explained in the relative article.

Create a dialog resource and associate it with a CDialog derived class, for example using Class Wizard, or take a dialog you have already made which you want to be resizable.

You no longer need to change the window style to have the dialog resizing.

Include 'ResizableDialog.h' in the associated header file.

Search and replace all CDialog occurrences with CResizableDialog in both your .cpp and .h files, just as if your dialog class was derived from CResizableDialog instead of CDialog. I think there's no way to let the Class Wizard do this for you. Let me know if I'm wrong, please.

Your header file should appear like this:

C++
// MyDialog.h : header file
//
// ( Class Wizard stuff )
/////////////////////////////////////////////////////////////////////////////
// CMyDialog dialog

#include "ResizableDialog.h"
class CMyDialog : public CResizableDialog
{
// Construction
public:
    CMyDialog(CWnd* pParent = NULL);    // standard constructor

// ( other stuff )
// ...
}

In your OnInitDialog override, add an anchor for each control you want the size and/or position to be changed when the user resizes the dialog.

C++
BOOL CMyDialog::OnInitDialog()
{
    CResizableDialog::OnInitDialog();

    // Set the icon for this dialog. The framework does this
    // automatically when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);     // Set big icon
    SetIcon(m_hIcon, FALSE);    // Set small icon

    // preset layout
    AddAnchor(IDOK, BOTTOM_RIGHT);
    AddAnchor(IDCANCEL, BOTTOM_RIGHT);
    
    AddAnchor(IDC_SPIN1, TOP_RIGHT);

    AddAnchor(IDC_LABEL1, TOP_LEFT);
    AddAnchor(IDC_EDIT1, TOP_LEFT, BOTTOM_RIGHT);

    AddAnchor(IDC_RADIO1, BOTTOM_LEFT);
    AddAnchor(IDC_RADIO2, BOTTOM_LEFT);
    AddAnchor(IDC_GROUP1, BOTTOM_LEFT, BOTTOM_RIGHT);
    
    // other initializations
    // ...

Here, you may also set a maximum size for your dialog (default is the workspace area), a minimum size (default is the one you set in the resource editor) and also a rectangle that the dialog occupies when maximized.

C++
// get desktop size
CRect rc;
GetDesktopWindow()->GetClientRect(&rc);

// set max tracking size to half a screen
SetMaxTrackSize(CSize(rc.Width(), rc.Height()/2));

// maximized position and size on top of the screen
rc.bottom = 100;
SetMaximizedRect(rc);

After all this settings, you may wish the dialog's size and position to be automatically saved and restored, as well as its maximized or minimized state. Just provide a Section and an Entry name in your application's profile, in which to save dialog's status.

C++
// save/restore
// (for dialog based app, default is a .INI file with
// the application's name in the Windows directory)
EnableSaveRestore(_T("DemoDlg"));

You are ready to rebuild your project and you will have a resizable dialog just as you wanted.

For further details, see the next section.

Class Reference

This class inherits from CResizableGrip, CResizableLayout, CResizableMinMax, CResizableState, and obviously from CDialog.

Image 4

CResizableDialog::CResizableDialog

C++
CResizableDialog()
CResizableDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL)
CResizableDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL)

The first is the default constructor.

The second and the third forms are needed to reproduce the construction scheme of a CDialog derived class. Since the dialog resource template is needed by the CDialog constructor, you have to call one of these forms of the CResizableDialog constructor. This is the reason why replacing one class with the other will work.

CResizableDialog::EnableSaveRestore

C++
void EnableSaveRestore(LPCTSTR pszSection, BOOL bRectOnly = FALSE)

Enables automatic save/restore on dialog's open/close operations. The arguments are the same as in CWinApp::WriteProfileString. If bRectOnly is TRUE, the minimized/maximized state is not saved/restored. Should be called after all the layout settings.

If you want details on how this information is stored by your application, look at CWinApp::SetRegistryKey, CWinApp::m_pszProfileName, CWinApp::m_pszRegistryKey on MFC documentation.

CResizable???::???

Implemented in the various base classes, see ResizableLib article.

Conclusion

I would like to make this class more "integrated" with Class Wizard, but I don't even know if it's possible. I hope this class can be useful to other programmers that just want to have resizable dialogs with the minimum effort.

I implemented a sort of percentage resizing. However, currently available anchor types do not permit a high level of complexity, but should be enough in many applications. If you want more flexibility or if your dialogs are very big and full of controls, you may search CodeProject for another solution in this same Section (see the top of the article).

The CVS tree is now on Source Forge.

Updates

25 May 2000

  • Initial public release

31 May 2000

  • Some unneeded code has been removed
  • Flickering has been reduced for Button, Static and ListBox controls
  • Save/Restore support has been added
  • Fixed a nasty bug that only came out with modeless dialogs

9 Jun 2000

  • Now compiles cleanly at warning level 4
  • Memory leak fixed (I completely forgot to free memory)
  • New type of anchorage now allowing more complex layouts (compatible with previous code)
  • Fixed a bug with the size grip when hidden and when the dialog is maximized
  • Better handling of controls that need repainting
  • Demo project updated to show new features

11 Jul 2000

  • Fixed a minor bug in save/restore functions. (standard maximized dialog wasn't restored correctly)

27 Oct 2000

  • Changed layout implementation (from CPtrList to CArray)
  • Fixed a bug with controls that need refresh

23 Nov 2000

  • Fixed a bug with multiple calls to DoModal()
  • Removed doc from zip files (you simply save this page if you need it)

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
  • Automatic resizing style (thanks to John Simmons)
  • Added anti-flickering support

15 Jul 2001

  • Updated to new ResizableLib release
  • Demo project shows new grip implementation

28 Oct 2001

  • Version 1.1 (CVS Tag: SF_1_1)
  • Added static build configurations to all projects

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Technical Lead RoboTech srl
Italy Italy
Paolo began programming at the age of 9 with a glorious Olivetti M24 (i8086) and GW-BASIC, then he played a bit with Turbo C, Turbo Pascal and Assembly (using the MS-DOS Debug). Quick BASIC and Visual Basic shortly followed, until he learned C++ in College. He tought himself MFC and Windows programming, along with some DHTML and Javascript.

Always attracted by low-level programming and Assembly, he started to appreciate the joys of templates and STL while working for his Master Thesis. For seven months he was playing with airplanes and automatic control at the Unversity of Illinois at Urbana-Champaign, where he first met QNX and embedded systems.

In his job experience he learned Java to develop user interfaces and graphical editors, and re-discovered the Eclipse IDE that he had used in its early versions with the QNX SDK. He also deepened his knowledge of Linux and embedded systems, microcontrollers firmware and embedded voice recognition, while also practicing electronics design.

He graduated in Computer Engineering (Ingegneria informatica) at the University of Pisa, Italy, in December 2003. Currently working for an electronics and robotics company (www.robotechsrl.com).

He lives in Pisa and in Follonica (GR), Italy.

Comments and Discussions

 
AnswerRe: I need to resize the controls in a dialog automatically? Pin
Paolo Messina25-Aug-08 0:38
professionalPaolo Messina25-Aug-08 0:38 
QuestionWhile compiling I am getting the follwing error - Cannot open include file: 'ResizableDialog.h': No such file or directory? Pin
johnthecoder24-Aug-08 6:54
johnthecoder24-Aug-08 6:54 
AnswerRe: While compiling I am getting the follwing error - Cannot open include file: 'ResizableDialog.h': No such file or directory? Pin
Paolo Messina24-Aug-08 10:47
professionalPaolo Messina24-Aug-08 10:47 
QuestionError C2440?? Pin
HeiniBlad22-Jun-06 12:07
HeiniBlad22-Jun-06 12:07 
AnswerRe: Error C2440?? Pin
BRWX23-Jul-08 2:20
BRWX23-Jul-08 2:20 
GeneralModeless Dialogs Pin
Neil scsn3-Nov-05 6:06
Neil scsn3-Nov-05 6:06 
GeneralWindowsXP Style Pin
Robert Stefanz19-Feb-05 2:22
Robert Stefanz19-Feb-05 2:22 
Generalwidth changes on minimize maximize Pin
Sanatforu10-Jan-05 19:29
Sanatforu10-Jan-05 19:29 
GeneralRe: width changes on minimize maximize Pin
Paolo Messina10-Jan-05 21:13
professionalPaolo Messina10-Jan-05 21:13 
GeneralRe: width changes on minimize maximize Pin
Sanatforu13-Jan-05 1:05
Sanatforu13-Jan-05 1:05 
GeneralRe: width changes on minimize maximize Pin
Paolo Messina15-Jan-05 8:59
professionalPaolo Messina15-Jan-05 8:59 
Generalgrid class does not resize Pin
name_or_alias3-May-04 4:30
name_or_alias3-May-04 4:30 
GeneralDialog becomes "eternally" minimized Pin
IGx8915-Nov-03 7:45
IGx8915-Nov-03 7:45 
GeneralRe: Dialog becomes "eternally" minimized Pin
Paolo Messina15-Nov-03 12:52
professionalPaolo Messina15-Nov-03 12:52 
GeneralRe: Dialog becomes "eternally" minimized Pin
IGx8926-Jan-04 8:52
IGx8926-Jan-04 8:52 
GeneralPatch Pin
Paolo Messina27-Jan-04 8:04
professionalPaolo Messina27-Jan-04 8:04 
GeneralI wish this was available in Winforms! Pin
Matt Philmon11-Nov-03 3:49
Matt Philmon11-Nov-03 3:49 
GeneralRe: I wish this was available in Winforms! Pin
Paolo Messina11-Nov-03 6:44
professionalPaolo Messina11-Nov-03 6:44 
GeneralFails with ActiveX Control Pin
Alex Mitchell4-Nov-03 9:24
Alex Mitchell4-Nov-03 9:24 
GeneralRe: Fails with ActiveX Control Pin
Paolo Messina5-Nov-03 6:51
professionalPaolo Messina5-Nov-03 6:51 
GeneralRe: Fails with ActiveX Control Pin
Alex Mitchell5-Nov-03 7:49
Alex Mitchell5-Nov-03 7:49 
GeneralReplacing CDialog instances Pin
speedpacer30-Sep-03 4:27
speedpacer30-Sep-03 4:27 
GeneralRe: Replacing CDialog instances Pin
Paolo Messina30-Sep-03 4:57
professionalPaolo Messina30-Sep-03 4:57 
GeneralRe: Replacing CDialog instances Pin
speedpacer30-Sep-03 5:55
speedpacer30-Sep-03 5:55 
GeneralRe: Replacing CDialog instances Pin
Paolo Messina30-Sep-03 6:08
professionalPaolo Messina30-Sep-03 6:08 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.