1

我正在用 C/C++ 为 Windows Mobile 6 编写应用程序。通常,它有 2 个软键,其中一个是菜单。此菜单中有一个弹出菜单。这是(剥离的)软键来源resources.rc和很少定义的来源resource.h

#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
    }
}

当用户打开菜单时,我想修改它 - 选中、取消选中、启用、禁用项目等。所以我处理WM_INITMENUPOPUP消息WndProc()

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

现在,当用户打开主菜单时,将调用 OnMainMenuInit()。这工作正常。

现在关于问题。我想单独处理打开“最低电池电量”子菜单。打开子菜单时我收到WM_INITMENUPOPUP消息,我还得到菜单的句柄(例如,主菜单为 0x0A5B0B74,子菜单为 0x0A5BA924),但“最低电池电量”子菜单没有可用于识别它的“命令 ID”。我得到2as LOWORD(lParam),这是主菜单中“最小电池电量”项的位置,但我不喜欢硬编码这个2来识别“最小电池电量”子菜单的想法,因为添加菜单项意味着我必须也改变这个硬编码2

关于如何识别“最低电池电量”子菜单的任何建议WM_INITMENUPOPUP?“识别”的意思是“我怎么知道这个菜单是针对最低电池电量的”(而不是“什么是最低电池电量子菜单的句柄”)。

4

2 回答 2

1

您可以使用 2 通过 恢复菜单项 ID GetMenuItemID

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

您需要使用MENUEX才能为子菜单提供 ID。

于 2011-11-28T00:19:27.133 回答
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;

猜测像文件或编辑菜单这样的顶级弹出菜单上的索引号很容易,像这个问题中的二级弹出菜单(弹出“最低电池电量”)有点困难。

于 2015-01-05T23:42:58.220 回答