2012-08-08 2 views
2

어떻게해야할지 모르겠지만 창 주 메뉴를 열면 내 프로그램의 주 메시지 루프 (PeekMessage/GetMessage 등)가 중지됩니다. 메시지가 도착하면 WindowProc이 여전히 호출되기 때문에 모달 대화 상자가 열리는 것과 유사합니다. 그래서 다른 메시지 루프가 어딘가에서 계속 발생해야합니다.주 메뉴를 항상 모달 작업으로 여는 중입니까?

기본 메시지 루프가 어떤 기능이나 메시지를 차단하는지 아직 알지 못합니다. (예 : 아직 테스트하지 않았습니다.) DefWindowProc의 어딘가에서 메뉴를 여는 것과 관련이있는 것으로 추측됩니다. .

Windows의 기본 메뉴 동작입니까? 이 경우 실제로이 점이 무엇입니까? 메인 메시지 루프가 내부 메시지 루프 대신 계속 실행되도록 변경할 수 있습니까?

+0

예, 작동 방식입니다. Windows가 모달 메뉴 루프를 시작하면 [WM_ENTERMENULOOP] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms647595%28v=vs.85%29.aspx) 메시지가 표시됩니다. 자신 만의 메뉴를 만드는 것 이외의 다른 방법은 피할 수 없습니다. – arx

+0

왜 이런 식으로했는지 알아 보시겠습니까? – Cray

+0

이 디자인은 20 세 이상입니다. 그 당시에는 가장 쉽고 저렴한 방법이었습니다. 그리고 문제가되는 경우는 거의 없지만 문제는 거의 없습니다. – arx

답변

3

내가 잘못되어이 답변을 업데이트했습니다.

Windows는 일반적으로 메뉴를 표시하는 동안 내부 모달 메시지 루프에 들어갑니다. WM_ENTERMENULOOP 메시지는 Windows에서이 루프가 시작될 때 사용자에게 알립니다.

MNS_MODELESS 플래그를 설정하여 메뉴를 만들 수 있습니다. 예를 들어, 따라서 윈도우 hWnd으로 작업을 수행 할 수 있습니다

HMENU hMenu = GetMenu(hWnd); 
MENUINFO menuInfo; 
menuInfo.cbSize = sizeof(MENUINFO); 
menuInfo.fMask = MIM_STYLE; 
GetMenuInfo(hMenu, &menuInfo); 
menuInfo.fMask = MIM_STYLE; 
menuInfo.dwStyle |= MNS_MODELESS; 
SetMenuInfo(hMenu, &menuInfo); 

불행하게도,이 메뉴가 시각적으로 방해가되는, 열 때 활성화를 잃고 메인 창을 발생합니다. this answer의 두 번째 부분에서는 모달의 경우 메뉴가이 문제를 어떻게 피하는 지 설명합니다. This answer 솔루션에 대한 힌트; 메인 창의 모양이 활성화와 동기화되지 않도록 WM_NCACTIVATE 메시지를 간섭해야합니다.

+0

그럼 MENUINFO.dwStyle | MNS_MODELESS는 어떻습니까? – kero

+1

@kero 네 말이 맞아. 이것은 메뉴가 활성화 될 때 창의 모양에 영향을 미치므로 일부 메모를 포함하도록 답변을 업데이트했습니다. – arx

0

가 hMenuBar를 들어 당신이 방법으로 다음과 같은 시도 할 수 있습니다 : 1) MENUINFO.fMask | MIM_STYLE | MIM_APPLYSUBMENUS, 2) GetMenuInfo (hMenuBar, ADDR MENUINFO), 3) MENUINFO.dwStyle | MNS_MODELESS, 4) SetMenuInfo (hMenuBar, addr MENUINFO).

관련 문제