MFC中的菜单操作

1生成复选标记菜单项

第一步:获取Menu

第二步:获取所在子菜单

第三步:对相应的菜单项加标记

如下:在框架类的构造函数里面写如下代码:

  GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED);

2设置缺省菜单项(菜单成黑体加粗,且只能有一个):

第一步:获取Menu


第二步:获取所在子菜单


第三步:对相应的菜单项进行缺省操作

如下:在框架类的构造函数里面写如下代码:

  GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);//True表示按“位置索引”//此时一定要注意(分割栏也占一个位置)

或者GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN,FALSE);//False表示按ID表示索引

3图像标记菜单项

  GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);

  结果没有显示出图形,原因是图像太大!先获取系统的信息GetSystemMetrics获取系统度量(获取默认图像标记的宽和高)

  GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK); 

4将菜单设置不能使用 (比较特殊)

  GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED);
  仅仅使用此函数是不行的,还需要在CMainFram类中加入一成员变量m_bAutoMenuEnable=FALSE;才成功。

  将上述不能使用的菜单项设置成灰色状态。


5将菜单加载和取消操作CWnd::SetMenu()函数

  SetMenu(NULL);

  CMenu menu;

  menu.LoadMenu(IDR_MAINFRAME);

  SetMenu(&menu);

此时可以看到,此时的菜单是局部对象,会出现异常。此时进行动态生成

  SetMenu(NULL);

  CMenu menu;


  menu.LoadMenu(IDR_MAINFRAME);


  SetMenu(&menu;

  menu.Detach();//此时临时变量并不在其生命周期结束时析构,而是在窗体析构时析构。

6类CCmdUI:主要是让设置菜单项可用不可。(让新建菜单项不可用,此时成灰色状态)

  让ID_FILE_NEW响应UPDATE_COMMAND_UI()

void CMainFrame::OnUpdateFileNew(CCmdUI* pCmdUI)

{

  pCmdUI->Enable(FALSE);

}

结果是:菜单项“新建”成灰色且不可用;

7如何让工具栏图标和菜单项关联起来:让他们用相同的ID就可以。

8:右键弹出菜单

VC6.0以及有集成的组件。project->add to project->components and controls

响应右键单击消息。

在OnRButtonDown()中实现;

首先要转换鼠标在客户区点击点的位置到系统桌面的位置

void CMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
   CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    CMenu *pPopup=menu.GetSubMenu(0);
    ClientToScreen(&point);//
    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);

  CView::OnRButtonDown(nFlags, point);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值