求助:如何在程序运行时动态创建菜单并添加处理事件? 如何在程序运行时动态创建菜单并添加处理事件,并能不能与某个类中的一个函数关联起来(通过预先定义菜单资源或不通过预先定义菜单资源)?在程序运行时如何实现像在VC中添加外部工具并在添加一菜单项,当点击这菜单项就运行这一程序? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我的处理方法如下:1、在资源(Resource.h)中定义一系列数字相连的ID。如第一个ID为ID_MENU0,数值为8000,最后一个为ID_MENU20,数值为8020;2、在你需要动态添加菜单的函数中,增加如下语句以增加菜单项: CMenu *pMenu = pMainFrame->GetMenu(); pMenu = pMenu->GetSubMenu(iMainMenuIndex);//iMainMenuIndex是你要添加菜单项放在主菜单的哪个子菜单下,当然,放到其他菜单下也可以,看自己怎么处理; pMenu->AppendMenu(MF_STRING, ID_MENU0 + iIndex, "相应菜单项显示名称"); pMenu->Detach();3、在CMainFrame类的.h文件的消息定义块(//{{AFX_MSG(CMainFrame))的“外面”定义一个菜单范围消息响应函数,如: afx_msg void OnDealWithMenus();4、在CMainFrame类的.cpp文件的消息映射块(//{{AFX_MSG_MAP(CMainFrame))的“外面”(END_MESSAGE_MAP()语句之前)将前面多定义的所有ID都映射到前面定义的函数中: ON_COMMAND_RANGE(ID_MENU0, ID_MENU20, OnDealWithMenus)5、增加CMainFrame类的消息WM_MENUSELECT响应函数OnMenuSelect(),并添加如下语句:void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) { // TODO: Add your message handler code here if((nFlags | MF_MOUSESELECT) == nFlags && nFlags != 65535) m_lCurSelMenuID = nItemID;//获取被单击菜单的ID号;m_lCurSelMenuID是一个类成员long型变量; CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);}这样就获取了当前被选择的菜单的ID号,便于后续处理;6、手动在CMainFrame类的.cpp函数中增加OnDealWithMenus()函数的函数体:void CMainFrame::OnDealWithMenus() { //当系列菜单被单击时,都响应这个函数,获取被单击的菜单项的名称,然后处理; CMenu *pMenu = GetMenu(); pMenu = pMenu->GetSubMenu(iMainMenuIndex);//iMainMenuIndex和前面添加处对应; CString sClickMenuItemName; pMenu->GetMenuString(m_lCurSelMenuID, sClickMenuItemName, MF_BYCOMMAND);//sClickMenuItemName是当前选择菜单的名称; pMenu->Detach();//有了菜单项名称,就可以在这里做对应的处理了;}看上去比较复杂,但是如果比较熟悉MFC编程,还是比较容易的。这种方法比较灵活,基本上能够处理任何动态添加的菜单和消息处理,如果你觉得合适,能解决你的问题的话,建议提交成FAQ,以便更多人使用 先什么都弄好,不显示。到显示的时候用SetMenu() WTL 透明CStatic的问题 回车字符的处理 关于串口编程基础请教 我的是属性页,修改这个属性页母页的背景 初学者:有一源代码,学习时产生的基础问题请解答。 编译时遇到很多warning C4786,请问如何处理啊? 以前用vb,现在。。。 vc DrawText 文字旋转 关于VK_1的问题. 程序莫名出现同名cpp文件 如何实现在不同时刻让按钮(button)显示不同的图象(bitmap) 视频压缩求助,经h.263压缩后每帧还有230K.
1、在资源(Resource.h)中定义一系列数字相连的ID。如第一个ID为ID_MENU0,数值为8000,最后一个为ID_MENU20,数值为8020;2、在你需要动态添加菜单的函数中,增加如下语句以增加菜单项:
CMenu *pMenu = pMainFrame->GetMenu();
pMenu = pMenu->GetSubMenu(iMainMenuIndex);//iMainMenuIndex是你要添加菜单项放在主菜单的哪个子菜单下,当然,放到其他菜单下也可以,看自己怎么处理;
pMenu->AppendMenu(MF_STRING, ID_MENU0 + iIndex, "相应菜单项显示名称");
pMenu->Detach();3、在CMainFrame类的.h文件的消息定义块(//{{AFX_MSG(CMainFrame))的“外面”定义一个菜单范围消息响应函数,如:
afx_msg void OnDealWithMenus();4、在CMainFrame类的.cpp文件的消息映射块(//{{AFX_MSG_MAP(CMainFrame))的“外面”(END_MESSAGE_MAP()语句之前)将前面多定义的所有ID都映射到前面定义的函数中:
ON_COMMAND_RANGE(ID_MENU0, ID_MENU20, OnDealWithMenus)5、增加CMainFrame类的消息WM_MENUSELECT响应函数OnMenuSelect(),并添加如下语句:
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
// TODO: Add your message handler code here
if((nFlags | MF_MOUSESELECT) == nFlags && nFlags != 65535)
m_lCurSelMenuID = nItemID;//获取被单击菜单的ID号;m_lCurSelMenuID是一个类成员long型变量;
CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
}
这样就获取了当前被选择的菜单的ID号,便于后续处理;6、手动在CMainFrame类的.cpp函数中增加OnDealWithMenus()函数的函数体:
void CMainFrame::OnDealWithMenus()
{
//当系列菜单被单击时,都响应这个函数,获取被单击的菜单项的名称,然后处理;
CMenu *pMenu = GetMenu();
pMenu = pMenu->GetSubMenu(iMainMenuIndex);//iMainMenuIndex和前面添加处对应;
CString sClickMenuItemName;
pMenu->GetMenuString(m_lCurSelMenuID, sClickMenuItemName, MF_BYCOMMAND);//sClickMenuItemName是当前选择菜单的名称;
pMenu->Detach();//有了菜单项名称,就可以在这里做对应的处理了;
}看上去比较复杂,但是如果比较熟悉MFC编程,还是比较容易的。这种方法比较灵活,基本上能够处理任何动态添加的菜单和消息处理,如果你觉得合适,能解决你的问题的话,建议提交成FAQ,以便更多人使用
SetMenu()