Как закрыть диалоговое окно с помощью do modal - PullRequest
0 голосов
/ 25 октября 2011

Хорошо, в основном у меня есть приложение MFC с множеством диалогов, которые нужно циклически проходить.В основном, когда вы нажимаете одну кнопку, чтобы перейти к другому диалогу, я хочу закрыть предыдущий диалог.Прямо сейчас диалоги просто отображаются поверх друг друга.Как заставить диалог закрыться после открытия нового диалога?Вот пример кода:

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

    }

Ответы [ 6 ]

6 голосов
/ 26 октября 2011

Что вы можете сделать, это скрыть родительский диалог при DoModal() новом диалоге и уничтожить его после завершения нового диалога.Я не проверял ShowWindow() ниже, но вы понимаете, если он не скрывает диалог, ищите другую похожую функцию.

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

   NameDlg Dlg;
   Dlg.DoModal();

   EndDialog( 0 );

}
5 голосов
/ 25 октября 2011

Этому диалогу будет сложно связать, как вы упомянули. Do modal обычно предназначен для реализации именно того, что вы испытываете. То есть: диалоговое окно всплывает поверх предыдущего.

Один из способов сделать это - создать модальную последовательность диалогов в классе, которая вызывает первое диалоговое окно, и использовать возвращаемое значение предыдущего диалога, чтобы определить, нужно ли показывать второе диалоговое окно и т. Д.

Например:

// 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
   }
}

Я уверен, что вы поняли ...

в вашем диалоге вы возвращаетесь вот так (взято непосредственно из 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!
}

Я бы остался в стороне от немодального диалога, у вас возникнет еще одна проблема, например, как управлять потоком диалога и не дать людям нажимать на главное окно вашего приложения позади.

2 голосов
/ 25 октября 2011

OnOK(), OnCancel() или EndDialog(nResult) ответят на ваш заглавный вопрос.

Однако, как предложил @tenfour, вы должны использовать страницу свойств / мастера. Это также может быть одно диалоговое окно с несколькими окнами дочерних страниц свойств, которые вы показываете или скрываете в зависимости от того, что вы хотите видеть.

Для этого вам понадобится:

  • 1 диалоговое окно, возможно с кнопками «Предыдущая / Следующая»
  • 1 графическое окно, стиль рамки, не виден внутри диалога, в котором вы хотите, чтобы дочерние окна появлялись
  • n страниц свойств, дочерний стиль, без рамки, куда вы помещаете все элементы управления.

Создайте класс для диалога и каждой страницы свойств, добавьте переменную-член каждой страницы свойств в диалог, создайте страницы свойств и используйте фрейм в качестве ссылки для их размещения. При нажатии на кнопку просто показать / скрыть нужные страницы.

2 голосов
/ 25 октября 2011

Вы можете попробовать позвонить

EndDialog(nResult);
1 голос
/ 19 июля 2015

Вы можете вызвать OnCancel () внутри вашего диалогового класса.Нравится: this->OnCancel();

1 голос
/ 25 октября 2011

@ tenfour предложить хорошие возможные решения Но если это невозможно для вас Вы должны создавать диалоги из одного базового окна / Dlg

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

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

и так далее ...

Таким образом, вы не можете легко контролировать то, что происходит, и вам не нужно возиться с разными окнами, сообщениями.

...