Создание подменю - PullRequest
       18

Создание подменю

6 голосов
/ 20 января 2012

Я хочу создать подменю, подобное этому подменю Mozilla Firefox:

imageView->Toolbars">

Вот как это выглядит сейчас (в моей программе):

imageMenu->Sub Menu">

Но я хочу, чтобы это выглядело как 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 ]

11 голосов
/ 20 января 2012

Вы просто создаете другое меню и добавляете его как подменю. Вы можете сделать это, вызвав ту же 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 автоматически отобразит всплывающее меню при наведении указателя мыши на элемент родительского меню. Вам, конечно, нужно будет обрабатывать команды элементов, отображаемых в подменю, однако.

4 голосов
/ 20 января 2012

Сначала создайте новое меню и добавьте в него элементы. Например:

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

Затем добавьте созданное меню в hMenu:

AppendMenu(hMenu, MF_POPUP | MF_STRING, (UINT_PTR)hSubmenu, "My Submenu");
...