C++ 使用单例创建对话框

C++ 使用单例创建对话框,c++,visual-c++,user-interface,mfc,C++,Visual C++,User Interface,Mfc,我正在尝试使用singleton创建非模态对话框 CMyDlg& CMyDlg::GetInstance() { static CMyDlg myDlg; return myDlg; } 然后按下一些按钮,我称之为创建 CMyMain::OnSomeButtonPress() { CMyDlg::GetInstance().Create( CMyDlg::IDD ); } 但问题是,当我尝试调用Create两次时,它失败了(wincore.cpp第638行中的

我正在尝试使用singleton创建非模态对话框

CMyDlg& CMyDlg::GetInstance()
{
    static CMyDlg myDlg;
    return myDlg;
}
然后按下一些按钮,我称之为创建

CMyMain::OnSomeButtonPress()
{
    CMyDlg::GetInstance().Create( CMyDlg::IDD );
}
但问题是,当我尝试调用Create两次时,它失败了(wincore.cpp第638行中的某些内容)

我做错了什么,为什么

CMyDlg::GetInstance().Create( CMyDlg::IDD );

不能调用两次?

CMyDlg
最终派生自
CWnd
,它封装了一个
HWND
句柄
Create()。当然,
Create()
断言
mu hWnd
的第一件事实际上是
NULL


如果希望两个对话框同时显示在屏幕上,则需要两个
CMyDlg
实例来表示它们;你不能用单身汉。如果不需要两个对话框,那么为什么还要调用两次
Create()

CMyDlg
最终派生自
CWnd
,它封装了一个
HWND
句柄
Create()。当然,
Create()
断言
mu hWnd
的第一件事实际上是
NULL


如果希望两个对话框同时显示在屏幕上,则需要两个
CMyDlg
实例来表示它们;你不能用单身汉。如果您不需要两个对话框,那么为什么还要调用
Create()
两次呢?

最后我只使用指向对话框的指针

CMyDlg* m_pDlg= NULL;
CMyDlg* CMyDlg::GetInstance()
{
    m_pDlg= new CMyDlg;
    m_pDlg->Create(CMyDlg::IDD);
    return m_pDlg;
}

void CMain::OnSomeButtonPress()
{
    CMyDlg::GetInstance();
}


void CMyDlg::OnBnClickedCancel()
{
    if(m_pDlg!= NULL)
        delete m_pDlg;
}

最后,我只使用指向对话框的指针

CMyDlg* m_pDlg= NULL;
CMyDlg* CMyDlg::GetInstance()
{
    m_pDlg= new CMyDlg;
    m_pDlg->Create(CMyDlg::IDD);
    return m_pDlg;
}

void CMain::OnSomeButtonPress()
{
    CMyDlg::GetInstance();
}


void CMyDlg::OnBnClickedCancel()
{
    if(m_pDlg!= NULL)
        delete m_pDlg;
}

创建对话框时,即会创建该对话框。你不能两次创建同一个东西,就像两次创建同一个房子一样(不是创建同一个房子的副本,而是创建完全相同的房子两次)。在谷歌上搜索“MFC无模式对话框”,你会找到大量的解释和示例。创建对话框后,它就被创建了。你不能两次创建同一个东西,就像两次构建同一个房子一样(不是构建同一个房子的副本,而是构建完全相同的房子两次)。搜索“MFC无模式对话框”在谷歌上,你会发现大量的解释和示例。我不想同时出现两个对话框。我假设当我按下“确定”或“取消”时,我的对话框被破坏(但我不知道如何正确地破坏窗口),然后我可以第二次创建窗口。不,你的对话框没有被破坏,除非您处理好“确定”和“取消”按钮的单击并在那里调用
DestroyWindow
。我不希望同时出现两个对话框。我假设当我按下“确定”或“取消”时,我的对话框被破坏(但我不知道如何正确地破坏窗口),然后我可以再次创建窗口。不,您的对话框没有被破坏,除非您处理好“确定”和“取消”按钮的单击并在那里调用
销毁窗口