带有编程构造菜单的CMFCMenuButton

CMFCMenuButton with a programmatically constructed menu?

本文关键字:菜单 CMFCMenuButton 编程      更新时间:2023-10-16

我是CMFCMenuButton控件的新手;以下是我在OnInitDialog()中的代码:

// Load application list into menu button
m_ApplicationMenu = CreateMenu();   
m_MenuInfoSize = 2;
m_MenuInfo = new MENUITEMINFO[m_MenuInfoSize];
memset(m_MenuInfo, 0, sizeof(MENUITEMINFO) * m_MenuInfoSize);
UINT menuIndex = 0;
BOOL b; 
// 1st menu item
memset(m_MenuInfo + menuIndex, 0, sizeof(MENUITEMINFO));
m_MenuInfo[menuIndex].cbSize = sizeof(MENUITEMINFO);
m_MenuInfo[menuIndex].fMask = MIIM_ID | MIIM_STRING | MIIM_DATA;
m_MenuInfo[menuIndex].wID = menuIndex;
m_MenuInfo[menuIndex].dwTypeData = new WCHAR[10]; 
swprintf_s(m_MenuInfo[menuIndex].dwTypeData, 10, L"%s", L"A1");
m_MenuInfo[menuIndex].cch = wcslen(m_MenuInfo[menuIndex].dwTypeData) + 1;
b = InsertMenuItem(m_ApplicationMenu, menuIndex, TRUE, &(m_MenuInfo[menuIndex]));
menuIndex++;
// 2nd menu item
memset(&m_MenuInfo[menuIndex], 0, sizeof(MENUITEMINFO));
m_MenuInfo[menuIndex].cbSize = sizeof(MENUITEMINFO);
m_MenuInfo[menuIndex].fMask = MIIM_ID | MIIM_STRING | MIIM_DATA;
m_MenuInfo[menuIndex].wID = menuIndex;
m_MenuInfo[menuIndex].dwTypeData = new WCHAR[10]; 
swprintf_s(m_MenuInfo[menuIndex].dwTypeData, 10, L"%s", L"B2");
m_MenuInfo[menuIndex].cch = wcslen(m_MenuInfo[menuIndex].dwTypeData) + 1;
b = InsertMenuItem(m_ApplicationMenu, menuIndex, TRUE,  &(m_MenuInfo[menuIndex]));
menuIndex++;
// Attach menu to CMFCMenuButton
m_ApplicationList.m_bOSMenu = TRUE;
m_ApplicationList.m_bRightArrow = FALSE;
m_ApplicationList.m_bStayPressed = TRUE;
m_ApplicationList.m_bDefaultClick = FALSE;
m_ApplicationList.m_hMenu = m_ApplicationMenu;
    // Testing the constructed menu with the dialog's menu bar
::SetMenu(this->m_hWnd, m_ApplicationMenu);

当我运行应用程序时,当我点击它时,CMFCMenuButton显示了一个下拉菜单…但这两个条目是空的,没有文本和图像。

我添加了最后一行来测试我构建的菜单;这两个项目正确地显示在菜单栏上。

我还尝试使用从资源编辑器创建的菜单。菜单栏显示正常,但在CMFCMenuButton中,又出现了空白。

我错过了什么?

Try

m_ApplicationMenu = CreatePopupMenu();

另外,如果你想在单击事件中获得CMFCMenuButtonm_nMenuResult,你最好使用1作为第一个menuIndex。因为:

CMFCMenuButton::m_nMenuResult

一个整数,指示用户从弹出式菜单中选择哪个项。

如果用户取消菜单,则此成员变量的值为零