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

需求描述:

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



转载于:https://www.cnblogs.com/jinxiang1224/p/8468374.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值