Dialog which can be used as MDI child window | CodeGuru

Dialog which can be used as MDI child window

–> Many people have asked for a dialog that can be used as an MDI child window. So here it is! I hope this will make some people happy 🙂 Usage: 1.) Derive a dialog class from CMDIDialog 2.) Create a pointer to an object of the derived class: e.g., CMyMDIDialog* pDlg = new CMyMDIDialog(IDD_MYDIALOG); […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 19, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

–>

Many people have asked for a dialog that can be used as an MDI child window. So here it is!
I hope this will make some people happy 🙂

Usage:

1.) Derive a dialog class from CMDIDialog

2.) Create a pointer to an object of the derived class:
e.g., CMyMDIDialog* pDlg = new CMyMDIDialog(IDD_MYDIALOG);

3.) Call the DoInsert() function:
pDlg->DoInsert()

It’s important that a pointer to this dialog be created. Don’t destroy the dialog by delete(pDlg).
Instead, call the DestroyWindow() function and the object will be destroyed automatically.
pDlg->DestroyWindow();

In addition, don’t call EndDialog(ID). In order to dismiss the dialog use either the
OnCancel or OnOK member functions.

Things that don’t work yet:
1.) I couldn’t find out how to disable the WS_VISIBLE style. If you set
this style in the resource editor and also set the DS_CENTER style
the dialog will jump on the screen from the normal position to the
centered position.
2.) The CenterWindow() function doesn’t center the dialog correctly.
Therefore I added my own centering code.
3.) The window title don’t appear in the window menu.

If someone fixes these problems or adds more functionality to this code please send me an eMail at:

lhornbach@aol.com

Regards Martin Horst

// ******************************************************************
// ** CMDIDialog: Dialog which can be used as MDI child 
// ** window
// 
// ** Written 1998 by Martin Horst
// ******************************************************************

//
========================================================================
// == CMDIDialog header file
==============================================
//
========================================================================

#if
!defined(AFX_MDIDIALOG_H__C18B3761_03C6_11D2_92BA_0040053CC5C2__INCLUDED_)
#define AFX_MDIDIALOG_H__C18B3761_03C6_11D2_92BA_0040053CC5C2__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// MDIDialog.h : header file
//

////////////////////////////////////////////////////////////////////////////
/
// CMDIDialog dialog

class CMDIDialog : public CDialog
{
// Construction
public:
        CMDIDialog(LPCTSTR lpszTemplateName, CWnd* pParent = NULL);
  CMDIDialog(UINT nIDTemplate, CWnd* pParent = NULL);

  void DoInsert();
  void CenterWindow(CWnd* pAlternateOwner = NULL);
  bool IsWndInserted() { return bInserted; };

// Dialog Data
        //{{AFX_DATA(CMDIDialog)
                // NOTE: the ClassWizard will add data members here
        //}}AFX_DATA


// Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CMDIDialog)
        //}}AFX_VIRTUAL

// Implementation
protected:

        // Generated message map functions
        //{{AFX_MSG(CMDIDialog)
        virtual void OnCancel();
        virtual void OnOK();
        afx_msg void OnDestroy();
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()

private:
  bool bInserted;
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations
immediately before the previous line.

#endif //
!defined(AFX_MDIDIALOG_H__C18B3761_03C6_11D2_92BA_0040053CC5C2__INCLUDED_)



//
========================================================================
// == MDIDialog.cpp : implementation file
=================================
//
========================================================================

// MDIDialog.cpp : implementation file
//

#include "stdafx.h"
#include "Unp70.h"
#include "MDIDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

////////////////////////////////////////////////////////////////////////////
/
// CMDIDialog dialog

CMDIDialog::CMDIDialog(LPCTSTR lpszTemplateName, CWnd* pParent /*=
NULL*)
        : CDialog(lpszTemplateName, pParent)
{
  bInserted = false;
}

CMDIDialog::CMDIDialog(UINT nIDTemplate, CWnd* pParent /*= NULL*)
        : CDialog(nIDTemplate, pParent)
{
  bInserted = false;
}



BEGIN_MESSAGE_MAP(CMDIDialog, CDialog)
        //{{AFX_MSG_MAP(CMDIDialog)
        ON_WM_DESTROY()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

////////////////////////////////////////////////////////////////////////////
/
// CMDIDialog message handlers

void CMDIDialog::OnCancel()
{
  if ( bInserted )
     DestroyWindow();
  else
     CDialog::OnCancel();
}

void CMDIDialog::OnOK()
{
  if ( bInserted )
     DestroyWindow();
  else
     CDialog::OnOK();
}

void CMDIDialog::OnDestroy()
{
  CDialog::OnDestroy();
  if ( bInserted )
     delete(this);
}

void CMDIDialog::DoInsert()
{
CMDIFrameWnd* pWnd = (CMDIFrameWnd*) AfxGetMainWnd();
CWnd* pChildWnd    = FromHandle(pWnd -> m_hWndMDIClient);

  bInserted = true;
  Create(m_lpszTemplateName, NULL);

  SetParent(pChildWnd);

  if ( GetStyle() & DS_CENTER )
     CenterWindow();

  SetFocus();
  ShowWindow(SW_SHOW);
}

void CMDIDialog::CenterWindow(CWnd* pAlternateOwner)
{
CWnd* pWnd = AfxGetMainWnd();
CRect Rect;
int nX, nY;

  if ( bInserted || )
     if ( pAlternateOwner != NULL )
        CDialog::CenterWindow(pAlternateOwner);
     else
        {
        pWnd = AfxGetMainWnd();

        pWnd -> GetClientRect(&Rect);
        nX = Rect.Width() / 2;
        nY = Rect.Height() / 2;

        GetWindowRect(&Rect);
        nX -= Rect.Width() / 2;
        if ( nX < 0 ) nX = 0;
        nY -= Rect.Height() / 2;
        if ( nY < 0 ) nY = 0;

        SetWindowPos(NULL, nX, nY, 0, 0, SWP_NOSIZE);
        }
  else
     CDialog::CenterWindow(pAlternateOwner);
}


CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.