2016-11-14 1 views
0

OK 단추를 클릭하면 대화 상자 양식이 어떻게됩니까? 생성자가 실행되지 않았으므로 파기되지 않는 것 같습니다. 이 양식에 대한 포인터가 StatusDlg * statusDlg;입니다. 이 양식을 어떻게 알 수 있습니까? 이 양식을 다시 사용하여 사용자에게 표시하는 방법은 무엇입니까? 이 양식을 완전히 파괴하는 방법은 무엇입니까?확인 단추를 클릭 한 후 MFC 대화 상자에서 발생하는 현상

나는처럼 만들 :

statusDlg = new StatusDlg(NULL); 
statusDlg->Create(StatusDlg::IDD,CWnd::GetDesktopWindow()); 
statusDlg->ShowWindow(SW_SHOW); 

그리고이 만들어 질 때 나는 확인을 누릅니다.

+1

만들었 으면 다음에 무엇을 했습니까? 표시하기를 기대 했습니까? – rrirower

+0

더 많은 코드를 표시하십시오. –

+0

* "이 양식을 아는 방법은 보이지 않습니다?"* - 가능성은 [CWnd :: IsWindowVisible] (https://msdn.microsoft.com/library/49a832ee-bc34-4126-88b3-bc1d9974f6c4.aspx# cwnd__iswindowvisible)는 해당 정보를 반환합니다. 그리고 이전에 여러 번 설명했듯이 Windows API에 익숙하지 않으면 MFC에 능숙 해지기를 기대할 수 없습니다. 당신은 작고 작은 문제들 (이 것 같은)에 걸려 넘어 질 것입니다. 디버거를 사용하는 방법을 모르는 것도 도움이되지 않습니다. – IInspectable

답변

0

"생성자가 실행되지 않았습니다"라는 것이 무슨 뜻인지 몰라 ... 소멸자가 실행되지 않았다는 말을하는 것으로 가정합니다.

사실 일 것입니다.

결국 대화 상자에서 API 함수 EndDialog(m_hWwnd, IDOK)이 호출됩니다. 그러면 대화 상자가 숨겨집니다.

그러나 대화 상자의 창 핸들과 포인터는 여전히 유효합니다. 프로그램 종료시 윈도우는 파괴되지만 C++ 소멸자는 여전히 호출되지 않습니다.

void StatusDlg::PostNcDestroy() 
{ 
    __super::PostNcDestroy();// might be able to be skipped if baseclass does nothing, which I suspect is the case 
    delete this; // deletes this StatusDlg 
} 

귀하의 statusDlg 포인터가 윈도우의 표시 여부를 말할 수 있습니다 : 당신이 당신의 소멸자를 호출 할 수 있도록하려면이 같은 PostNcDestroy()를 overried. statusDlg->IsWindowVisible()으로 전화하십시오 - 어딘가에 statusDlg 포인터에 매달려 있다고 가정하십시오.

내가 그랬던 것처럼 당신이 PostNcDestroy()를 오버라이드 (override)하는 경우처럼, 당신은 전화를 걸하고 싶지는 않을 :이 작업을 수행하려면 대신

delete statusDlg; // bad things will happen... (attempted double deletion) 

:

statusDlg->DestroyWindow(); // PostNcDestroy() takes care of deletion 

를 내가 위의 말은 모덜리스 대화 상자에 적용됩니다. 모달 대화 상자에서는 약간 다르게 실행됩니다.

+0

* "대화 상자가 숨겨 지지만 [...] 대화 상자의 창 핸들은 여전히 ​​유효합니다."* - 올바르지 않습니다. [EndDialog] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645472.aspx)는 네이티브 대화 상자 객체가 파괴되도록합니다 (HWND도 무효화합니다). 당신의 해결 방법은 너무 부서지기 때문에 권장하지 않습니다. 대신, C++ 클래스를 통해 객체 수명을 제어해야합니다 (예 : ** do ** delete statusDlg;는 더 이상 필요하지 않을 때 사용합니다). – IInspectable

+0

틀림없이, 틀렸어. VS 2013에서 약간의 테스트 앱을 작성했기 때문에 알 수 있습니다 (변경된 것 같습니다). 모덜리스 MFC 대화 상자의 경우 창 핸들을 닫은 후에도 여전히 유효합니다. 창은 프로세스가 끝날 때까지 소멸되지 않습니다. PostNcDestroy()에 중단 점을 설정했기 때문에 응용 프로그램이 종료 될 때까지 호출되지 않기 때문에 알 수 있습니다. 원하는 경우 취성이라고 할 수 있지만 CView 및 CFrameWnd 클래스의 경우는 MFC와 같습니다. –

+0

[EndDialog] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645472.aspx)의 API 설명서가 잘못 되었습니까? 아니면 실제로 전화하지 않았을 때 전화가 걸렸다는 사실을 허위로 진술 했습니까? – IInspectable

관련 문제