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);
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);
}

Comments
How can I do this in C language?
Posted by Legacy on 11/14/1999 12:00amOriginally posted by: Rafa Alonso
Someone can explain me how can I do this in c language.
ReplyCWnd::GetDlgItem() returns temporary pointer
Posted by Legacy on 02/16/1999 12:00amOriginally posted by: Stephen K. Terry
ReplyHow to create an MDI child window in a dll?
Posted by Legacy on 02/09/1999 12:00amOriginally posted by: Dmitry Babitsky
I want to be able to dynamically extend my application at run time
by allowing MDI child windows to be loaded from a Dll.
Pre-conditions: the main application does not know what Child windows
are available until the run time. The functionality should be similar
to COM Component Categories.
To complicate the matter even further the main application may not be
an MFC app.
Is that possible and if so does anybody have any ideas?
Dmitry.
ReplyHit "Enter" Key Will Colose the Frame.
Posted by Legacy on 01/04/1999 12:00amOriginally posted by: Wenfei Wu
It's a very interesting idea. However, when I hit "Enter" key, the frame closed. Could you tell me how to fix it.
TIA
ReplyAn easier way...
Posted by Legacy on 11/21/1998 12:00amOriginally posted by: Rossetti Gianluca
Reply