2011-11-27 1 views
1

C/C++에서 Windows Mobile 6 용 애플리케이션을 작성하고 있습니다. 일반적으로 2 개의 소프트 키가 있으며 그 중 하나는 메뉴입니다. 이 메뉴에는 팝업 메뉴가 있습니다. 여기 resource.h에서 (을 제거) resources.rc에서 소프트 키와 몇 가지 정의의 소스입니다 : 사용자가 메뉴를 열 때WM_INITMENUPOPUP 및 POPUP 리소스

#define IDR_MAIN_MENU 130 
#define IDM_LOCK  30006 
#define IDM_MAIN_MENU 30007 

IDR_MAIN_MENU RCDATA 
{ 
    IDR_MAIN_MENU, 
    2, 
    I_IMAGENONE, IDM_LOCK  , TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON , IDS_LOCK, 0, NOMENU, 
    I_IMAGENONE, IDM_MAIN_MENU, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_DROPDOWN, IDS_MENU, 0, 0, 
} 

IDR_MAIN_MENU MENU 
{ 
    POPUP "Menu" 
    { 
     MENUITEM "Keep display"  IDM_KEEP_DISPLAY_TURNED_ON 
     MENUITEM "Keep backlight" IDM_KEEP_BACKLIGHT_TURNED_ON 
     POPUP "Min battery level" 
     { 
      MENUITEM "None" 0 
      MENUITEM SEPARATOR 
      MENUITEM "5%" 0 
      MENUITEM "10%" 0 
      ... 
     } 
     MENUITEM "Exit"    IDM_EXIT 
    } 
} 

, 나는 그것을 수정할 - 항목을 비활성화, 활성화의 선택을 취소 확인 등 그래서 내가 처리 WndProc()에서 WM_INITMENUPOPUP 메시지 : 사용자가 메인 메뉴를 열 때

case WM_INITMENUPOPUP:   
    switch (LOWORD(lParam)) 
    { 
    case IDM_MAIN_MENU: 
     OnMainMenuInit(reinterpret_cast<HMENU>(wParam)); 
     break; 
    } 
    break; 

이제, OnMainMenuInit()가 호출된다. 이것은 잘 작동합니다.

이제 문제에 대해 알려주세요. 별도의 "최소 배터리 레벨"하위 메뉴 열기를 처리하고 싶습니다. 하위 메뉴를 열면 WM_INITMENUPOPUP 메시지가 표시되고 메뉴의 핸들 (예 : 주 메뉴의 경우 0x0A5B0B74, 하위 메뉴의 경우 0x0A5BA924)이 표시되지만 "최소 배터리 수준"하위 메뉴에는이를 식별하는 데 사용할 수있는 "명령 ID"가 없습니다. 나는 2LOWORD(lParam)으로 주 메뉴의 "최소 배터리 레벨"항목의 위치이지만,이 메뉴를 추가하면 "최소 배터리 레벨"하위 메뉴를 식별하기 위해이 2을 하드 코딩하는 아이디어가 마음에 들지 않습니다. 나는 하드 코드 된 2도 변경해야합니다.

WM_INITMENUPOPUP에서 "최소 배터리 수준"하위 메뉴를 식별하는 방법에 대한 조언이 있으십니까? "식별"이란 "이 메뉴가 최소 배터리 레벨을위한 것임을 어떻게 알 수 있습니까?"라는 의미입니다 ("최소 배터리 레벨 하위 메뉴의 처리는 무엇입니까?").

답변

1

GetMenuItemID을 통해 2를 사용하여 메뉴 항목 ID를 복구 할 수 있습니다.

switch (GetMenuItemID(GetMenu(hwnd), LOWORD(lParam))) 
{ 
case IDM_MIN_BATTERY_LEVEL: ... 
} 

하위 메뉴에 ID를 부여하려면 MENUEX을 사용해야합니다.

+0

'MENUEX'를 시도했지만 소프트 키로 작동하지 못했습니다. "잠금"및 "메뉴"소프트 키가 표시되지만 "메뉴"를 클릭하면 메뉴가 열리지 않습니다. – binaryLV

+0

Windows CE가 데스크톱 Windows와 다른 곳 중 하나 일 수 있습니다. 미안해, 더 이상 도울 수 없어. –

+0

무엇을 위해서,'MENUITEM'을 사용하여'MENUITEM SEPARATOR' (질문에 표시된대로)를 사용하면 컴파일러 오류가 발생하는 것 같습니다. 'MENUITEM "", -1, MFT_SEPARATOR "를 사용하면 작동하는 것처럼 보입니다. –

0

나는 이것이 문제가되는 것이지만 WM_INITMENUPOPUP 메시지가 어떻게 작동하는지 약간의 오해가 있음을 알고 있습니다.

LOWORD (lParam) 값은 기본 메뉴 항목의 0 기반 색인 값이므로 일반 응용 프로그램에서는 파일 메뉴의 값이 0이고 그 다음은 오른쪽이며 편집 메뉴 일 수도 있습니다 1, 등등.

HIWORD (lParam) 값은 복원, 최소화 및 닫기 메뉴와 같은 시스템 메뉴에 대한 값입니다. 그래서 여기

이 파일 또는 편집 메뉴와 같은 최고 수준의 팝업 메뉴에서 인덱스 번호를 추측 문제

case WM_INITMENUPOPUP:   
    switch (lParam) 
    { 
    case 0: // The Menu item 
     OnMainMenuInit(reinterpret_cast<HMENU>(wParam)); 
     break; 
    } 
    break; 

에 내 솔루션 것은 충분히이 문제의 하나 (POPUP 같은 두 번째 수준의 팝업 메뉴를 쉽게 "최소 배터리 수준") 다소 어렵습니다.