bigbaz34
bigbaz34

Reputation: 395

How to close a dialog box using do modal

Okay basically I have an MFC application with lots of dialogs that need to be cycled through. Basically when you click one button to go to another dialog, I want the previous dialog to close. Right now the dialogs are just displayed over the top of each other. How do I get the dialog to close once the new dialog has opened? Here is some example code:

void CMachine2Dlg::OnBnClickedNewmc()
{
    NameDlg Dlg;
    Dlg.DoModal()       

    }

Upvotes: 2

Views: 21730

Answers (6)

zar
zar

Reputation: 12247

What you can do is hide the parent dialog when you DoModal() the new dialog and destroy it after the new dialog ends. I have not tested the ShowWindow() below but you get the idea, if it doesn't hide the dialog look for another similar function.

void CMachine2Dlg::OnBnClickedNewmc()
{
   ShowWindow( SW_HIDE);

   NameDlg Dlg;
   Dlg.DoModal();

   EndDialog( 0 );

}

Upvotes: 7

Mihaly
Mihaly

Reputation: 21

You could call OnCancel() inside your dialog class. Like: this->OnCancel();

Upvotes: 2

nobs
nobs

Reputation: 730

@tenfour suggest a good possible solutions But if its not possible for you you should create the dialogs from one basic windows/Dlg

Mydialog  dlg1
if(dlg1.DoModal() )
{
   //do something
}
else
   // do something else

Mydialog  dlg2
if(dlg2.DoModal() )
{
   //do something
}
else
   // do something else

and so on....

This way you don't have easy controll of "what's" going on and you don't have to mess with different windows, messageloops.

Upvotes: 1

djeidot
djeidot

Reputation: 4642

OnOK(), OnCancel() or EndDialog(nResult) will answer your title question.

However, like @tenfour suggested, you should be using a property sheet / wizard. It can also be a single dialog window with several child property page windows that you show or hide depending on what you want to be seen.

For this, you will need:

  • 1 dialog window, maybe with Prev/Next buttons
  • 1 picture box, frame style, not visible, inside the dialog where you want the child windows to appear
  • n property pages, child style, no border, where you put all the controls.

Create a class for the dialog and each property page, add a member variable of each property page to the dialog, create the property pages and use the frame as a reference to place them. On button click just show/hide the necessary pages.

Upvotes: 2

Martin
Martin

Reputation: 292

IT will be difficult to chain those dialog the way you mention. Do modal is usually meant to implement exactly what you are experiencing. Ie: dialog pops up over the previous one.

One way to do this is to create the modal dialogs sequence in the class that calls the first dialog and use the return value of the previous dialog to determine if you need to show the second one and so forth.

For ex:

// define a bunch of constants, any number would do,
// I would avoid 0 and 1 as they usually mean success/error
// This code can be returned in the EndDialog call in a method of your choice (say button click handler).

const int c_needNextDialog = 101; 


dialog1 dlg1;

if( dlg1.DoModal() == c_needNextDialog )
{
   dialog2 dlg2;

   if( dlg2.DoModal() == c_needNextDialog )
   {
      ... and so forth
   }
}

I'm sure you get the idea...

in your dialog, you return like so (taken directly from msf)

void dialog1::OnSomeAction()
{
   // Do something
   EndDialog(c_needNextDialog); // This value is returned by DoModal!

   // Do something

   return; // Dialog closed and DoModal returns only here!
}

I would stay clear of modeless dialog, you will end up with another problem like how to control the flow of dialog and prevent people to click the main window of your application behind.

Upvotes: 6

Luchian Grigore
Luchian Grigore

Reputation: 258648

You could try calling

EndDialog(nResult);

Upvotes: 3

Related Questions