2011-02-24 9 views
7

타사 MFC 응용 프로그램 용 Win32 플러그 인 DLL을 작성하고 있습니다. DLL은 모달 대화 상자를 표시해야합니다. DialogBox() 또는 다른 일반 Win32 API를 사용하여 (예 : 내 자신의 모달 루프를 작성하려고 시도한 경우) 주 응용 프로그램의 창은 모든 요소를 ​​다시 그리지 않습니다. 클라이언트 요소가 아니라 표준 요소를 다시 그립니다. 모덜리스 대화 상자는 잘 표시됩니다.MFC 응용 프로그램 및 비 MFC 모달 대화 상자

Screenshot

나는 MFC 정말하지 않습니다는 Win32 의미에서 모달 대화 상자가 있기 때문에 이런 생각한다. DialogBox()에는 하나의 메시지 루프와 별도의 루프 만있을 수 있습니다. 이에 대한 설명은 a CodeProject article입니다. 그러나이 CodeProject 기사는 9 살이므로, 그 이후로 상황이 바뀔 수도 있습니다. 누군가가 이것에 대해 밝힐 수 있을까요? 앱에서 MFC 8을 사용합니다 (즉, mfc80.dll).

업데이트. 다음은 original question에 대한 링크입니다. 추가 정보가 포함될 수 있습니다.

업데이트 2. 모두에게 감사드립니다. 나는 모든 조언을 정말로 고맙게 여긴다. 그것은 내가 사물이 어떻게 어울리는 지 큰 그림을 얻는데 도움이된다. 내가 탐구 할 첫 번째 경로는 네이티브 MFC '모달'대화 상자를 사용하는 것입니다. (파이썬에서이 모든 작업을 수행하기 때문에 MFC 용 파이썬 바인딩 인 pywin32을 사용합니다). 이것은 약간의 시간이 걸립니다; 준비가되면 게시물을 결과로 업데이트합니다.

+0

+1 좋은 질문입니다. 답을 보려면 흥미가 있습니다. –

+0

http://stackoverflow.com/questions/5058929 또한이 질문에 대한 답변 (다소간의 차이점)이 있습니다. – 0xC0000022L

+0

당신은 Spy ++ (Visual Studio와 함께 제공) 나 다른 유사한 응용 프로그램 (http://www.catch22.net/software/winspy에서 찾을 수 있습니다)을 사용하여 "Console "창문은 하나의 자식 창 이상입니다! – 0xC0000022L

답변

4

모든 스레드는 메시지 루프를 가질 수 있습니다. 모달 대화 상자를 별도의 스레드에 넣고 부모 창을 사용하지 않도록 설정하여 Windows의 표준 동작을 에뮬레이션합니다.

편집 : 일부 토론 후 (아래 참조) 상위 코드가 올바르게 작동하지 않는 것처럼 보입니다.

그래도 가능한 해결 방법이 있다고 생각합니다. 하나는 부모 창 (모달 대화 상자에 있지만, 현재 잘못 작동하는 창)이 될 수 있지만 잘못된 창 내용을 오버레이하지만 올바른 동작을 모방하기 위해 메모리의 DC에서 다시 그립니다. 물론 부모 창은 여전히 ​​비활성화되어야합니다. 또 다른 해결책은 상위 윈도우를 서브 클래스 화하여 비헤이비어를 수정하는 것입니다. 플러그인은 동일한 프로세스 내에서 실행되므로 구현은 간단해야합니다.

+0

이 플러그인은 호스트 응용 프로그램에서 동 기적으로 호출되므로 작동하지 않을 수 있습니다. –

+0

@ David Heffernan : 맞습니까? 원래 질문의 어떤 부분을 기반으로합니까? 게다가 호스트 애플 리케이션이 동 기적으로 호출하는지 여부는 중요하지 않습니다. 플러그인이 메시지 루프를 포함하는 스레드 (그리고 모든 대화 작업을 종료 할 때까지)가 호출에서 차단하도록 작성 될 수 있기 때문입니다 (호스트 응용 프로그램이 기대하는 것처럼). – 0xC0000022L

+0

@STATUS 주 앱이 다시 그리지 못하게하려면 주 루프에서 차단해야한다는 사실을 기반으로합니다. –

관련 문제