目前我正在尝试为我的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);
我不知道它为什么使用这段代码,但现在当我点击"文件"时子菜单出现了。
这个行为有什么解释吗?
答案 0 :(得分:0)
您的代码没有任何问题。它适用于我的系统。但是,设计“有点”不正确。
mFile
应该是常规菜单。之后的任何子菜单也是常规菜单,除非它们本身就是父菜单..
示例:
#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;
答案 1 :(得分:0)
所以,我想出了当我点击它时导致下拉菜单不显示的原因。说实话,有点尴尬,但我将扩展窗口样式设置为WS_EX_NOACTIVATION
。如果您将其替换为任何其他菜单,则会显示菜单。