1、MFC菜单的更新机制
为菜单添加UPDATE_COMMAND_UI消息响应函数后,当显示菜单时,系统发出WM_INITMENUPOPUP消息,然后由程序窗体的基类入CFrameWnd接管并创建一个CCmdUI对象,并与程序的第一个菜单项相关联,调用该对象的一个成员函数DoUpdate()。DoUpdate()发出CN_UPDATE_COMMAND_UI消息,该消息中带有一个CCmdUI对象的指针,这时系统会判断是否存在一个ON_UPDATE_COMMAND_UI宏去捕捉这个菜单项消息。存在的话就会调用相应的消息响应函数处理。当更新完第一个菜单项后,同一个CCmdUI对象就设置为与第二个菜单项相关联,依次顺序进行,直到完成所有菜单项的处理。这既是MFC的菜单更新机制。
利用UPDATE_COMMAND_UI消息响应函数中CCmdUI对象,我们可以对菜单进行 可用或禁用、设置标记菜单、设置菜单项文本等操作。
2、右键菜单
代码如下:
void CMFCTestView::OnRButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CMenu menu; menu.LoadMenu(IDR_MAINFRAME); CMenu *pPopMenu = menu.GetSubMenu(0); ClientToScreen(&point); pPopMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,this); CView::OnRButtonUp(nFlags, point); }
上述代码在视类右键弹起消息响应函数中加载已经做好的菜单,并显示出来。这样就达到了右键菜单的目的。
3、动态添加、插入菜单项
CMenu menu; //创建一个菜单 menu.CreateMenu(); //在现有菜单后添加一个弹出菜单ADDMENU1 GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,TEXT("ADDMENU1")); CMenu menu1; //创建一个菜单 menu1.CreateMenu(); //在现有菜单中位置2上插入一个菜单INSERTMENU1 GetMenu()->InsertMenu(2,MF_POPUP | MF_BYPOSITION,(UINT)menu1.m_hMenu,TEXT("INSERTMENU1")); //在菜单ADDMENU1 增加一个菜单项 menu.AppendMenu(MF_STRING | MF_POPUP,555,TEXT("HELLO")); //在HELLO菜单项创建子菜单! CMenu menu2; menu2.CreateMenu(); menu2.AppendMenu(MF_STRING,666,TEXT("WORLD")); menu.AppendMenu(MF_BYPOSITION|MF_POPUP|MF_STRING,(UINT)menu2.m_hMenu,TEXT("子菜单")); //端口CMenu对象与菜单句柄的联系。 menu.Detach(); menu1.Detach(); menu2.Detach();
4、删除菜单
通过DeleteMenu函数删除菜单!
DeleteMenu(2,MF_BYPOSITION)//删除位置2的菜单