需求描述:
从键盘输入“姓名 电话”格式的电话信息,按回车结束输入。当是第一次完成输入,则在窗口菜单栏追加一个“PhoneBook”的子菜单,同时将姓名作为PhoneBook的菜单项,点击子菜单就输出这个姓名所对应的电话号码,这里最多支持5个菜单项。
第一步:
创建一个MFC单文档功能,我这里去的工程名是Menu2。
第二步:
以下是AppendMenu的函数声明,从MSDN可以得到函数的用法,这里nFlag设置为MF_STRING, 则我们需要预先给定子菜单的ID号,lpszNewItem是子菜单的名字;当nFlags设置为MF_POPUP时,nIDNewItem是菜单对象的句柄。
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );在Resource.h中添加5个ID号,ID设置如下:
#define IDM_PHONE1 32771 #define IDM_PHONE2 32772 #define IDM_PHONE3 32773 #define IDM_PHONE4 32774 #define IDM_PHONE5 32775
第三步:
在视类中添加消息响应原型、消息映射宏、消息响应代码。
//消息响应原型 afx_msg void OnPhone1(); afx_msg void OnPhone2(); ... BEGIN_MESSAGE_MAP(CMenu2View, CView) ... //菜单命令消息映射 ON_COMMAND(IDM_PHONE1, &OnPhone1) ON_COMMAND(IDM_PHONE2, &OnPhone2) END_MESSAGE_MAP() //消息响应内容 void CMenu2View::OnPhone1() { CClientDC dc(this); dc.TextOut(0,0,m_arrPhoneBook.GetAt(0)); } void CMenu2View::OnPhone2() { CClientDC dc(this); dc.TextOut(0,0,m_arrPhoneBook.GetAt(1)); }第四步:
WM_CHAR消息捕获、 子菜单创建、菜单添加,具体代码如下:
void CMenu2View::OnChar(UINT nChar, UINT nRepCnt,UINT nFlags) { CClientDC dc(this); //回车符 if (0x0d == nChar) { //创建子菜单 if (0 == m_nIndex) { m_Menu.CreatePopupMenu(); CMenu *pMenu = GetParent()->GetMenu(); //子菜单是POPUP类型 pMenu->AppendMenu(MF_POPUP,(UINT_PTR)m_Menu.m_hMenu,"PhoneBook"); //框架类的菜单栏重绘 GetParent()->DrawMenuBar(); } //添加子菜单 m_Menu.AppendMenu(MF_STRING,IDM_PHONE1 + m_nIndex, m_strText.Left(m_strText.Find(' '))); //保存电话信息 m_arrPhoneBook.Add(m_strText); //清空当前字符输入 m_strText.Empty(); m_nIndex++; //使客户区失效,并背景重绘 Invalidate(TRUE); } else { //显示当前输入内容 m_strText += (unsigned char)nChar; dc.TextOut(0,0, m_strText); } CView::OnChar(nChar, nRepCnt, nFlags); }运行效果: