创建子菜单

Sma*_*y57 6 c++ windows winapi menu submenu

我想制作一个像这个Mozilla Firefox子菜单的子菜单:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 11

您只需创建另一个菜单并将其作为子菜单附加.您可以通过调用相同的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;
Run Code Online (Sandbox Code Playgroud)

您不需要做任何特殊的响应WM_COMMAND消息.将鼠标悬停在父菜单项上时,Windows将自动显示弹出菜单.但是,您当然需要处理子菜单显示的项目的命令.


小智 5

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

HMENU hSubmenu = CreatePopupMenu();
// Insert or append items to hSubmenu here
Run Code Online (Sandbox Code Playgroud)

然后将创建的菜单附加到 hMenu 中:

AppendMenu(hMenu, MF_POPUP | MF_STRING, (UINT_PTR)hSubmenu, "My Submenu");
Run Code Online (Sandbox Code Playgroud)