MFC中菜单的一些操作

移除和装载菜单
在程序中,如果想要移除一个菜单的话,可以利用CWnd类提供的SetMenu成员函数来实现,该函数的声明形式为:BOOL SetMenu(CMenu *pMenu);
只要将此函数的参数设为NULL就可以将菜单移除了,例如可以在CMainFrame类的OnCreate函数添加SetMenu函数的调用。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ......
    GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);//此为将第一子菜单中的第二菜单项设置为灰色不可用状态
    SetMenu(NULL);//此为将菜单移除
    return 0;
}
如果想再显示出来就必须重新加载菜单资源,在CMainFrame类中加入私有成员变量CMenu menu;并在OnCreate函数中加入如下代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ......
    menu.LoadMenu(IDR_MAINFRAME);
    SetMenu(&menu);
    return 0;
}
 
创建快捷菜单(右键菜单)  在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)
{
      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函数是用来显示快捷菜单的,我们可以自己手动建立自己的快捷菜单。
1.为Menu程序增加一个新的菜单资源。可以在ResourceView选项卡上的Menu分支上单击鼠标右键,从弹出的菜单中选择【Insert Menu】菜单命令,在Menu分支下就多了一个名为IDR_MENU1的菜单资源,并同时在VC++开发界面窗口的右边窗口中打开了这个菜单资源。接着就要为这个菜单资源添加菜单项了。
2.给CMenuView类添加WM_RBUTTONDOWN消息响应函数。参照刚才系统自动添加的OnContextMenu函数编写代码如下:
void CMenuView::OnRButtonDown(UINT nFlags,CPoint point)
{
      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);
}
 
动态菜单操作
 
首先介绍函数AppendMenu,它是CMenu类提供的一个成员函数,作用是把一个新菜单项目添加到一个指定菜单项目的末尾。
BOOL AppendMenu(UINT nFlags,UINT_PTR nIDNewItem = 0,LPCTSTR lpszNewItem = NULL);
为了添加菜单,首先需要创建一个菜单对象,这可以利用CMenu类提供的另一个成员函数CreatePopupMenu来实现,其作用是创建一个弹出菜单,然后将其与一个CMenu对象相关联起来。在本例中也在程序的CMainFrame类的OnCreate函数中实现动态添加菜单这一功能。代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    .......
    CMenu menu;
    menu.CreateMenu();
    GetMenu()->AppendMenu(MF_POPUP, (UINT)menu.m_hMenu,"Text");
    menu.Detach();
    return 0;
}
若想在两个菜单项之间插入一个新的菜单项则调用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);可以用来删除一个菜单项目。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值