Microsoft KB Archive/103788

= INFO: Creating a Modeless Dialog Box with MFC Libraries =

Article ID: 103788

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 1.0 Professional Edition

 Microsoft Visual C++ 1.5 Professional Edition

 Microsoft Visual C++ 1.51

 Microsoft Visual C++ 1.52 Professional Edition</li></ul>

 Microsoft Visual C++ 1.0 Professional Edition</li></ul>

 Microsoft Visual C++ 2.0 Professional Edition</li></ul>

 Microsoft Visual C++ 2.1</li></ul>

 Microsoft Visual C++ 4.0 Standard Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q103788

<div class="notice_section">

This article demonstrates how to create a modeless dialog box using a dialog-box template resource using MFC.

To build a CModeless dialog box, the following steps should be followed:

<ol>  Create a dialog class derived from CDialog and override the Create member function of CDialog. For example, you might have code that resembles the following: class CModeless: public CDialog {            .             .             .             public: CModeless{ } BOOL Create(UINT nID, CWnd * pWnd) { return CDialog::Create(nID,pWnd);} .            .             .           }; NOTE: You could let ClassWizard generate the dialog class and then simply add the Create function. </li>  Write code to construct an object of the dialog class and create the dialog box window. For example, if you have a menu item that should display the dialog box, you might have code that resembles the following: void CMainFrame::OnModeless {           pdlg = new CModeless; pdlg->Create(IDD_DIALOG1,this); } where CMainFrame::pdlg is defined as:

CModeless * pdlg;

NOTE: It is important to allocate the object on the heap rather than the stack if you want to prevent the modeless dialog box from being destroyed when the function is exited. </li>  You must call CWnd::DestroyWindow in OnCancel, or whenever the modeless dialog box needs to be destroyed. void CModeless::OnCancel {         DestroyWindow; }               </li>  Override CWnd::PostNcDestroy in your dialog class to delete the dialog box object: virtual void CModeless::PostNcDestroy {delete this;} PostNcDestroy is a virtual member function of the CWnd class that is called by the OnNcDestroy function. </li></ol>

A modeless dialog class will typically override the OnOK and OnCancel member functions to call DestroyWindow and should not call the base class CDialog::OnOK and CDialog::OnCancel functions. The CDialog::OnOK and CDialog::OnCancel functions call EndDialog. EndDialog should be called only when using modal dialog boxes.

If you are using Dialog Data Exchange (DDX) and Dialog Data Validation (DDV), you're OnOK handler for your dialog class might resemble the following: void CModeless::OnOK {          if (!UpdateData(TRUE)) {              TRACE0("UpdateData failed during dialog termination\n"); // The UpdateData routine will set focus to correct item return; }          DestroyWindow; }

<div class="summary_section">

SUMMARY
Additional query words: kbinf 1.00 1.50 2.00 2.10 2.50 2.51 2.52 3.00 3.10 4.00

Keywords: kbinfo kbuidesign kbdlg KB103788

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.