1

我正在尝试使用单例创建非模态对话框。

CMyDlg& CMyDlg::GetInstance()
{
    static CMyDlg myDlg;
    return myDlg;
}

然后按下某个按钮,我调用 Create

CMyMain::OnSomeButtonPress()
{
    CMyDlg::GetInstance().Create( CMyDlg::IDD );
}

但问题是当我尝试调用 Create 两次时它失败了(wincore.cpp 第 638 行中的内容)

我做错了什么以及为什么

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

不能叫两次?

4

2 回答 2

1

CMyDlg最终派生自CWnd,它包装了一个HWND句柄。Create()方法从“此实例不代表任何物理窗口,m_hWndNULL”状态变为“此实例对应于物理窗口,m_hWnd是该窗口的句柄”状态。自然地,Create()断言第一件事m_hWnd是,确实,NULL

如果你想让两个对话框同时出现在屏幕上,那么你需要两个实例CMyDlg来表示它们;你不能使用单例。如果你不想要两个对话框,那你为什么还要打电话Create()两次?

于 2013-09-05T17:23:37.150 回答
0

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

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;
}
于 2013-09-06T07:29:29.027 回答