2013-09-05 2 views
1

싱글 톤을 사용하지 않는 모달 대화 상자를 만들려고합니다. 나는 실패를 두 번 작성 전화 tryig있을 때 대화 상자는 싱글 톤을 사용하여 만듭니다

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

나는 전화 몇 가지 버튼을 누른에

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

를 작성하지만, 문제는 (wincore.cpp 줄에 뭔가를 638)

무엇 내가 왜 잘못하고있는거야

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

두 번 호출 할 수 없습니까?

+2

대화 상자가 만들어지면 만들어집니다. 똑같은 것을 두 번 만들 수는 없습니다. 같은 집을 두 번 짓는 것과 같습니다 (동일한 집의 * 복사본 *을 만들지 않고 똑같은 집을 두 번 빌드하는 것). –

+0

Google에서 'MFC 모덜리스 대화 상자'를 검색하면 많은 설명과 샘플을 찾을 수 있습니다. –

답변

1

CMyDlgCWndHWND 핸들을 포함합니다. Create() 메서드는 "이 인스턴스는 실제 창을 나타내지 않으며, m_hWndNULL"상태 "이 인스턴스는 실제 창에 해당합니다. m_hWnd은 해당 창에 대한 핸들입니다"상태입니다. 당연히 Create()m_hWnd이 실제로는 NULL이라는 것을 가장 먼저 주장합니다.

화면에 두 개의 대화 상자를 동시에 표시하려면 두 개의 대화 상자가 표시되도록 CMyDlg의 두 인스턴스가 필요합니다. 당신은 싱글 톤을 사용할 수 없습니다. 두 개의 대화 상자가 필요없는 경우 Create()을 두 번 다시 호출하는 이유는 무엇입니까?

+0

동시에 두 개의 대화 상자가 필요하지 않습니다. 대화 상자를 닫을 때 Ok를 누르거나 창을 닫을 때 잘 모르겠다 고 가정하고 두 번째 창을 만들 수 있습니다. – mrgloom

+1

아니요, 확인 및 취소 버튼 클릭을 처리하고 거기에서'DestroyWindow '를 호출하지 않으면 대화 상자가 파괴되지 않습니다. –

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; 
} 
관련 문제