如何从另一个对话框中显示对话框?

时间:2015-05-07 11:39:44

标签: winapi visual-studio-2008 mfc

我是MFC的新手。我有一个原生的C ++ MFC应用程序。我想从主对话框中显示一个对话框。在主对话框中,我分别有三个按钮(Back,Next,Cancel)。 在Next按钮上单击事件我通过隐藏主对话框来调用DoModal以显示另一个对话框,如下所示

void CFirstPage::OnBnNextButton()
{
    ::ShowWindow(this->GetSafeHwnd(),SW_HIDE);
    CSecondPage secondDlg;
    secondDlg.DoModal();
}
void CSecondPage::OnBnBackBtnClicked()
{
    ::ShowWindow(this->GetSafeHwnd(),SW_HIDE);
    CFirstPage FirstPage;
    FirstPage.DoModal();
}

执行此代码片段后,主对话框被隐藏,甚至应用程序图标也会从任务栏中消失,并在弹出另一个对话框时再次出现。 (基本上我对两个对话框都有相同的图标,图标不应该消失并再次出现。它必须保持不变而不会出现并消失。)

如何在没有任何闪烁效果的情况下在任务栏中显示图标?

在中途从后面移动到下一个期间,我点击取消,取消事件处理如下,

void CFirstPage::OnCancel()
{
    CDialog::EndDialog(TRUE);//For closing the dialog.
}
void CSecondPage::OnCancel()
{
    CDialog::EndDialog(TRUE);//For closing the dialog.
}

步骤1:在主对话框中单击“下一步”

步骤2:单击第二页中的取消

现在应用程序关闭了。但仍有实例在“TaskManager”中处于活动状态。根据我的理解,一旦窗户关闭,没有任何实例应该存活? 我怀疑第一个对话框只是隐藏而未结束,该实例仍存在于TaskManager中。这种理解是否正确?

如何解决此问题?

任何人都可以帮助我解决这个问题。

3 个答案:

答案 0 :(得分:0)

正如Iinspectable所说,属性表最适合您的问题陈述。有关如何使用CPropertysheets的一个非常好的示例可以在codeproject中找到 CProperty sheet example

答案 1 :(得分:0)

Probably your main windows is still hidden after you end dialog with second page. Ending dialog of CSecondPage does not close application only closes active CSecondPage dialog.

Also OnCancel/OnOK does not need to be overriden if you just EndDialog with it. There is default behaviour implemented in OnCancel, which will close the dialog.

After secondPage.DoModal() show your main dialog again, or close it if that is the behaviour you want to achieve.

答案 2 :(得分:0)

FirstPage现在不是原始的第一个对话框,因此您应该自己存储第一个对话框对象。你可以这样做:

void CFirstPage::OnBnNextButton()
{
::ShowWindow(this->GetSafeHwnd(),SW_HIDE);
CSecondPage secondDlg;
secondDlg.setFirstDialog(this);   //customer function to store first dialig object
secondDlg.DoModal();
}

void CSecondPage::OnBnBackBtnClicked()
{
::ShowWindow(this->GetSafeHwnd(),SW_HIDE);
::ShowWindow(m_firstDialog->GetSafeHwnd(), SW_SHOW);
}