Virtual Developer Workshop: Containerized Development with Docker

I recently needed a wizard that could be resized by the user. After looking around on CodeGuru I found nothing that would do this completely so I created my own (since I have taken so much code and ideas from CodeGuru, I felt that the time had come to give something back).

After a while I came up with the class CResizablePropertySheet. It is derived from the MFC CPropertySheet class and handles the resizing of the standard wizard buttons, the tab control and the pages included in the sheet. The CResizablePropertySheet uses a class CDlgItemResizer that handles the resizing of the controls in the property sheet. In an article written by Eli Vingot (elivingt@internet-zahav.net) implementing a resizable dialog, I found some great code. I have been writing control-resizing code manually for almost 10 years and the idea just never came to me that this could be automated. Eli Vingot's code really takes the pain out of resizing.

To use the CResizablePropertySheet class, just use it as you would use the MFC CPropertySheet. If you have already derived your own sheet from the CPropertySheet, just replace all occurrences of CPropertySheet to CResizablePropertySheet.

The next thing to do is to handle the resizing in all of the included pages. Create a page the normal way and declare a CDlgItemResizer member variable inside it. Also, add the OnInitDialog() and OnSize() member functions. In the OnInitDialog() function, use the CDlgItemResizer::Add() routine to add all the controls that are to be resized. Make sure to use the correct combination of the resizing flags (lock to top/left/right/bottom). In the OnSize() member function, add a single line of code to resize all controls: call the CDlgItemResizer::Resize().


Download demo project - 20 Kb



  • add minimize & maximize buttons

    Posted by div!sion on 10/19/2009 01:04pm

    You can add the window minimize and maximize buttons by adding "WS_MAXIMIZEBOX|WS_MINIMIZEBOX" to ModifyStyle called at the end of CResizablePropertySheet::OnInitDialog().

  • CResizablePropertySheet Multiple Instance Crashes Application

    Posted by Legacy on 09/29/2003 07:00am

    Originally posted by: Ninad Shah

    Hello There,
    I am using CResizablePropertySheet in my program by extending that class as follows:

    void CMyClass::SHowProperty()
    /* Extends CResizablePropertySheet */
    CMyPropertySheet *sheet = new CMyPropertySheet(this);

    /*Extends CResizablePropertyPage */
    CMyPage *page = new CMyPage(this);


    I am calling this function several times as and when user clicks on a row in table. User may not have closed the earlier opened property sheet while he is clicking on another row.

    The property page comes up properly in first click, but next time when user clicks on a row to open property sheet, the whole application crashes.

    Is thet any clue to this problem.

    I highly appreciate any help on this.

    Thanks in advance.

    • help

      Posted by wanganjun78 on 06/07/2004 08:38am

      Can you give me some advice about thiss problem

  • DlgItemResizer.Resize() changes z-order

    Posted by Legacy on 08/14/2003 07:00am

    Originally posted by: Mike Lischke

    I'm perplex that nobody every realized that the DeferWindowPos calls in the Resize method currently change the z-order of the windows (or didn't they just tell us?). This has ugly side effects like controls on a group box suddenly disappear because they are now behind the box.

    The solution for this problem is pretty simple. Replace the last value (0) in the DeferWindowPos calls by SWP_NOZORDER and bob's your uncle.


    • How to change "DlgItemResizer.Resize() changes z-order"

      Posted by ken123 on 11/18/2004 09:04pm

      How do you go by doing it? Can you show us by example on how to "Replace the last value (0) in the DeferWindowPos calls by SWP_NOZORDER" Thanks.

  • Good code. Thanks a lot.

    Posted by Legacy on 03/13/2003 08:00am

    Originally posted by: rm_pkt

    Thanks a lot Magnus.
    It is very useful to me as I need Resizeable Property sheet.

    And thanks to KL (2000/05/26). Its really good idea for
    modeless in standard mode

  • CDlgItemResizer::Resize(CFormView *) not implemented

    Posted by Legacy on 02/01/2002 08:00am

    Originally posted by: Ian


    Great code, thank you. I've just worked into my project and your work has shaved days of my development schedule.

    Just wondering why the Resize(CFormView*) method isn't implemented on CDlgItemResizer?

    I only discovered the omission when I decided to reuse your resizer class in a form view. It seems to work it we use the CWnd* method instead, but I was wondering what the specialisation was intended to do?

    Anyone got any ideas?


  • Problems with displaying property pages

    Posted by Legacy on 12/18/2001 08:00am

    Originally posted by: Alexander Vogt

    I tried to use the classes with a property sheet that I create at runtime. Everything works fine, but after resizing, the content of the active property page is gone. One has to change onto another tab first, and then go back again, to see the list-control it contains. I tried to insert several kinds of redraws, but it didn't work.
    I'm really not an expert at MFC , and the solution may e simple. Could anyone help?



  • Problem: Flickering on resize

    Posted by Legacy on 09/01/2001 07:00am

    Originally posted by: Simon

    anybody knows how to remove flickering on resizing of the property sheet ?

  • Problems Resizing X-Axis

    Posted by Legacy on 11/15/2000 08:00am

    Originally posted by: Andreas Lander

    Resizing the Height of the Propertysheet is no problem, but i cant resize the X-Axis...

  • Modeless Issues in Standard Mode

    Posted by Legacy on 05/26/2000 07:00am

    Originally posted by: KL

    These issues appear when running the property sheet as 
    modeless in standard mode. You can recreate them in the
    demo project by making CResizablePropertySheet modeless:

    1. The initial property page appears blank until you switch
    to a different page then switch back.

    2. When resizing a page the controls disappear from the

    As Paul Hurley pointed out, 'm_rcClient' and 'm_rcPage' are
    used by GetPageRect() before they are initialized in
    OnInitDialog(). Yet clearing them in the constructor
    doesn't allow GetPageRect() to get the right values. Thus
    the controls are drawn somewhere off the property page.

    To get around this problem I added the flag
    'm_bInitialized' to CResizablePropertySheet. I set it
    to 'false' in the constructors and to 'true' at the end of
    OnInitDialog() before returning. Then I added this line to
    OnSize() after 'InvalidateRect(m_rcGripper, TRUE);':

    if(!m_bInitialized) return;

    Now everything seems to be working just fine.

  • Tab Control disappears

    Posted by Legacy on 05/17/2000 07:00am

    Originally posted by: Wayne Irons

    The resizable property sheet is GREAT.  I do have one problem.  When I resize my property sheet, my tab control disappears.  I am using an image tab control which I create thus:

    BOOL CFundSheet::OnInitDialog()
    BOOL bResult = CResizablePropertySheet::OnInitDialog();

    m_ImageTab.Create( IDB_BITMAP2, 16, 1, RGB(255,255,255) );
    CTabCtrl *pTab = GetTabControl();
    pTab->SetImageList( &m_ImageTab );

    TC_ITEM tcItem;
    tcItem.mask = TCIF_IMAGE;
    for( int i = 0; i < 7; i++ )
    tcItem.iImage = 0;
    pTab->SetItem( i, &tcItem );
    return bResult;


    Then after I resize, the tab control vanishes. If I change the ResizeablePropertySheet::OnSize handler a bit, I can make it reappear, kind of. Is there a good fix for this? Thanks.

  • Loading, Please Wait ...

  • You must have javascript enabled in order to post comments.

Leave a Comment
  • Your email address will not be published. All fields are required.

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date