A Custom MDI Client Class


Desktop-as-a-Service Designed for Any Cloud ? Nutanix Frame

Environment: The code has been tested using VC5 and VC6 under Win98 and WinNT 4.0 and it works fine.

What's this?

The CMDIClient is a quite simple CWnd-derived class that allows you to display any bitmap image in MDIClient area or choose any background color. You can load the image from file as well as from the resource and you can choose the mode what the image will be displayed in. Available modes are: tile, center, stretch and custom. In the last mode you can set manually left-top coordinates of the image and display it at any position you wish. Additionally, the class provides two functions for saving/restoring current settings to the registry. The saving/restoring can be done automatically (on WM_DESTROY and PreSubclassWindow() ) if m_bAutoSaveRestore flag is set to TRUE (in fact, that's set by default). When the bitmap is loaded from the resource, you can map some colors to the system colors using the COLORMAP structure, (e.g. you can map light gray to COLOR_3DFACE and so on, see the demo project for more details).

The bitmap is drawn in CMDIClient's OnPaint() message handler (the original OnPaint() isn't called at all). There's no palette support in this version so don't expect good effects when you are in 256 (or less) color mode and you try to display a 256 color bitmap. The demo project includes a simple dialog, which allows you to set all properties at runtime, so just try it!

CMDIClient properties

Set or get the background color. For painting the background we use FillRect (not FillSolidRect for some reasons), so we need a brush. The brush is created based on a supplied color when SetBkColor is called.

COLORREF GetBkColor() const;
void SetBkColor( COLORREF clrValue );
Load background bitmap from given file.

BOOL SetBitmap( LPCTSTR lpszFileName, UINT uFlags =  LR_LOADMAP3DCOLORS );
Load background bitmap from resource. You can map some colors using the COLORMAP struct (see LoadMappedBitmap in MSDN for details how to use it).

BOOL SetBitmap( UINT nBitmapID, COLORMAP* pClrMap = NULL, int nCount = 0 );
Set or get the current display mode (dispTile, dispCenter, dispStretch or dispCustom).

void SetDisplayMode( DisplayModesEnum eDisplayMode );
DisplayModesEnum GetDisplayMode() const;
Specify or retrieve the coordinates of image top-left corner. Used when dispCustom is selected. If bRedraw is set to TRUE, the entire window is invalidated.

void SetOrigin( int x, int y, BOOL bRedraw = TRUE );
void SetOrigin( const CPoint& point, BOOL bRedraw = TRUE );
const CPoint& GetOrigin() const;
Return the current image size. If there's no image, (0,0) is returned.

const CSize& GetImageSize() const;
Return the filename of the bitmap. Empty string if there's no image or if the image was loaded from the resource.

const CString& GetFileName() const;
If set to TRUE, the current state is automatically saved on WM_DESTROY and restored on PreSubclassWindow(). If you would like to control this manually, set it to FALSE and call SaveState()/RestoreState() when you want.

void SetAutoSaveRestore( BOOL bNewValue );
BOOL GetAutoSaveRestore() const;

CMDIClient methods

Restore original (system-wide) settings for the MDIClient and repaint the window.

void Reset();
Load/store current settings in the registry

void SaveState();
void RestoreState();
For further information look at the CMDIClient header and implementation files.

How to use it?

First, add to your CMainFrame class implementation file a member variable of type CMDIClient. A good practice is to keep the variables protected (or private) and uses an inline functions to gain access to them, if needed. Then within OnCreate() handler add a following code.

// Subclass the MDI client window
VERIFY( GetMDIClient().SubclassWindow( m_hWndMDIClient ) );
After that you can set the desired MDIClient properties by calling appropriate functions.

Download demo project - 37 KB

Download source - 5 KB

Date Last Updated: April 3, 1999


  • There are no comments yet. Be the first to comment!

  • 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