Sizing Framework

Environment:VC++ 6.0, NT 4.0, Win95/98, W2K

Introduction

The WTL possibilities to build sizeable graphical user interface exists but was not fitting my needs so I decided to port the excellent framework from Paul DiLascia 'Windows UI: Our WinMgr Sample Makes Custom Window Sizing Simple' published in the July 2001 issue of MSDN Magazine. To understand all the principle of the framework, please read the original article.

The port was almost straightforward. I just added the gripper to the dialog.

Usage

To use the framework you need first to add those files to your project:
  • WinMgr.h
  • WinMgr.cpp
  • WinRect.cpp
  • SizeableDlg.h

Your dialog needs then to inherit from the class CDialogSizeable like this:

class CTestDlg : 
    public CDialogSizeable<CTestDlg>,
    public CDialogImpl<CTestDlg>

In the OnInitDialog() event handler, add as first line the following:

LRESULT CTestDlg::OnInitDialog( HWND hwnd, LPARAM  lParam)
{
    BOOL bRet = 
       CDialogSizeable<CTestDlg>::OnInitDialog(hwnd,
                                                     lParam);
   ...
}

Add the following macro to your main message map:

BEGIN_MSG_MAP_EX(CTestDlg)
    ...
    MESSAGE_HANDLER_EX(WM_WINMGR, OnWinMgr)
    ...
END_MSG_MAP()

And the the method to your dialog class (get more information on the original article):

///////////////////
// Handle WM_WINMGR: return min size for OK/Cancel buttons
//
LRESULT CTestDlg::OnWinMgr(UINT uMsg, WPARAM wp, LPARAM lp)
{
   ATLASSERT(lp);
   NMWINMGR& nmw = *(NMWINMGR*)lp;

   if ( nmw.code == NMWINMGR::GET_SIZEINFO )
   {
       if ( wp==IDOK || wp==IDCANCEL )
       {
           nmw.sizeinfo.szMin = m_szMinButton;
           return TRUE;
       }
   }
   return 0;
}

Build the Window map in the cpp file of your dialog class, i.e.:

BEGIN_WINDOW_MAP(TestDlgMap)
BEGINROWS(WRCT_REST,0,RCMARGINS(8,8))
 BEGINCOLS(WRCT_REST,0,0)
  BEGINROWS(WRCT_REST,4,RCMARGINS(-4,-4))
   RCTOFIT(IDC_STATIC1)
   RCSPACE(-4)
    BEGINROWS(WRCT_TOFIT,IDC_GROUP1,RCMARGINS(-8,-8))
     RCSPACE(-10)
    RCTOFIT(IDC_RADIO1)
    RCTOFIT(IDC_RADIO2)
    ENDGROUP()
  ENDGROUP()
  RCPERCENT(IDC_EDIT1,50)
 ENDGROUP()
 RCSPACE(-4)
 RCTOFIT(IDC_STATIC2)
 RCTOFIT(IDC_SLIDER1)
 BEGINCOLS(WRCT_TOFIT,0,0)
  RCREST(-1)
  BEGINROWS(WRCT_TOFIT,0,0)
    RCTOFIT(IDOK)
    RCSPACE(-2)
    RCTOFIT(IDCANCEL)
  ENDGROUP()
 ENDGROUP()
ENDGROUP()
END_WINDOW_MAP()

Add finally the following to the constructor of your dialog:

CTestDlg::CTestDlg( ) : 
    CDialogSizeable<CTestDlg>( TestDlgMap )
{
    ...

Now enjoy your sizing dialog.

Faced Problems

None (at the moment).

About Laurent Kempi

I am originally from Mulhouse, east of France, and currently searching for a new job. In 1995, I was graduated Software Engineer in ESSAIM Higher School of Engineering. I develop mainly in C++ for Windows platforms and I have a strong knowledge of the Windows security/logging system. I am currently digging in XML, SOAP and actively learning C# and .Net platform. I have knowledge in Object Oriented Design, UML, Design Patterns and be familiar with COM/COM+, DCOM, ATL/WTL, STL, MFC.

Click here to visit Tech Head, Laurent Kempi's homepage.

Downloads



Comments

  • Using CWinMgr in a COM object

    Posted by MoAz on 04/19/2006 09:45am

    Hello, I have a question about how can I use CWinMgr in a COM object. I am new in COM en MFC. what I am trying to do is making a COM object that first makes a connnection with a database in FoxPro and then viewing the information from that database in a dialog. this connection and creating of dialog and his controls must be done dynamically. how can I use CWinMgr to create dynamically a dialog and his controls and resizing them also dynamically? any idea? Thank you

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

Top White Papers and Webcasts

  • On-demand Event Event Date: September 10, 2014 Modern mobile applications connect systems-of-engagement (mobile apps) with systems-of-record (traditional IT) to deliver new and innovative business value. But the lifecycle for development of mobile apps is also new and different. Emerging trends in mobile development call for faster delivery of incremental features, coupled with feedback from the users of the app "in the wild." This loop of continuous delivery and continuous feedback is how the best mobile …

  • On-demand Event Event Date: September 17, 2014 Another day, another end-of-support deadline. You've heard enough about the hazards of not migrating to Windows Server 2008 or 2012. What you may not know is that there's plenty in it for you and your business, like increased automation and performance, time-saving technical features, and a lower total cost of ownership. Check out this webcast and join Rich Holmes, Pomeroy's practice director of virtualization, as he discusses the future state of your servers, …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds