C++ - 子菜单不工作
C++ - Submenu is not working
目前我正在尝试为我的 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);
菜单本身按预期显示,但是当我单击 "File" 时没有任何反应。
不过当我点击文件时应该会出现一个子菜单。
谁能解释一下这段代码不起作用的原因是什么?
编辑:@IInspectable 感谢您的建议!我检查了 return 值,它是 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);
我不知道为什么要使用此代码,但现在当我单击 "File" 时会显示子菜单。
对此行为有任何解释吗?
您的代码没有任何问题。它适用于我的系统。但是,设计 "sort of" 不正确。
mFile
应该是常规菜单。之后的任何 sub-menus 也是常规菜单,除非它们本身是父菜单..
示例:
#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:
#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;
所以,我弄清楚了导致下拉菜单在单击时不显示的原因。老实说,有点尴尬,但我将扩展 window 样式设置为 WS_EX_NOACTIVATION
。如果将其替换为其他任何内容,则会显示菜单。
目前我正在尝试为我的 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);
菜单本身按预期显示,但是当我单击 "File" 时没有任何反应。
不过当我点击文件时应该会出现一个子菜单。
谁能解释一下这段代码不起作用的原因是什么?
编辑:@IInspectable 感谢您的建议!我检查了 return 值,它是 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);
我不知道为什么要使用此代码,但现在当我单击 "File" 时会显示子菜单。
对此行为有任何解释吗?
您的代码没有任何问题。它适用于我的系统。但是,设计 "sort of" 不正确。
mFile
应该是常规菜单。之后的任何 sub-menus 也是常规菜单,除非它们本身是父菜单..
示例:
#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:
#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;
所以,我弄清楚了导致下拉菜单在单击时不显示的原因。老实说,有点尴尬,但我将扩展 window 样式设置为 WS_EX_NOACTIVATION
。如果将其替换为其他任何内容,则会显示菜单。