【问题标题】:Dialog create using singleton使用单例创建对话框
【发布时间】:2013-09-05 11:07:55
【问题描述】:

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

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 );

不能调用两次?

【问题讨论】:

  • 当对话框被创建时,它就被创建了。您不能两次创建相同的东西,这就像两次建造同一所房子(不是不建造同一房屋的副本,而是建造完全相同的房屋两次)。
  • 在google上搜索“MFC无模式对话框”,你会发现很多解释和示例。

标签: c++ visual-c++ user-interface mfc


【解决方案1】:

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

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

【讨论】:

  • 我不希望同时出现 2 个对话框第二次窗口。
  • 不,您的对话框不会被破坏,除非您处理 OK 和 Cancel 按钮单击并在那里调用 DestroyWindow
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多