首页 > 代码库 > MFC动态菜单

MFC动态菜单

1.Cmenu3View 键盘获取函数解析

 1 void CMenu3View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  2 { 4         CClientDC dc(this);//获取的是view句柄 5         if(0x0d==nChar)//如果检测到回车键进行一下操作 6         { 7              if(0==++m_nIndex)//初始值为-1,说明是第一次回车 8              {  9                  m_menu.CreatePopupMenu();//建立菜单10              GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu/*进行强制转换*/,"PhoneBook");//窗口尺寸变了,才出来,是什么情况?11              GetParent()->DrawMenuBar();//调用父类进行菜单栏重会12              }13              m_menu.AppendMenu(MF_STRING,IDM_PHONE1+m_nIndex/*这里是亮点*/,m_strLine.Left(m_strLine.Find(" ")));14              m_strArray.Add(m_strLine);15               m_strLine.Empty();//按回车清空16              17               Invalidate();//窗口重会操作18 19         }20       else21       {22          m_strLine+=(char)nChar;23          dc.TextOut(0,0,m_strLine);24       }25 26     CView::OnChar(nChar, nRepCnt, nFlags);27 }

2.进行代码创建菜单的技巧
第一步:在资源选项中添加abc 添加子菜单,设置其ID名
第二步:在resource.h中添加 ID名和ID号
第三步:添加各自的命令窗口函数,并删除
第四步:oncommand映射中必须要放出来,因为已经删除,不能放在系统自定义区域

 1 BEGIN_MESSAGE_MAP(CMenu3View, CView) 2 //{{AFX_MSG_MAP(CMenu3View) 3 ON_WM_CHAR() 4 ON_WM_CANCELMODE() 5  6 //}}AFX_MSG_MAP 7 // Standard printing commands 8 ON_COMMAND(IDM_PHONE1, OnPhone1) 9 ON_COMMAND(IDM_PHONE2, OnPhone2)10 ON_COMMAND(IDM_PHONE3, OnPhone3)11 ON_COMMAND(IDM_PHONE4, OnPhone4)12 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)13 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)14 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)15 END_MESSAGE_MAP()

 

3.了解消息机制oncommand可以提前获知消息

 1 BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)  2 { 3 int MenuCmdId=LOWORD(wParam);//通过LOWORD获取低位 4 CMenu3View *pView=(CMenu3View *)GetActiveView();//这是View类在CMainFrame中的调用,通过创建一个具体的对象来实现,需要包含头文件 5 //GetActiveView()是调取CMainFrame相关的类 6 if(MenuCmdId>=IDM_PHONE1 && MenuCmdId<IDM_PHONE1+pView->m_strArray.GetSize()) 7 { 8 // MessageBox("Test"); 9 CClientDC dc(pView);//因为字符数组在view类,所以dc(pView)10 dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));//m_strArray是public11 return TRUE;//返回TRUE就不再执行View操作12 }13 14 return CFrameWnd::OnCommand(wParam, lParam);15 }

 

MFC动态菜单