2017-03-14 2 views
0

내 모달 대화 상자의 바탕 화면을 부모 HWND로 가져 오는 이유는 무엇입니까?모달 대화 상자에서 잘못된 부모 HWND

class CSaveProfileAsDlg: 
public CSimpleDialog<IDD_DLG_RESOURCE> 
{ 
    .... 
    LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&) 
    { 
    ... 
    HWND parent = GetParent(); // or GetAncestor(m_hWnd, GA_PARENT); 
    assert(parent != GetDesktopWindow()); // not ok 
    ... 
    } 
.... 
} 


//somewhere in code 
//m_hWnd is some valid HWND 
assert(m_hWnd != GetDesktopWindow()); //ok 
CSaveProfileAsDlg dlg; 
dlg.DoModal(m_hWnd /*as a parent wnd*/); 

나는 CSaveProfileAsDlg의 ctor에서 corret HWND를 통과하여 "해결"할 수 있지만, 내가 올바른 해결책을 가지고 싶습니다.

감사합니다.

+0

당신이'어설하지;'(부모 = 0!)? – RbMm

+0

프로덕션 코드에서이 예제에서 제거했습니다. ''부모님''나는 유효한 HWND입니다. – fogbit

+0

당신은 그것을 확신합니다! = 0? – RbMm

답변

2

설명서는 매우 혼란 스럽지만 문제를 발견했다고 생각합니다. DoModal은 내부적으로 ::DialogBox()을 호출합니다.이 중 하나의 매개 변수는 HWNDhWndParent입니다. documentation에서 : [선택에서]

hWndParent
유형 : HWND
대화 상자를 소유하는 윈도우에 대한 핸들.

여기서 키워드는 "소유"입니다. owned windows 섹션은 다음을 확인합니다.

대화 상자 및 메시지 상자는 기본적으로 소유 된 창입니다. 응용 프로그램은 대화 상자 또는 메시지 상자를 만드는 함수를 호출 할 때 소유자 윈도우를 지정합니다.

그래서 우리는 실제로 부모 대신 소유자 윈도우에 대해 이야기합니다. 대화 상자는 자유롭게 떠 다니는 창이고 "부모"라는 의미의 창 계층 구조가 아니기 때문에 의미가 있습니다.

당신은 사용하여 소유하는 창을 얻을 수 있습니다 :

HWND parent = ::GetWindow(m_hWnd, GW_OWNER);