您的位置:首页 > 移动开发

动态创建菜单及菜单项过程介绍

2016-10-16 15:20 323 查看
需求描述:

      从键盘输入“姓名 电话”格式的电话信息,按回车结束输入。当是第一次完成输入,则在窗口菜单栏追加一个“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);
}运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息