创建子菜单

7
我想制作一个子菜单,就像Mozilla Firefox的子菜单一样:
现在我的程序是这样的:
但我希望它看起来像Firefox一样,当你把鼠标放在上面时会有一个额外的菜单。
#define ID_SM 1

LRESULT CALLBACK WindowProcedure (HWND hwnd,
                                  UINT message,
                                  WPARAM wParam,
                                  LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
            HMENU hMenubar = CreateMenu();
            HMENU hMenu = CreateMenu();

            AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hMenu, "Menu");
            AppendMenu(hMenu, MF_STRING, ID_SM, "Sub Menu");

            /* Would I put it here? How? */

            SetMenu(hwnd, hMenubar);
            break;

        case WM_COMMAND:
            if (LOWORD(wParam) == ID_SM) {
                /* Not sure if this should be here,
                   cause I want it to pop up when you mouse over */
            } 
            break;
    }
}
2个回答

13

您只需创建另一个菜单并将其附加为子菜单。您可以通过调用相同的AppendMenu函数来实现此操作,只需要将uFlags参数设置为MF_POPUP,并将子菜单的句柄作为uIDNewItem参数传递即可。

例如:

case WM_CREATE:
    HMENU hMenubar = CreateMenu();
    HMENU hMenu = CreateMenu();
    HMENU hSubMenu = CreatePopupMenu();

    AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hMenu, "Menu");
    AppendMenu(hMenu, MF_STRING, ID_SM, "Sub Menu");
    AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT_PTR)hSubMenu, "Sub-Sub Menu");

    SetMenu(hwnd, hMenubar);
    break;

在响应WM_COMMAND消息时,您无需采取任何特殊措施。当您将鼠标悬停在父菜单项上时,Windows将自动显示弹出菜单。然而,您当然需要处理在子菜单上显示的项目的命令。


5

首先创建一个新菜单并添加项目。例如:

HMENU hSubmenu = CreatePopupMenu();
// Insert or append items to hSubmenu here

然后将创建的菜单添加到 hMenu 中:
AppendMenu(hMenu, MF_POPUP | MF_STRING, (UINT_PTR)hSubmenu, "My Submenu");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接