1菜单与菜单项的操作
//获取菜单指针----CWnd::GetMenu() //GetSubMenu()获取子菜单 /CheckMenuItem()加入/取消标记 GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MFS_CHECKED); //创建缺省菜单SetDefaultItem()一个子菜单仅仅能有一个 //GetMenu()->GetSubMenu(0)->SetDefaultItem(1,1); GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN); //图形菜单的创建SetMenuItemBitmaps() m_Bitmap.LoadBitmapW(IDB_BITMAP1); GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_Bitmap,&m_Bitmap); //使某项不能使用EnableMenuItem() //NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION|MF_DISABLED|MF_GRAYED); //将整个菜单取消SetMenu()能够载入自己的菜单,若将Cmenu为局部变量则在setmenu后调用detach() //SetMenu(NULL);
2MFC菜单项的更新
(1)为菜单某一项加入ON_UPDATE_COMMAND_UI消息并加入处理程式(在CMainframe类中)
(2)在处理程式中决定某一菜单项是否可用是否标记等(若涉及到工具栏中的菜单项则为保持与菜单项中的同步最好採用ID标记而不是位置)
(3)实例:void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI)
{ // TODO: 在此加入命令更新用户界面处理程序代码pCmdUI->Enable(); }
3右击弹出菜单的使用
加入方法例如以下:
1、在资源视图中加入所需的右键菜单 2、选择对应的类,单文档时选中View类在属性中加入WM_CONTEXTMENU消息 3、在OnContextMenu加入例如以下代码4动态加入菜单
在CMainframe::OnCreate()函数中
(1)CMenu::AppendMenu()将一个菜单项加入到现有菜单项末尾
(2)创建popup菜单CMmenu::CreatePopMenu();
(3)插入PopUpMenu菜单CMenu::InsertMenu()
(4)删除菜单CMenu::DeleteMenu()
(5)代码演示样例:
(6)对加入的菜单进行命令响应
手动加入消息响应函数和消息映射
(7)其它操作
void CMenuView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 在此加入消息处理程序代码和/或调用默认值static int indexm=313;CClientDC dc(this);//获取客户区画布if(0x0d==nChar){ if(0==index++){ m_Menu.CreatePopupMenu();GetParent()->GetMenu()->AppendMenuW(MF_POPUP,(UINT)m_Menu.m_hMenu,_T("phonenote"));//重绘菜单条CWnd::DrawMenuBar()GetParent()->DrawMenuBar();//重绘菜单}m_Menu.AppendMenuW(MF_STRING,indexm++,m_PStr.Left(m_PStr.Find(' ')));m_PStr.Empty();Invalidate();//重绘画布}else{ m_PStr+=(char)nChar;dc.TextOutW(0,0,m_PStr);}CView::OnChar(nChar, nRepCnt, nFlags); }