移除和装载菜单
......
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);//此为将第一子菜单中的第二菜单项设置为灰色不可用状态
SetMenu(NULL);//此为将菜单移除
return 0;
......
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
return 0;
if(point.x == -1 && point.y==-1){
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5,5);
}
CMenu menu;
VERIFY(menu.LoadMenu(CG_IDR_POPUP_MENU_VIEW));
CMenu * pPopup = menu.GetSubMenu(0);
ASSERT(pPopup !=NULL);
CWnd * pWndPopupOwner = this;
while(pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALING | TPM_RIGHTBUTTON,point.x,point.y,pWndPopupOwner);
其中 TrackPopupMenu函数是用来显示快捷菜单的,我们可以自己手动建立自己的快捷菜单。
CMenu menu;//首先定义一个CMenu对象
menu.LoadMenu(IDR_MENU1);//加载(LoadMenu函数)菜单资源
CMenu * pPopup = menu.GetSubMenu(0);
ClientToScreen(&point);//此句为将客户区坐标转换为屏幕坐标
pPopup->TrackPopupMenu(TPM_LEFTALIGH | TPM_RIGHTBUTTON,point.x,point.y,this);//显示快捷菜单
CView::OnRButtonDown(nFlags,point);
.......
CMenu menu;
menu.CreateMenu();
GetMenu()->AppendMenu(MF_POPUP, (UINT)menu.m_hMenu,"Text");
menu.Detach();
return 0;
在程序中,如果想要移除一个菜单的话,可以利用CWnd类提供的SetMenu成员函数来实现,该函数的声明形式为:BOOL SetMenu(CMenu *pMenu);
只要将此函数的参数设为NULL就可以将菜单移除了,例如可以在CMainFrame类的OnCreate函数添加SetMenu函数的调用。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
}
如果想再显示出来就必须重新加载菜单资源,在CMainFrame类中加入私有成员变量CMenu menu;并在OnCreate函数中加入如下代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
}
创建快捷菜单(右键菜单)
在VC++开发界面中选择【Project】菜单下的【Add To Project】,然后从它的下拉菜单中选择【Components and Controls...】菜单项。再添加即可。其实在Menu这个工程中可以看到,在插入了Pop_up Menu组件后,添加了以下两处内容:
第一处,在Resource View选项卡的Menu分支下多了一个标识为CG_IDR_POPUP_MENU_VIEW的菜单资源,这个菜单只有一个顶层菜单项:_POPUP_,
第二处,为CMenuView类添加了一个函数:OnContextMenu。在Menu程序运行时,当用鼠标右键单击窗口时,程序就会调用这个函数。
void CMenuView::OnContextMenu(CWnd*,CPoint point)
{
}
1.为Menu程序增加一个新的菜单资源。可以在ResourceView选项卡上的Menu分支上单击鼠标右键,从弹出的菜单中选择【Insert Menu】菜单命令,在Menu分支下就多了一个名为IDR_MENU1的菜单资源,并同时在VC++开发界面窗口的右边窗口中打开了这个菜单资源。接着就要为这个菜单资源添加菜单项了。
2.给CMenuView类添加WM_RBUTTONDOWN消息响应函数。参照刚才系统自动添加的OnContextMenu函数编写代码如下:
void CMenuView::OnRButtonDown(UINT nFlags,CPoint point)
{
}
动态菜单操作
首先介绍函数AppendMenu,它是CMenu类提供的一个成员函数,作用是把一个新菜单项目添加到一个指定菜单项目的末尾。
BOOL AppendMenu(UINT nFlags,UINT_PTR nIDNewItem = 0,LPCTSTR lpszNewItem = NULL);
为了添加菜单,首先需要创建一个菜单对象,这可以利用CMenu类提供的另一个成员函数CreatePopupMenu来实现,其作用是创建一个弹出菜单,然后将其与一个CMenu对象相关联起来。在本例中也在程序的CMainFrame类的OnCreate函数中实现动态添加菜单这一功能。代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
}
若想在两个菜单项之间插入一个新的菜单项则调用InsertMenu()函数
BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT_PTR nIDNewItem =0,LPCTSTR lpszNewItem = NULL);
例:GetMenu()->InsertMenu(2,MF_POPUP | MF_BYOPSITION,(UINT)menu,m_hMenu,"Test");
menu.AppendMenu(MF_STRING,111,"Hello");
menu.Detach();
GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,"Welcome");
BOOL DeleteMenu(UINT nPosition,UINT nFlags);可以用来删除一个菜单项目。