使用singleton创建对话框

Dialog create using singleton

本文关键字:对话框 创建 singleton 使用      更新时间:2023-10-16

我正在尝试使用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()方法从"此实例不代表任何物理窗口,m_hWndNULL"状态变为"此实例对应于一个物理窗口,而m_hWnd是该窗口的句柄"状态。自然地,Create()首先断言m_hWnd实际上是NULL

如果你想让两个对话框同时出现在屏幕上,那么你需要两个CMyDlg实例来表示它们;你不能使用singleton。如果你不想要两个对话框,那么你为什么还要打两次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;
}