MFC:菜单

来源:互联网 发布:天猫数据分析工具 编辑:程序博客网 时间:2024/05/12 04:45
<span style="font-size:18px;"><span style="font-size:18px;"></span>
<span style="font-size:18px;"></span>
<span style="font-size:18px;">对菜单项命令消息进行响应的顺序:View->Doc->CMainFrame->AppCMainFrame将消息路由给View类处理,若没有处理,View类路由给文档类处理,若文档类也没有处理就由文档类经View类交给CMainFrame类,若框架也没处理此消息,就继续路由给App类。1、设置复选标记(菜单项前有对号标记):  //在框架类的OnCreate函数中(框架窗口创建完成后)GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND | MF_CHECKED); //根据菜单ID设置GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED);   //根据菜单位置设置2、设置默认菜单项(粗体显示):GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE); //根据索引设置GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN); //根据命令ID设置,默认FALSE//注:按照索引设置时,分隔栏也算一个菜单项;一个菜单中只能有一个缺省菜单项3、设置图形标记菜单:  //SetMenuItemBitmaps/*CString str;  str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK)); //13,13  //位图太大显示会出问题  MessageBox(str); */m_bitmap.LoadBitmap(IDB_BITMAP1); //注意定义成成员变量GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);4、设置菜单项不可使用:  //EnableMenuItemGetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);在CMainFrame的构造函数中将m_bAutoMenuEnable = FALSE; //不使用MFC的命令更新机制5、动态的更换一个菜单:SetMenu(NULL); //菜单消失CMenu menu;menu.LoadMenu(IDR_MAINFRAME);SetMenu(&menu);  //设置新的菜单menu.Detach();  //将菜单句柄和C++对象的联系断开,否则就要把menu设置为成员变量6、设置菜单项是否可以使用:选中菜单项,Alt+F7,选择UPDATE_COMMAND_UI消息,添加消息响应函数。void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI) {if(pCmdUI->m_nIndex == 2) //此时工具栏上的按钮不能和菜单项的状态一致,因为索引不一样pCmdUI->Enable(); //看看CCmdUI这个类}//工具栏上的菜单按钮和菜单栏上的菜单项是靠 资源的ID 关联起来的//pCmdUI->m_nID,pCmdUI->m_nIndex:与此菜单项对应的ID,索引。7、右键弹出菜单:法一、利用MFC提供的右键弹出菜单:工程-增加到工程-组件和控件,在Visual C++ Components中选中Pop-up Menu进行添加(到View类中)void CMenuView::OnContextMenu(CWnd*, CPoint point){.....}法二、利用TrackPopupMenu自己创建:1、创建菜单。2、View类添加WM_RBUTTONDOWN消息响应,在函数中编写代码: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,GetParent());CView::OnRButtonDown(nFlags, point);}/************************************************************************************************************/动态添加菜单:  //AppendMenu,CreatePopupMenu,InsertMenuCMenu menu;menu.CreatePopupMenu();//GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"kai");GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,"kai");menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");  //资源视图Resource.h中定义menu.AppendMenu(MF_STRING,112,"yue");menu.AppendMenu(MF_STRING,113,"love");menu.Detach();GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,"Welcome");GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,MF_BYCOMMAND | MF_STRING,115,"home");GetMenu()->DeleteMenu(1,MF_BYPOSITION);GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);给菜单项添加消息响应:1、afx_msg void OnHello();  //定义消息响应函数2、ON_COMMAND(IDM_HELLO,OnHello)   //消息映射3、void CMainFrame::OnHello(){     //消息响应函数的实现MessageBox("Hello!");}/////////////////////////////////////////////////////WM_CHAR消息利用菜单项添加电话本功能:void CMenu2View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);if(0x0d==nChar) //回车{if(0==++m_nIndex) //第一次回车添加一个弹出菜单,以后仅添加菜单项{m_menu.CreatePopupMenu();GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu,"PhoneBook");GetParent()->DrawMenuBar();  //让菜单栏进行重绘}m_menu.AppendMenu(MF_STRING,IDM_PHONE1+m_nIndex,m_strLine.Left(m_strLine.Find(' ')));m_strArray.Add(m_strLine);m_strLine.Empty(); //回车后将字符串清空Invalidate();  //将先前输入的擦除掉,重绘}else //若输入的不是回车,就输出字符{m_strLine+=nChar;dc.TextOut(0,0,m_strLine);}CView::OnChar(nChar, nRepCnt, nFlags);}#define IDM_PHONE1201#define IDM_PHONE2202#define IDM_PHONE3203afx_msg void OnPhone1();afx_msg void OnPhone2();afx_msg void OnPhone3();ON_COMMAND(IDM_PHONE1, OnPhone1)ON_COMMAND(IDM_PHONE2, OnPhone2)ON_COMMAND(IDM_PHONE3, OnPhone3)void CMenu2View::OnPhone1() {CClientDC dc(this);dc.TextOut(0,0,m_strArray.GetAt(0));}void CMenu2View::OnPhone2() {CClientDC dc(this);dc.TextOut(0,0,m_strArray.GetAt(1));}void CMenu2View::OnPhone3() {CClientDC dc(this);dc.TextOut(0,0,m_strArray.GetAt(2));}......//下面代码纯属脑残,//框架类会将消息向下路由,so, 你得截获丫,别TM二笔把消息送给别人(截获了你养胃也没法用):BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam){      //添加OnCommand虚函数int MenuCmdId=LOWORD(wParam);  //标识了菜单项的命令IDCMenu2View *pView=(CMenu2View*)GetActiveView(); //和CMainFrame相关联的View类if(MenuCmdId >= IDM_PHONE1 && MenuCmdId < IDM_PHONE1+pView->m_strArray.GetSize()){CClientDC dc(pView);dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));return TRUE;}return CFrameWnd::OnCommand(wParam, lParam);}</span></span>


0 0
原创粉丝点击