2016-09-15 70 views
0

주 창이 있으며 사용자가 응용 프로그램의 프레임 중 하나를 "팝업"하여 기본 창에 포함되지 않고 뜨는 수 있습니다. 주어진 시간에 세 개의 WS_POPUP 창이 생길 수 있도록 여러 개의 프레임이 나타납니다.모달 대화 상자를 표시 할 때 모든 최상위 창 (WS_POPUP)을 비활성화합니다.

문제는 내가 모달 대화 상자를 표시하려고 할 때 DoModal 함수의 매개 변수를 사용하여 대화 상자 하나만 비활성화 할 수 있다는 것입니다. DoModal을 사용하여 최상위 창을 모두 비활성화하려면 어떻게합니까? 모달을 표시하기 전에 단순히 창을 비활성화 한 다음 다중 모달 대화 상자 (모달 대화 상자 하나가 다른 모달 대화 상자를 여는 경우)가있을 ​​수 있기 때문에 다시 활성화 할 수는 없습니다.

API가 이와 같은 기능을 제공합니까? 나는 2 시간 동안 이것을 봤고 충분히 좋은 해결책을 찾지 못했다. MFC, WTL 및 ATL의 조합을 사용하고 있습니다.

미리 감사드립니다.

+1

대화 상자의 작동 방식이 아닙니다. 비슷한 효과를 얻으려면 명시 적으로 EnableWindow()를 사용해야합니다. 하지만 그렇게하지 않으면 모든 사용자에게 직관적이지 않습니다. –

+1

@JanS : 모달 대화 상자는 소유자가 ** 소유 **합니다. 자녀/부모 관계는 없습니다. 모달 대화 상자는 형제를 사용 중지하지 않습니다. 다른 소유 된 창. – IInspectable

+0

@HansPassant 어떤 부분이 직관적이지 않다고 생각하십니까? 현실 세계의 한 예가 비주얼 스튜디오입니다. Visual Studio는 여러 팝업 창을 지원합니다. VS에서 파일을 열 때 다른 모든 팝업 창이 비활성화됩니다. 어쨌든, 저는 구현에 대해 더 염려합니다. – bysreg

답변

1

나는이 문제를 이해하기 때문에 MFC 프레임 윈도우가 작동하는 것과 같다.

실제로 MFC 응용 프로그램의 CFrameWnd 만 비활성화됩니다. WM_ENABLE 메시지 (FALSE)가 도착하면 BeginModalState가 호출되며이 함수는 CFrameWnd의 "하위 창"을 부동 상태로 그냥 사용하지 않도록 설정합니다.

CFrameWnd에 대해 EnableWindow (WM_ENABLE이 TRUE로 도착할 때)가 다시 호출 될 때와 동일합니다. EndModalState가 호출되고 비활성화 된 모든 하위 및 부동 창이 다시 활성화됩니다.

소스 코드에서 CFrameWnd :: OnEnable, BeginModalState, EndModalSTate의 MFC 구현을 참조하십시오.

그래서 주 창의는 자신의 팝업이라는 것을 알고 있습니다. 실제 모달 대화 상자를 시작하고이 부모를 비활성화하면 부동 팝업이 비활성화됩니다.

트릭은 CDialog :: DoModal에 실제 부모가 필요하다는 것입니다. 생성자에서 제공되지 않으면 대부분의 경우 올바른 것으로 추측됩니다. 귀하의 경우에는 부모 창과 같은 "메인 창"을 제공해야합니다 ... 메시지 상자와 마찬가지로 ...

+0

안녕하세요, domodal 함수에 주 창 핸들을 제공하면 Create 함수를 사용하여 새 팝업 창을 만들 때 상위 창 핸들도 부모로 전달해야합니다. 나는 이것을 시도하고 작동하지 않는다. – bysreg

+0

주 윈도우와 팝업을 위해 CFrameWindowImpl 을 사용하고있다. 나는 CWindowImpl을 사용하고있다. bysreg

+1

이것만으로는 작동하지 않는다. 나는 썼다 : MFC 구현을 들여다 보라! CFrameWnd 않습니다.그리고 내가 찾는 기능을 말해 줬어! – xMRi