C++ 使用单例创建对话框
我正在尝试使用singleton创建非模态对话框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行中的
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
。我不希望同时出现两个对话框。我假设当我按下“确定”或“取消”时,我的对话框被破坏(但我不知道如何正确地破坏窗口),然后我可以再次创建窗口。不,您的对话框没有被破坏,除非您处理好“确定”和“取消”按钮的单击并在那里调用销毁窗口
。