2011-11-27 24 views
1

我正在用C/C++編寫Windows Mobile 6的應用程序。通常情況下,它有2個軟鍵,其中一個是菜單。這個菜單裏有一個彈出菜單。這裏是(剝離)從resources.rc軟鍵和一些定義的來源從resource.hWM_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

您可以使用2通過GetMenuItemID恢復菜單項ID。

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

您需要使用MENUEX爲了給子菜單一個ID。

+0

我嘗試了'MENUEX',但是我無法像軟鍵一樣工作 - 編譯時會顯示「鎖定」和「菜單」軟鍵,但點擊「菜單」不會打開菜單。 – binaryLV

+0

這可能是Windows CE與桌面Windows不同的地方之一。對不起,我不能進一步幫助。 –

+0

對於它的價值,使用'MENUITEM SEPARATOR'(如問題所示)並使用'MENUEX'似乎會導致編譯器錯誤。使用'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; 

猜對頂級彈出菜單,如文件或編輯菜單中的索引號是很容易的,第二級彈出菜單,像在這個問題(彈出「最低電池電量」)比較困難。