C ++ - 子菜单不起作用

时间:2015-01-05 18:45:34

标签: c++ winapi menu submenu

目前我正在尝试为我的WIN32程序创建一个菜单 不幸的是,我无法在其中创建子菜单。 这是我的代码:

HMENU menu = CreateMenu();
HMENU mFile = CreatePopupMenu();

AppendMenu(menu, MF_STRING | MF_POPUP, (UINT_PTR)mFile, L"File");
AppendMenu(mFile, MF_STRING, NULL, L"Exit");

SetMenu(hwnd, menu);

菜单本身按预期显示,但是当我点击"文件"没有任何反应 但是,当我点击文件时,应该会出现一个子菜单 任何人都可以解释一下这个代码不起作用的原因是什么?

编辑:@IInspectable感谢您的建议!我检查了返回值并且它为0,因此函数失败了。令人惊讶的是,以下代码有效:

HMENU menu = CreateMenu();
HMENU mFile = CreatePopupMenu();

AppendMenu(menu, MF_STRING | MF_POPUP, (UINT_PTR)mFile, L"File");
AppendMenu(mFile, MF_STRING, NULL, L"Exit");

MessageBox(hwnd, L"An error occured.", L"Error!", MB_OK);

SetMenu(hwnd, menu);

我不知道它为什么使用这段代码,但现在当我点击"文件"时子菜单出现了。
这个行为有什么解释吗?

2 个答案:

答案 0 :(得分:0)

您的代码没有任何问题。它适用于我的系统。但是,设计“有点”不正确。

mFile应该是常规菜单。之后的任何子菜单也是常规菜单,除非它们本身就是父菜单..

示例:

Example 1

#define EXIT_ID 1

case WM_CREATE:
{
    HMENU hMenubar = CreateMenu();
    HMENU hFileMenu = CreateMenu(); //file is a regular menu.. Exit is a regular sub-menu..

    AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hFileMenu, "File"); //create file menu.
    AppendMenu(hFileMenu, MF_STRING, EXIT_ID, "Exit");  //regular menu. Has no children.
    SetMenu(hwnd, hMenubar);
}
break;

示例2:

Example 2

#define EXIT_ID 1
#define SUB_ID 2

case WM_CREATE:
{
    HMENU hMenubar = CreateMenu();
    HMENU hFileMenu = CreateMenu(); //file is a regular menu.. Exit is a regular sub-menu..
    HMENU hDisplayMenu = CreatePopupMenu(); //display is a popup-menu because it has children.

    AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hFileMenu, "File");
    AppendMenu(hFileMenu, MF_STRING | MF_POPUP, (UINT_PTR)hDisplayMenu, "Display"); //popup menu. Has children.
    AppendMenu(hDisplayMenu, MF_STRING, SUB_ID, "Sub"); //regular menu. Has no children.
    AppendMenu(hFileMenu, MF_STRING, EXIT_ID, "Exit"); //regular menu. Has no children.
    SetMenu(hwnd, hMenubar);
}
break;

答案 1 :(得分:0)

所以,我想出了当我点击它时导致下拉菜单不显示的原因。说实话,有点尴尬,但我将扩展窗口样式设置为WS_EX_NOACTIVATION。如果您将其替换为任何其他菜单,则会显示菜单。