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的菜单
posted on 2010-08-05 23:59  icove  阅读(498)  评论(0编辑  收藏  举报